---
cuppy_hub: salesforce
cuppy_path: reference/data360/object-model-and-apis.md
cuppy_section: docs
cuppy_doc: 7NWC-K0F1
cuppy_doc_uuid: b158d000-48fd-4e74-b4bb-365cc0d40ec4
cuppy_permalink: https://cuppy.io/salesforce/d/7NWC-K0F1
cuppy_version: 1
cuppy_updated: 2026-10-23T16:16:52.575Z
cuppy_canonical: https://cuppy.io/salesforce/docs/reference/data360/object-model-and-apis
cuppy_mcp: https://cuppy.io/mcp
cuppy_body_sha256: 950ed143a85dcfff4a51d8d4a7408128aa58bb1764cbd2919df9c4150689ae73
# cuppy_body_sha256 is over the document body ALONE, excluding both generated blocks.
---


# Data 360 object model and APIs

Data Cloud was renamed **Data 360** on October 14, 2025. Metadata types, scratch-org features and many pages still say Data Cloud or CDP.

## The layers

| Layer | Suffix | What it is |
|---|---|---|
| Data stream → **data lake object (DLO)** | `__dll` | Raw ingested rows, one DLO per stream |
| **Data model object (DMO)** | `__dlm` | Harmonised data: DLO fields mapped to the Customer 360 model. Standard DMOs carry `ssot__` in object and field names |
| **Unified DMO** | `__dlm` | The golden record that identity resolution writes, plus a **link** DMO joining each source record to it |
| **Calculated insight object (CIO)** | `__cio` | A SQL-defined metric (lifetime value, last order) per profile or account |
| Search index chunk and index objects | `__dlm` | Created by a search index for retrieval (`reference/data360/search-indexes-and-retrievers.md`) |

## The revenue DMOs

| DMO | API name | Key fields for revenue |
|---|---|---|
| Individual | `ssot__Individual__dlm` | `ssot__Id__c`, names, birth date |
| Contact Point Email / Phone / Address | `ssot__ContactPointEmail__dlm` and so on | Email, phone and address, each linked to the party |
| Account / Account Contact | `ssot__Account__dlm`, `ssot__AccountContact__dlm` | Account name, number, parent, type; contact-to-account link |
| Sales Order | `ssot__SalesOrder__dlm` | `ssot__SoldToCustomerId__c`, `ssot__BillToAccountId__c`, `ssot__GrandTotalAmount__c`, `ssot__PurchaseOrderDate__c`, `ssot__OrderStartDate__c`, `ssot__SalesOrderStatusId__c`, `ssot__CurrencyCode__c` |
| Sales Order Product | `ssot__SalesOrderProduct__dlm` | Line items; many to one with Sales Order |
| Opportunity, Case, Master Product | `ssot__Opportunity__dlm` and so on | Pipeline, service history, catalogue |
| Unified Individual and its link | `UnifiedIndividual__dlm`, `IndividualIdentityLink__dlm` (names in Salesforce's Trailhead SQL) | The golden record and its source links |

**Don't hard-code unified names.** When an org has more than one ruleset, the ruleset ID is appended to the unified and link object names; Salesforce's workshop shows "Unified Individual ccid". List the DMOs and pick them up by name pattern: `GET /services/data/v66.0/ssot/data-model-objects` returns `dataModelObject[]`, and `…/data-model-objects/{name}` returns its `fields[]`.

## Two ways to call Data 360

| | Connect REST API | Tenant APIs |
|---|---|---|
| Base | `https://<My Domain>/services/data/v66.0/ssot/...` | The `instance_url` returned by the token exchange, for example `/api/v1/metadata` |
| Token | The normal Salesforce access token (the CLI's session works) | Exchange it at `https://<My Domain>/services/a360/token` with `grant_type=urn:salesforce:grant-type:external:cdp`, `subject_token=<access token>`, `subject_token_type=urn:ietf:params:oauth:token-type:access_token` and optionally `dataspace=<name>` |
| Scopes | `api`; Data 360 setup operations also need `cdp_api` (per the community plugin's guide) | `cdp_query_api` (SQL), `cdp_profile_api` (profiles), `cdp_ingest_api` (Ingestion API), plus `refresh_token` |
| Use for | Setup and lifecycle (streams, mappings, identity resolution, insights, search indexes, data kits) and SQL through `query-sql` | Ingestion API, Profile API, direct Query API v2 and v3 |

Salesforce calls the Connect REST API "the preferred platform for customers to construct solutions on top of Data 360". The user also needs Data 360 permission sets for the objects it touches.

## Query Connect API

```http
POST /services/data/v66.0/ssot/query-sql?dataspace=default
{ "sql": "SELECT COUNT(*) AS n FROM ssot__SalesOrder__dlm WHERE ssot__PurchaseOrderDate__c >= :since",
  "sqlParameters": [ { "type": "date", "name": "since", "value": "2026-01-01" } ] }
```

- **The response** holds:
  - `returnedRows`;
  - `metadata[]`, with each column's `name`, `type` and `nullable`;
  - `data[][]`;
  - `status`, with `queryId`, `completionStatus`, `rowCount`, `chunkCount`, `progress` and `expirationTime`.
- **Large results:**
  - Poll `GET …/query-sql/{queryId}?waitTimeMs=5000` until finished, then page with `GET …/query-sql/{queryId}/rows?rowLimit=2000&offset=2000&omitSchema=true`.
  - Cancel with `DELETE …/query-sql/{queryId}`.
- **Status values:** Salesforce's post shows `completionStatus` both as `Finished` and as `FINISHED`. Compare case-insensitively.
- **Retention and caching:** results live for 24 hours, and identical queries may be served from cache for 24 hours.
- **Queries read DMOs, DLOs and CIOs by API name.** Quote mixed-case names, as in `"ssot__Individual__dlm"`, if your SQL client lower-cases them.

From TypeScript, `conn.request({ method: "POST", url: "/services/data/v66.0/ssot/query-sql", body })` with an `@salesforce/core` connection is enough. The pipeline guide's code does this: `guides/data360/automate-the-golden-record-pipeline.md`.


---
<!-- cuppy -->
You are reading one file. The same content is free over MCP at https://cuppy.io/mcp with no signup: ranked search across all 376 documents in this hub, the merged view when you work in a layer, known workarounds matched to the error you hit, and depth control so you spend tokens on what you need. Start with the `_hello` tool. How to connect: https://cuppy.io/salesforce/ Something wrong in this document? Report it with the `session feedback` tool on the same endpoint.
<!-- /cuppy -->
