Update user metadata
const url = 'https://api.torii.so/api/server/v1/users/01931a73-8b00-7000-8000-000000000000/metadata';const options = { method: 'PATCH', headers: {'Content-Type': 'application/json'}, body: '{"publicMetadata":{"plan":"pro"},"privateMetadata":{"stripeId":"cus_123"},"unsafeMetadata":{"onboardingStep":2}}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request PATCH \ --url https://api.torii.so/api/server/v1/users/01931a73-8b00-7000-8000-000000000000/metadata \ --header 'Content-Type: application/json' \ --data '{ "publicMetadata": { "plan": "pro" }, "privateMetadata": { "stripeId": "cus_123" }, "unsafeMetadata": { "onboardingStep": 2 } }'Deep-merges into any of the three metadata bags. Each bag is tri-state: omit the key to leave the bag unchanged, or send an object to deep-merge into the existing bag (a key set to null removes it). The merged result is capped at 512 bytes for publicMetadata/unsafeMetadata and 4096 bytes for privateMetadata.
Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters ”Identifier of the user to update.
Example
01931a73-8b00-7000-8000-000000000000Request Body required
Section titled “Request Body required ”PATCH body for a user’s metadata bags. Each bag is tri-state: omit to leave it unchanged, or send an object value. Whether the object merges into or replaces the bag depends on the endpoint (see its operation description).
object
Public metadata bag: SDK-readable, server-written. Max 512 bytes.
object
Example
{ "plan": "pro"}Private metadata bag: server-only, never exposed to the SDK or in a JWT. Max 4096 bytes.
object
Example
{ "stripeId": "cus_123"}Unsafe metadata bag: readable and writable by the end-user via the SDK. Max 512 bytes.
object
Example
{ "onboardingStep": 2}Responses
Section titled “ Responses ”The updated user.
An end-user, including server-only private metadata. Returned only on the secret-key backend API.
object
Unique identifier for this user.
Identifier of the environment this user belongs to.
Full name on the profile, if any.
First (given) name on the profile, if any.
Last (family) name on the profile, if any.
Preferred locale for emails and UI messages.
Lifecycle status of the user (e.g. active, banned).
When this user was created (ISO-8601 UTC).
When this user was last modified (ISO-8601 UTC).
Primary email on the profile, if any.
When this user’s primary email was verified, if it has been verified.
When this user was deleted, if soft-deleted. Null for active users.
Public metadata: readable by the SDK, writable only server-side.
object
Private metadata: server-only. Never exposed to the SDK or in a JWT.
object
Unsafe metadata: readable and writable by the end-user via the SDK.
object
Example
{ "id": "01931a73-8b00-7000-8000-000000000000", "environmentId": "01931a72-0000-7000-8000-000000000000", "name": "Ada Lovelace", "firstName": "Ada", "lastName": "Lovelace", "locale": "en", "status": "active", "createdAt": "2026-05-16T09:30:00Z", "updatedAt": "2026-05-16T10:00:00Z", "email": "ada@example.com", "emailVerifiedAt": "2026-05-16T09:35:00Z", "deletedAt": "2026-05-20T12:00:00Z", "publicMetadata": { "plan": "pro" }, "privateMetadata": { "stripeId": "cus_123" }, "unsafeMetadata": { "onboardingStep": 2 }}A bag exceeds its size limit.
object
object
Example generated
{ "type": "https://example.com", "title": "example", "status": 1, "detail": "example", "instance": "https://example.com", "properties": { "additionalProperty": "example" }}Missing or invalid secret key.
object
object
Example generated
{ "type": "https://example.com", "title": "example", "status": 1, "detail": "example", "instance": "https://example.com", "properties": { "additionalProperty": "example" }}User belongs to a different environment.
object
object
Example generated
{ "type": "https://example.com", "title": "example", "status": 1, "detail": "example", "instance": "https://example.com", "properties": { "additionalProperty": "example" }}No user with this id.
object
object
Example generated
{ "type": "https://example.com", "title": "example", "status": 1, "detail": "example", "instance": "https://example.com", "properties": { "additionalProperty": "example" }}