Get an audit event (admin)
/v1/admin/orgs/{slug}/audit-events/{id}Returns one audit record by id, subject to the same tenancy rules as the listing: a record belonging to another organization reads as missing, so a caller cannot use this to probe for one.
Ids are time-ordered (UUIDv7), so the server derives the window the record must lie in from the id itself and reads a single partition rather than searching the whole retention period.
The read is audited with the id it asked for, found or not.
The organization slug. It names the TENANT OF RECORD for the operation: the rows it reads and writes, the policy its secrets are derived under, and the organization its audit record is filed against all come from this organization. A token is admitted only through its own slug, except a main-org token, which may be admitted through any — so cross-tenant administration is performed through the TARGET tenant's slug, never by naming its resources through another. A token reaching for a slug it may not be admitted through is refused identically whether that organization exists or not.
1–64 characters
The audit record id (UUIDv7). Being time-ordered, it also tells the server which partition to read.
1–64 characters
- DPoPstring
DPoP proof JWT (RFC 9449 §4). REQUIRED on a request presenting a DPoP-bound access token, and it must be signed by the key named in the token's
cnf.jktand cover this request's method and URI. The proof is read from the request itself rather than from this decoded parameter, so every protected operation is covered whether or not it declares it.
200 OKapplication/jsonThe audit record.
The audit record.
Headers
Cache-Controlno-store
Body
One audit record.
Show moreShow less
The server NEVER returns a rendered sentence. It returns the event's
actionplus structured actor/target/metadata, and the client renders the human text by looking up one translation key and interpolating. That is what makes the log translatable, and it is why there is nomessagefield to reach for: a stored English sentence cannot be translated, cannot be filtered on, and becomes an accidental API that changes on every refactor.Two fields carry translation keys:
action(auditEvents:<action>) andreason(auditReasons:<reason>). Both are enumerated vocabularies, so this document alone is enough to build complete translation coverage — which is the reason they are enumerated.That completeness is bought with a compatibility cost, stated on
AuditAction: a client generated against one version of this document rejects an entire audit page the first time the server emits a value added after that client was built. Regenerate on upgrade. A client that would rather degrade gracefully than fail closed should decodeactionandreasonas plain strings and keep a fallback label — the values are stable and append-only, so an unrecognized one is always a new value and never a renamed one.The record id (UUIDv7, so it is also creation-ordered).
When the event happened.
When the record was persisted. It differs from
occurred_atby however long the event was buffered, so the gap is the write pipeline's lag.The event type — what was attempted. Append-only: an action is never renamed once shipped, because a rename orphans every stored record and every SIEM rule matching on it.
Show moreShow less
The outcome is deliberately NOT part of the name.
auth.sign_in.completedwithoutcome: failureis a failed sign-in; there is noauth.sign_in.failed. Encoding it would double this list, the catalog and every translation file.Translation key: the action verbatim in the
auditEventsnamespace —auditEvents:user.password.changed. Because i18next splits keys on., a locale file nests naturally by segment. The catalog endpoint publishes the same key asi18n_keyso a client need not re-derive it.Compatibility: this is a CLOSED enum, and that has a cost worth stating plainly. A client generated against one version of this document will reject an entire audit page — not merely one record — the first time the server emits an action added after that client was built. Regenerate on upgrade, or decode the field as a plain string. It is enumerated anyway because the alternative left every consumer unable to know the translatable vocabulary without calling the catalog endpoint at runtime.
Possible values"admin.access.denied""audit.counts.read""audit.log.read""audit.ranking.read""auth.account.locked""auth.email_verification.completed""auth.email_verification.requested""auth.invitation.accepted""auth.password_reset.completed""auth.password_reset.requested""auth.rate_limit.triggered""auth.registration.completed""auth.sign_in.alerted""auth.sign_in.completed""auth.sign_out.completed""branding.applied""branding.deleted""client.adopted""client.applied""client.configuration.read""client.configured""client.deleted""client.deregistered""client.listed""client.name.suspicious""client.provisioned""client.read""client.registered""client.registration.attempted""client.secret.issued""client.usage.read""http.cleartext_credential.received""http.forwarding.ignored""http.header.repeated""http.request.screened""http.request.served""identity_provider.applied""identity_provider.deleted""identity_provider.listed""mfa.factor.locked""mfa.recovery_code.consumed""mfa.recovery_codes.acknowledged""mfa.recovery_codes.regenerated""mfa.request.authenticated""mfa.status.read""mfa.totp.activated""mfa.totp.disabled""mfa.totp.enrollment_started""mfa.totp.verified""oauth.authorization.requested""oauth.client_authentication.attempted""oauth.consent.decided""oauth.consent.revoked""oauth.device.decided""oauth.device.redeemed""oauth.device.requested""oauth.device.user_code.attempted""oauth.token.introspected""oauth.token.issued""oauth.token.presented""oauth.token.refreshed""oauth.token.revoked""oidc.logout.frontchannel.rendered""oidc.logout.initiated""oidc.logout.participant.added""oidc.logout.participant.skipped""oidc.logout.token.delivered""oidc.userinfo.read""organization.created""organization.deleted""organization.listed""organization.mail.tested""organization.read""organization.route.attempted""organization.snapshot.read""organization.updated""role.granted""role.revoked""session.created""session.history.listed""session.listed""session.presented""session.revoked""system.admin.bootstrapped""system.audit.checkpoint""system.audit.configured""system.audit.degraded""system.audit.overflow""system.audit.partition_created""system.audit.partition_dropped""system.audit.recovered""system.audit.write_delayed""system.audit.write_failed""system.debug.accessed""system.dependency.degraded""system.dependency.recovered""system.keys.loaded""system.migration.applied""system.session.reaped""system.signing_key.created""system.signing_key.dropped""system.started""system.stopped""system.transport.configured""threats.overview.read""user.created""user.deleted""user.devices.listed""user.identities.listed""user.invitation.sent""user.listed""user.password.changed""user.read""user.updated"The group an action belongs to, for faceting. Declared per action rather than derived from the action's first segment, because the two do not always agree:
oauth.*andoidc.*events are both "token" work to an operator, and the grouping a UI offers should follow what an operator is looking for rather than how the constant is spelled.Possible values"authentication""session""mfa""token""user""organization""client""role""admin""audit""system"How an attempt ended.
deniedis separated fromfailurebecause "you were not allowed" and "you got it wrong" are different security signals — a cluster of the former is what a SIEM alerts on.errormarks a failure attributable to the server, so an operator can tell "users are getting it wrong" from "we are broken". The server enforces the pairing:erroralways carries the reasoninternal_errororunavailable, and those two reasons never appear under any other outcome.Possible values"success""failure""denied""error"How much an event matters, lowest first. Assigned per action, and an occurrence may raise it but never lower it. A refusal or a server fault is raised to at least
warningwhatever its action's default, soseverity >= warningselects everything that did not go as asked; a protocol step that only looks like a failure (authorization_pending,use_dpop_nonce,mfa_required,login_required,interaction_required,consent_required,account_selection_required) keeps its action's default.Possible values"info""notice""warning""critical"The organization the event is ABOUT. Empty for a platform-scoped record (process startup, retention) — those have no owning tenant and are visible only through the main organization.
Whether the actor acted from a different organization than the one the event is about — a main-org administrator operating on a tenant. Derived from the two organization ids.
Who caused the event.
Show moreShow less
displayis a snapshot taken when the event was recorded, not a live lookup. That is deliberate: an audit record's most important reads happen after the fact, by which time the principal it names may have been deleted — and a log that can only render an opaque id once the row is gone has failed at its only job.Show child attributesHide child attributes
The kind of principal that caused an event.
anonymousis the correct value for every pre-authentication event: a failed sign-in has no principal yet, and the address that was typed is in the event metadata instead — putting it in the actor id would mint a phantom identifier that joins against nothing.Possible values"user""admin""client""system""anonymous"- idstring
- displaystring
A human label captured at event time.
- impersonator_idstring
The real principal, when this actor was being acted-as. Present only for actions taken inside an impersonated session.
- impersonator_displaystring
- reasonenum
A stable machine token explaining a non-success outcome. Absent on success.
Show moreShow less
Translate it rather than displaying it: the key is the token verbatim in the
auditReasonsnamespace —auditReasons:invalid_credentials. A separate namespace from actions, because these are flat tokens rather than dotted paths and would otherwise nest unpredictably.The OAuth-related values are spelled exactly as the corresponding RFC 6749 §5.2 / OIDC Core §3.1.2.6 wire error, so the audit record and the error the client actually received are the same string.
Compatibility: closed, with the same cost described on
AuditAction— this vocabulary grows as the server implements more specifications (invalid_targetarrived with RFC 8707,invalid_dpop_proofwith RFC 9449).Possible values"invalid_credentials""account_locked""rate_limited""mfa_required""email_verification_required""invalid_code""factor_locked""missing_role""missing_scope""cross_org_denied""not_found""conflict""invalid_request""invalid_client""invalid_grant""invalid_redirect_uri""unauthenticated""registration_closed""invalid_target""invalid_dpop_proof""repeated_header""token_expired""missing_expiry""audience_mismatch""unsupported_critical""unregistered_client""redirect_uri_required""pushed_request_required""invalid_request_uri""request_uri_client_mismatch""invalid_request_object""unavailable""internal_error""access_denied""login_required""consent_required""interaction_required""unsupported_grant_type""invalid_scope""unauthorized_client""unsupported_response_type""account_selection_required""invalid_authorization_details""expired_token""request_not_supported""request_uri_not_supported""unsupported_token_type""invalid_token""use_dpop_nonce""authorization_pending""slow_down""invalid_client_metadata""invalid_software_statement""unapproved_software_statement""account_unavailable""insufficient_user_authentication""protected_account" - actor_organization_idstring
The organization the ACTOR came from.
- targetobject
The object the event acted upon. Absent for events that act on nothing in particular.
displayis a snapshot, for the same reason as on the actor.Show child attributesHide child attributes
- typeenum
The kind of object an event acted upon.
audit_logis the log itself, for the events that record reading or exporting it.consentis one user's standing agreement with one client for one resource, named by the agreement's id, so every decision about it shares one target.Possible values"user""organization""client""session""token""factor""role""system""audit_log""consent" - idstring
- displaystring
- client_ipstring
The caller's address, resolved through the trusted-proxy policy.
- client_ip_sourceenum
How a client address was determined.
socketmeans it is the connecting peer's own address, from a peer that forwarded no client, so it came off the connection and the caller could not have chosen it;forwardedmeans it came from a header set by a peer inside the trusted-proxy list;proxymeans the request came through a trusted proxy that forwarded but named no client to believe, so the address is the proxy's own.Possible values"socket""forwarded""proxy" - transportenum
Whether the client's own hop to the deployment was encrypted, and on whose word.
tls: this listener completed a TLS handshake and no trusted proxy reported a scheme;cleartext: it did not, and no trusted proxy reported a scheme.forwarded_tlsandforwarded_cleartextare a trusted proxy's report (X-Forwarded-Proto): every hop it recorded was https, or one was not. It is the same verdict that decides whether the response carries Strict-Transport-Security, and it is computed by the server, never copied from a header. Absent on records with no request behind them (startup, maintenance, the pipeline's own records) and on the summary of a coalesced refusal, whose requests may have arrived differently; the summary of a coalesced edge finding (http.forwarding.ignored,http.cleartext_credential.received) carries the transport its window is keyed on.Possible values"tls""cleartext""forwarded_tls""forwarded_cleartext" - proxy_ipstring
The trusted proxy that vouched for a forwarded
client_ip: the address of the peer that connected to this server, present whenclient_ip_sourceisforwarded(every other source already puts that peer inclient_ip). It is also set on a coalesced summary of forwarded requests (http.cleartext_credential.receivedcarrying arepeat_count, whose window is the proxy's rather than a client's), whereclient_ipandclient_ip_sourceare absent because the clients varied. A forwarded address is only as true as the peer that wrote it, and this names the peer. - user_agentstring
The raw User-Agent, stored unparsed.
- client_kindenum
The kind of client the record's User-Agent claims sent the request:
browser, a browser a person drives;ai_agent, an AI crawler, assistant or agent (a training crawler, a page fetched for an assistant's user, a coding agent signing in to a tool);crawler, a search, link-preview or SEO crawler;automation, a headless or test-driven browser;library, a program calling directly (an HTTP library, a command-line tool, a native app, a health probe);unknown, a header that is empty or names none of these. It is read from the storeduser_agenteach time the record is served, so every record carries the server's current reading. A User-Agent is whatever its sender writes, so this is a claim, never a verified identity. Absent on records no request produced (startup, maintenance, the pipeline's own records) and on the summary of a coalesced refusal.Possible values"browser""ai_agent""crawler""automation""library""unknown" - client_agentstring
The product a client other than a browser names in its User-Agent, as its vendor names it (
ClaudeBot,Claude Code,curl), from the list the server recognizes. Absent when the header names none of them; never text copied from the header. - request_idstring
Matches the
X-Request-IDechoed to the caller. An inboundX-Request-IDis kept only from a trusted proxy; otherwise the server mints the id. - trace_idstring
W3C trace id, for correlating with distributed traces. An inbound
traceparentis honored only from a trusted proxy. - span_idstring
- operationstring
The OpenAPI operationId that served the request, exactly as this document spells it (
getJWKS,signIn). A route mounted outside the document carries the name it declares: the per-organization discovery and key-set routes the operationId of the document they serve, the others a stable name of their own (authUI,dashboard,healthz,pprof). A control-plane event carries the gRPC full method name (/package.Service/Method). Empty when the request was refused before it was routed. Records stored by an earlier release carry the generated Go identifier instead (GetJWKS), so a query spanning the change matches both spellings. Stored instead of a request path, which would be unbounded in cardinality and would embed user ids and email addresses. - http_methodstring
The request method. A method outside the registered set (RFC 9110 §9 and PATCH) is recorded as
_OTHER, as OpenTelemetry records it. - session_idstring
The public id of the login session the event belongs to, the
sidrelying parties receive. An event an administrator caused through the admin API carries the session their access token was issued in. - client_idstring
The OAuth client the server resolved the event to: the client that authenticated, the registered client a client authentication named (whether or not it succeeded), or the client of a verified token, session or flow. It says which registered client the event concerns, not that the request proved it was that client. An event an administrator caused names the admin client their access token was minted for (the console or the machine client), never a client they manage. Any other administrative or client lifecycle event never sets it; it names the client as its target.
- claimed_client_idstring
An OAuth client the event names that the server did not resolve it to: the
client_ida sign-in form carried, an identifier a client authentication presented that no client registered, a logout's unverified hint. Present only whenclient_idis absent, so a record names its client in at most one of the two, and which one says whether the server resolved the client or the caller only named it. A named value is whatever the caller sent, bounded. Records written before the server kept this field carry it inmetadata.client_idonly. - metadataobject
Per-action detail. Its keys are declared per action in the server's catalog (see the catalog endpoint) and anything undeclared is dropped before storage, so it can never carry credentials. A field with a closed vocabulary (the catalog's
field_values) only ever holds a value from it. Two reserved keys may appear:_droppedlists keys that were removed — undeclared, or carrying a value outside their vocabulary — and_truncatedlists keys whose values were shortened to fit the size bounds, so each such stored value is a prefix of the one the server was given. A key is never removed for its size.
401 Unauthorizedapplication/problem+jsonProblem details (RFC 9457) with an RFC 6750 / RFC 9449 challenge.
Headers
Cache-Controlno-storeWWW-AuthenticatestringDPoP-Noncestring
Body
RFC 9457 (formerly RFC 7807) problem details (application/problem+json).
codeis a stable machine-readable slug for the problem kind (it mirrors the suffix oftype), so consumers can branch on it without parsing prose.errorsis present on validation failures and lists every offending field.- Example
"Request validation failed" - Example
400 - typestring · uriExample
"urn:problem-type:validation_error" - detailstringExample
"One or more fields did not satisfy the API schema." - codeenum
The kind of problem, as a stable machine-readable slug a client branches on and translates rather than parsing
titleordetail, which are English prose for logs. A problem whose status says everything the server knows carries nocode.Show moreShow less
validation_erroris the one code whose message is not a sentence about the code itself: the request failed the schema, and the specifics are theerrorslist — one entry per offending field — which a form renders on those fields.requiredandmalformedare spelled like two of the per-field violation codes (FieldError.code) but mean something else; the two vocabularies are told apart by position, never by spelling.Compatibility: this is a CLOSED enum, with the same cost as
AuditAction: a client generated against an older version of this document rejects a problem carrying a code added after it was built. Regenerate on upgrade, or decode the field as a plain string. It is enumerated anyway so that what a client must translate is knowable from the contract alone.Possible values"invalid_request""invalid_credentials""forbidden""unauthorized""insufficient_user_authentication""protected_account""last_role_administrator""invalid_code""too_many_requests""too_many_attempts""account_locked""account_unavailable""already_enrolled""registration_disabled""registration_conflict""captcha_failed""invalid_reset_link""invalid_verification_link""invalid_invitation_link""mail_relay_missing""not_found""conflict""unavailable""busy""window_too_large""too_many_series""internal_error""rate_limited""malformed""body_too_large""required""validation_error""unknown_org""invalid_token""invalid_dpop_proof""use_dpop_nonce""server_error" - instancestringExample
"/introspect" - request_idstringExample
"8d94ed49-1caf-4ab3-9594-557142f2d023" - trace_idstring
Distributed-trace id (hex) for correlating this response with traces and logs. Present only when tracing is enabled and the request was recorded. Opaque and safe to log/share.
Example"4bf92f3577b34da6a3ce929d0e0e4736" - errorsarray of objects
Field-level violations (present for validation errors).
Each item:A single field-level validation violation.
Show item attributesHide item attributes
Offending field, dotted for nested bodies (e.g. child.id).
Example"token_type_hint"Machine-readable violation code: required, too_short, too_long, pattern, invalid_format, not_allowed, minimum, maximum, multiple_of, too_few, too_many, not_unique, malformed.
Example"not_allowed"- Example
"field token_type_hint must be one of [access_token, refresh_token]"
403 Forbiddenapplication/problem+jsonProblem details (RFC 9457) with an RFC 6750 / RFC 9449 challenge.
Headers
Cache-Controlno-storeWWW-AuthenticatestringDPoP-Noncestring
Body
RFC 9457 (formerly RFC 7807) problem details (application/problem+json).
codeis a stable machine-readable slug for the problem kind (it mirrors the suffix oftype), so consumers can branch on it without parsing prose.errorsis present on validation failures and lists every offending field.- Example
"Request validation failed" - Example
400 - typestring · uriExample
"urn:problem-type:validation_error" - detailstringExample
"One or more fields did not satisfy the API schema." - codeenum
The kind of problem, as a stable machine-readable slug a client branches on and translates rather than parsing
titleordetail, which are English prose for logs. A problem whose status says everything the server knows carries nocode.Show moreShow less
validation_erroris the one code whose message is not a sentence about the code itself: the request failed the schema, and the specifics are theerrorslist — one entry per offending field — which a form renders on those fields.requiredandmalformedare spelled like two of the per-field violation codes (FieldError.code) but mean something else; the two vocabularies are told apart by position, never by spelling.Compatibility: this is a CLOSED enum, with the same cost as
AuditAction: a client generated against an older version of this document rejects a problem carrying a code added after it was built. Regenerate on upgrade, or decode the field as a plain string. It is enumerated anyway so that what a client must translate is knowable from the contract alone.Possible values"invalid_request""invalid_credentials""forbidden""unauthorized""insufficient_user_authentication""protected_account""last_role_administrator""invalid_code""too_many_requests""too_many_attempts""account_locked""account_unavailable""already_enrolled""registration_disabled""registration_conflict""captcha_failed""invalid_reset_link""invalid_verification_link""invalid_invitation_link""mail_relay_missing""not_found""conflict""unavailable""busy""window_too_large""too_many_series""internal_error""rate_limited""malformed""body_too_large""required""validation_error""unknown_org""invalid_token""invalid_dpop_proof""use_dpop_nonce""server_error" - instancestringExample
"/introspect" - request_idstringExample
"8d94ed49-1caf-4ab3-9594-557142f2d023" - trace_idstring
Distributed-trace id (hex) for correlating this response with traces and logs. Present only when tracing is enabled and the request was recorded. Opaque and safe to log/share.
Example"4bf92f3577b34da6a3ce929d0e0e4736" - errorsarray of objects
Field-level violations (present for validation errors).
Each item:A single field-level validation violation.
Show item attributesHide item attributes
Offending field, dotted for nested bodies (e.g. child.id).
Example"token_type_hint"Machine-readable violation code: required, too_short, too_long, pattern, invalid_format, not_allowed, minimum, maximum, multiple_of, too_few, too_many, not_unique, malformed.
Example"not_allowed"- Example
"field token_type_hint must be one of [access_token, refresh_token]"
404 Not Foundapplication/problem+jsonProblem details (RFC 9457).
Problem details (RFC 9457).
Body
RFC 9457 (formerly RFC 7807) problem details (application/problem+json).
codeis a stable machine-readable slug for the problem kind (it mirrors the suffix oftype), so consumers can branch on it without parsing prose.errorsis present on validation failures and lists every offending field.- Example
"Request validation failed" - Example
400 - typestring · uriExample
"urn:problem-type:validation_error" - detailstringExample
"One or more fields did not satisfy the API schema." - codeenum
The kind of problem, as a stable machine-readable slug a client branches on and translates rather than parsing
titleordetail, which are English prose for logs. A problem whose status says everything the server knows carries nocode.Show moreShow less
validation_erroris the one code whose message is not a sentence about the code itself: the request failed the schema, and the specifics are theerrorslist — one entry per offending field — which a form renders on those fields.requiredandmalformedare spelled like two of the per-field violation codes (FieldError.code) but mean something else; the two vocabularies are told apart by position, never by spelling.Compatibility: this is a CLOSED enum, with the same cost as
AuditAction: a client generated against an older version of this document rejects a problem carrying a code added after it was built. Regenerate on upgrade, or decode the field as a plain string. It is enumerated anyway so that what a client must translate is knowable from the contract alone.Possible values"invalid_request""invalid_credentials""forbidden""unauthorized""insufficient_user_authentication""protected_account""last_role_administrator""invalid_code""too_many_requests""too_many_attempts""account_locked""account_unavailable""already_enrolled""registration_disabled""registration_conflict""captcha_failed""invalid_reset_link""invalid_verification_link""invalid_invitation_link""mail_relay_missing""not_found""conflict""unavailable""busy""window_too_large""too_many_series""internal_error""rate_limited""malformed""body_too_large""required""validation_error""unknown_org""invalid_token""invalid_dpop_proof""use_dpop_nonce""server_error" - instancestringExample
"/introspect" - request_idstringExample
"8d94ed49-1caf-4ab3-9594-557142f2d023" - trace_idstring
Distributed-trace id (hex) for correlating this response with traces and logs. Present only when tracing is enabled and the request was recorded. Opaque and safe to log/share.
Example"4bf92f3577b34da6a3ce929d0e0e4736" - errorsarray of objects
Field-level violations (present for validation errors).
Each item:A single field-level validation violation.
Show item attributesHide item attributes
Offending field, dotted for nested bodies (e.g. child.id).
Example"token_type_hint"Machine-readable violation code: required, too_short, too_long, pattern, invalid_format, not_allowed, minimum, maximum, multiple_of, too_few, too_many, not_unique, malformed.
Example"not_allowed"- Example
"field token_type_hint must be one of [access_token, refresh_token]"
429 Too Many Requestsapplication/problem+jsonToo many requests.
Too many requests.
Body
RFC 9457 (formerly RFC 7807) problem details (application/problem+json).
codeis a stable machine-readable slug for the problem kind (it mirrors the suffix oftype), so consumers can branch on it without parsing prose.errorsis present on validation failures and lists every offending field.- Example
"Request validation failed" - Example
400 - typestring · uriExample
"urn:problem-type:validation_error" - detailstringExample
"One or more fields did not satisfy the API schema." - codeenum
The kind of problem, as a stable machine-readable slug a client branches on and translates rather than parsing
titleordetail, which are English prose for logs. A problem whose status says everything the server knows carries nocode.Show moreShow less
validation_erroris the one code whose message is not a sentence about the code itself: the request failed the schema, and the specifics are theerrorslist — one entry per offending field — which a form renders on those fields.requiredandmalformedare spelled like two of the per-field violation codes (FieldError.code) but mean something else; the two vocabularies are told apart by position, never by spelling.Compatibility: this is a CLOSED enum, with the same cost as
AuditAction: a client generated against an older version of this document rejects a problem carrying a code added after it was built. Regenerate on upgrade, or decode the field as a plain string. It is enumerated anyway so that what a client must translate is knowable from the contract alone.Possible values"invalid_request""invalid_credentials""forbidden""unauthorized""insufficient_user_authentication""protected_account""last_role_administrator""invalid_code""too_many_requests""too_many_attempts""account_locked""account_unavailable""already_enrolled""registration_disabled""registration_conflict""captcha_failed""invalid_reset_link""invalid_verification_link""invalid_invitation_link""mail_relay_missing""not_found""conflict""unavailable""busy""window_too_large""too_many_series""internal_error""rate_limited""malformed""body_too_large""required""validation_error""unknown_org""invalid_token""invalid_dpop_proof""use_dpop_nonce""server_error" - instancestringExample
"/introspect" - request_idstringExample
"8d94ed49-1caf-4ab3-9594-557142f2d023" - trace_idstring
Distributed-trace id (hex) for correlating this response with traces and logs. Present only when tracing is enabled and the request was recorded. Opaque and safe to log/share.
Example"4bf92f3577b34da6a3ce929d0e0e4736" - errorsarray of objects
Field-level violations (present for validation errors).
Each item:A single field-level validation violation.
Show item attributesHide item attributes
Offending field, dotted for nested bodies (e.g. child.id).
Example"token_type_hint"Machine-readable violation code: required, too_short, too_long, pattern, invalid_format, not_allowed, minimum, maximum, multiple_of, too_few, too_many, not_unique, malformed.
Example"not_allowed"- Example
"field token_type_hint must be one of [access_token, refresh_token]"
Errorapplication/problem+jsonProblem details (RFC 9457) with an RFC 6750 / RFC 9449 challenge.
Headers
Cache-Controlno-storeWWW-AuthenticatestringDPoP-Noncestring
Body
RFC 9457 (formerly RFC 7807) problem details (application/problem+json).
codeis a stable machine-readable slug for the problem kind (it mirrors the suffix oftype), so consumers can branch on it without parsing prose.errorsis present on validation failures and lists every offending field.- Example
"Request validation failed" - Example
400 - typestring · uriExample
"urn:problem-type:validation_error" - detailstringExample
"One or more fields did not satisfy the API schema." - codeenum
The kind of problem, as a stable machine-readable slug a client branches on and translates rather than parsing
titleordetail, which are English prose for logs. A problem whose status says everything the server knows carries nocode.Show moreShow less
validation_erroris the one code whose message is not a sentence about the code itself: the request failed the schema, and the specifics are theerrorslist — one entry per offending field — which a form renders on those fields.requiredandmalformedare spelled like two of the per-field violation codes (FieldError.code) but mean something else; the two vocabularies are told apart by position, never by spelling.Compatibility: this is a CLOSED enum, with the same cost as
AuditAction: a client generated against an older version of this document rejects a problem carrying a code added after it was built. Regenerate on upgrade, or decode the field as a plain string. It is enumerated anyway so that what a client must translate is knowable from the contract alone.Possible values"invalid_request""invalid_credentials""forbidden""unauthorized""insufficient_user_authentication""protected_account""last_role_administrator""invalid_code""too_many_requests""too_many_attempts""account_locked""account_unavailable""already_enrolled""registration_disabled""registration_conflict""captcha_failed""invalid_reset_link""invalid_verification_link""invalid_invitation_link""mail_relay_missing""not_found""conflict""unavailable""busy""window_too_large""too_many_series""internal_error""rate_limited""malformed""body_too_large""required""validation_error""unknown_org""invalid_token""invalid_dpop_proof""use_dpop_nonce""server_error" - instancestringExample
"/introspect" - request_idstringExample
"8d94ed49-1caf-4ab3-9594-557142f2d023" - trace_idstring
Distributed-trace id (hex) for correlating this response with traces and logs. Present only when tracing is enabled and the request was recorded. Opaque and safe to log/share.
Example"4bf92f3577b34da6a3ce929d0e0e4736" - errorsarray of objects
Field-level violations (present for validation errors).
Each item:A single field-level validation violation.
Show item attributesHide item attributes
Offending field, dotted for nested bodies (e.g. child.id).
Example"token_type_hint"Machine-readable violation code: required, too_short, too_long, pattern, invalid_format, not_allowed, minimum, maximum, multiple_of, too_few, too_many, not_unique, malformed.
Example"not_allowed"- Example
"field token_type_hint must be one of [access_token, refresh_token]"