Profiles API
Write customer profile records to the Experiture CDP. The Profiles API is a purpose-built wrapper around /records/profiles/upsert with identity-resolution defaults tuned for profile entities.
Base URL: https://api.experiture.ai/public/v1
Authentication: All endpoints require a bearer token with cdp:profiles:write scope. See Authentication.
Overview
| Operation | Endpoint | Mode | Use Case |
|---|---|---|---|
| Upsert profile | POST /profiles/upsert | Synchronous | Update or create a single customer profile. |
For batch writes or other object types, use the Records API.
Upsert a Profile
Insert or update one profile row. Matching uses the workspace's configured identity key (typically email or customer_id) unless you override via matchKey.
POST /profiles/upsert
Authorization: Bearer <token>
Content-Type: application/jsonRequest body
| Field | Type | Required | Description |
|---|---|---|---|
record | object | Yes | Profile payload. Must contain ≥1 property. |
matchKey | string | No | Field to match on (e.g. "email"). Defaults to the object primary key. |
Example request
curl -X POST https://api.experiture.ai/public/v1/profiles/upsert \
-H "Authorization: Bearer <your_access_token>" \
-H "Content-Type: application/json" \
-d '{
"record": {
"email": "jane@example.com",
"first_name": "Jane",
"last_name": "Doe",
"tier": "gold",
"last_order_at": "2026-04-20T12:00:00Z"
},
"matchKey": "email"
}'Response — 200 OK
{
"success": true,
"data": {
"operation": "upsert",
"objectName": "profiles",
"accepted": true,
"acceptedAt": "2026-04-21T15:30:00Z",
"acceptedRecords": 1,
"matchKey": "email"
},
"correlationId": "<uuid>"
}Field Semantics
- Null vs. missing: omit a field to leave it unchanged. Send
nullto clear it. - Timestamps: ISO 8601 with timezone (
2026-04-21T15:30:00Z). The server rejects naive datetimes. - Custom fields: any field that matches the workspace's
profilesschema. Unknown fields fail with422 schema_mismatch.
Use GET /metadata/objects/profiles to inspect the schema before writing.
Errors
| HTTP Status | Code | Meaning |
|---|---|---|
400 | CDP_ETL.VALIDATION.REQUEST_INVALID | Body is malformed or fields fail validation. |
401 | CDP_ETL.AUTH.UNAUTHORIZED | Missing or invalid bearer token. |
403 | CDP_ETL.AUTH.FORBIDDEN | Token lacks write access to profiles. |
422 | CDP_ETL.VALIDATION.SCHEMA_MISMATCH | One or more fields do not exist on the profile object. |
429 | CDP_ETL.RATE.LIMITED | See Rate Limits. |
See Also
- Records API — general-purpose object writes and batch endpoints
- Metadata API — inspect the
profilesschema - Single Write Guide — end-to-end walkthrough