Create a user profile
⚠️
Preview — this feature is being built; the design below is the spec.
POST https://app.syntic.ai/v1/user_profilesCreate a profile for one end user of your product. Pass its id as user_profile_id when you start a session and the agent receives the person’s name, language, time zone and attributes, and its memory tool reads and writes under the profile’s memory scope. Profiles let one agent serve thousands of users without you rebuilding that context on every call.
For how this fits into a full workflow, see User profiles.
Headers
| Header | Required | Value |
|---|---|---|
Authorization | Yes | Bearer <key>: a private inference key (sk_live_...). See Authentication. |
syntic-beta | Yes, while in preview | agents-2026-11-01. Without it the call fails with 400 beta_required. See Versioning. |
Content-Type | Yes | application/json |
Idempotency-Key | No | Up to 255 characters. Retrying with the same key within 24 hours returns the first result instead of acting twice. See Idempotency. |
Body parameters
| Parameter | Type | Required | Notes |
|---|---|---|---|
external_id | string | Yes | 1 to 128 characters. |
display_name | string | No | Up to 120 characters. |
locale | string | No | BCP 47, for example de-DE. |
timezone | string | No | IANA zone, for example Asia/Dubai. |
attributes | object | No | Up to 50 keys; keys up to 64 characters, string values up to 512. |
memory_scope | string | No | Default user:<external_id>. |
Response
201 Created, Content-Type: application/json
{
"id": "uprof_01JCF5H7K9M1P3R5T7V9",
"type": "user_profile",
"external_id": "cust-4821",
"display_name": "Dana Lee",
"locale": "en-GB",
"timezone": "Europe/London",
"attributes": {
"plan": "gold",
"region": "uk-south"
},
"memory_scope": "user:cust-4821",
"session_count": 0,
"created_at": "2026-10-02T09:00:00Z",
"updated_at": "2026-10-02T09:00:00Z"
}| Field | Type | Description |
|---|---|---|
id | string | Starts with uprof_. |
external_id | string | Your own id for the person; unique within the workspace. |
locale | string | BCP 47 tag. The agent is told to answer in this language unless the user writes in another. |
timezone | string | IANA zone. Used for dates in the agent’s context and for deployment schedules that run per user. |
attributes | object | Up to 50 keys, string, number or boolean values. Visible to the agent as facts about the user. |
memory_scope | string | The scope used when agents read or write memories about this person. |
session_count | integer | Sessions started with this profile. |
Examples
curl -sS "https://app.syntic.ai/v1/user_profiles" \
-H "Authorization: Bearer $SYNTIC_API_KEY" \
-H "syntic-beta: agents-2026-11-01" \
-H "Idempotency-Key: 8d6f0c1e-4b2a-4a57-9f0e-2f1d3c4b5a69" \
-H "Content-Type: application/json" \
-d '{
"external_id": "cust-4821",
"display_name": "Dana Lee",
"locale": "en-GB",
"timezone": "Europe/London",
"attributes": {
"plan": "gold",
"region": "uk-south"
}
}'Errors
Errors use the error envelope and carry a request_id. Codes specific to this operation:
| Status | type | code | When |
|---|---|---|---|
| 400 | invalid_request_error | beta_required | The syntic-beta header is missing. |
| 409 | conflict_error | external_id_taken | A profile with this external_id exists; update it instead. |
| 400 | invalid_request_error | invalid_locale | locale or timezone is not a recognised value. |
| 401 | authentication_error | invalid_api_key | The key is missing, unknown, revoked or expired. |
| 429 | rate_limit_error | rate_limited | Too many requests; wait for Retry-After. See Rate-limit headers. |
Was this page helpful?