/users/{userId}Update a user's profileUpdates whitelisted profile fields. The endpoint intentionally does not accept identity-bound fields — email, clerkUserID, and the canonical id are owned by Clerk and cannot be changed through the API. Unknown fields in the body are silently ignored.
Parameters
userIdstring · uuidpathrequiredUser UUID.
Request body
requiredapplication/json
PATCH-style update. Only the listed whitelisted fields are applied; any other field (including `email`, `clerkUserId`, `id`, etc.) is silently ignored.
firstNamestringimageUrlstring · urilastNamestring{
"firstName": "string",
"imageUrl": "https://example.com",
"lastName": "string"
}Responses
Headers
X-RateLimit-LimitThe request cap for the tighter of the per-organization / per-endpoint windows that applied to this request.
X-RateLimit-RemainingRequests remaining in the current window.
X-RateLimit-ResetUnix timestamp (seconds) when the current window resets.
allOf · 2 options
datavaluerequiredThe response payload — shape depends on the endpoint.
metaobjectrequiredPagination metadata — populated on list endpoints, empty on single-resource endpoints.
Show child attributes
cursornull | stringOpaque cursor to pass to the next request.
hasMoreboolean | nullTrue when further pages of results are available.
dataobjectOrganization user. Identity-bound fields (`email`) are readable but not writable via this API — identity is owned upstream. The spec mentions `phone`, but the current user model does not carry one — tracked as a follow-up.
Show child attributes
createdAtstring · date-timerequiredemailstring · emailrequiredRead-only on this API surface.
firstNamestringrequiredidstring · uuidrequiredimageUrlnull | string · urilastNamestringrequiredupdatedAtstring · date-timerequired{
"data": {
"createdAt": "2026-06-09T00:00:00Z",
"email": "alice@acme.com",
"firstName": "Alice",
"id": "00000000-0000-0000-0000-000000000000",
"imageUrl": "https://example.com",
"lastName": "Morgan",
"updatedAt": "2026-06-09T00:00:00Z"
},
"meta": {
"cursor": "string",
"hasMore": true
}
}errorobjectrequiredShow child attributes
codestringrequiredMachine-readable error category.
detailsobjectOptional per-code context (field names, retry windows, …).
messagestringrequiredHuman-readable description — intended for operator logs, not end-user display.
{
"error": {
"code": "invalid_argument",
"message": "limit must be an integer between 1 and 100"
}
}errorobjectrequiredShow child attributes
codestringrequiredMachine-readable error category.
detailsobjectOptional per-code context (field names, retry windows, …).
messagestringrequiredHuman-readable description — intended for operator logs, not end-user display.
{
"error": {
"code": "unauthorized",
"message": "Authentication required"
}
}errorobjectrequiredShow child attributes
codestringrequiredMachine-readable error category.
detailsobjectOptional per-code context (field names, retry windows, …).
messagestringrequiredHuman-readable description — intended for operator logs, not end-user display.
{
"error": {
"code": "not_found",
"message": "client not found"
}
}Headers
Retry-AfterSeconds the client should wait before retrying.
errorobjectrequiredShow child attributes
codestringrequiredMachine-readable error category.
detailsobjectOptional per-code context (field names, retry windows, …).
messagestringrequiredHuman-readable description — intended for operator logs, not end-user display.
{
"error": {
"code": "rate_limited",
"details": {
"retry_after_seconds": 30
},
"message": "Rate limit exceeded"
}
}