Get the threat overview (admin)
/v1/admin/orgs/{slug}/threatsReturns every signal of the threat catalog counted over the window: the failed sign-ins, locks and throttles that show credentials being guessed, the second-factor failures and locks, the grants and tokens refused at the protocol endpoints, the clients that failed to prove who they are, the registrations and names that look built to mislead, the privileged calls refused, and the malformed traffic turned away at the edge. Each signal carries its count, the count of the equal window before, its counts per bucket, the status that judges them against the signal's recommended threshold, the audit list filters that list exactly the records it counted, and the frameworks that describe the threat. Beside them, the shape of the window's failed sign-ins — how many, from how many addresses, against how many accounts — says whether one account is being hammered, many are being sprayed from one address, or a leaked list is being tried from many.
Everything is an aggregate: no address, account or client is named. The drill-down is the audit list, under its own permissions.
bucket is one of the audit counts' fixed list, each allowed up to a
window: 1m up to 2 hours, 10m up to 2 days, 1h up to 31 days and
1d up to the 90-day maximum x-window declares. Omitted, it is the
finest the window allows, and the window is widened to whole buckets
and echoed. A window longer than the bucket asked for allows is refused
with window_too_large.
Answers are cached per organization, bucket and window for at least the
dashboard's shortest refresh interval, and replicas sharing a cache
compute each one once. An aggregate runs under a deadline and a
per-server concurrency cap; past either it is answered 503 busy with
Retry-After rather than queued.
Requires the nauthera.threats:read scope and the threats.read
permission. A caller is confined to its own org unless a platform role
held in the main org admits it to every org. Reading the overview is
recorded at the trace level only, so polling adds nothing to the audit
log at the levels a deployment usually runs.
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
- bucketenum
The bucket length. Omitted, the finest the window allows.
Possible values"1m""10m""1h""1d" - fromstring · date-time
Inclusive start of the window (RFC3339). Defaults to 30 days before
to.The window from
fromtotomay span at most 90 days. - tostring · date-time
Exclusive end of the window (RFC3339). Defaults to now.
The window from
fromtotomay span at most 90 days.
- 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/jsonEvery signal over the window, judged.
Every signal over the window, judged.
Headers
Cache-Controlno-store
Body
Every signal of the threat catalog counted over one window, each judged against its threshold and the equal window before, and the shape of the window's failed sign-ins. The window is the one asked for widened to whole buckets, and is echoed with the bucket, so a sparkline labels exactly the buckets it was given.
Show moreShow less
The overview counts audit records, so it sees what the deployment's audit level records: a refusal is recorded at the refusal level whatever its action's own, and the records the edge coalesces count once per summary. An answer is cached per organization for at least the dashboard's shortest refresh interval.
The first bucket's start.
The last bucket's end.
A bucket length counts are grouped by, each allowed up to a window:
1mup to 2 hours,10mup to 2 days,1hup to 31 days and1dup to the 90-day maximum. Buckets are UTC, a day's included.Possible values"1m""10m""1h""1d"The start of the equal window before, which ends at
from.Every signal of the catalog, in its display order.
Each item:One signal over the window: how many records it counted, how many the equal window before held, the counts per bucket for a sparkline, the status that judges them, and the threshold and references that explain the judgement.
at most 64 items
Show item attributesHide item attributes
One signal of the threat overview: a closed set of audit actions and outcomes counted over the window. Translated under
threats.signal.<value>.Compatibility: closed. A client should render a kind it does not know by its count and status alone.
Possible values"sign_in_failures""account_locks""sign_in_throttles""recovery_refusals""registration_refusals""second_factor_failures""second_factor_locks""token_grant_refusals""access_token_refusals""client_authentication_failures""authorization_refusals""device_code_guesses""suspicious_clients""admin_access_denials""request_screening_refusals"The group a signal is shown under: guessing credentials, guessing the second factor, misusing tokens and clients at the protocol endpoints, registering clients, probing the privileged API, and malformed traffic turned away at the edge.
Possible values"credentials""second_factor""tokens""clients""admin""edge"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 records counted in the window.
at least 0
The records counted in the equal window ending where this one starts.
at least 0
One count per bucket from
fromtoto, zero where nothing matched.each item: at least 0
How a signal's count reads against its threshold:
quietwhen nothing was counted,normalunder every threshold,elevatedat or over the elevated rate or several times the window before,criticalat or over the critical rate.Possible values"quiet""normal""elevated""critical"The recommended measurement a signal is judged by. The rates are per hour over the whole window, so one threshold means the same over a quarter of an hour and over a month; the baseline rule raises the status to
elevatedwhen the count is at leastbaseline_ratiotimes the count of the equal window before, once it reachesbaseline_floor.Show child attributesHide child attributes
at least 0
at least 0
at least 1
at least 0
No other properties are accepted.
The audit list's filters that list exactly the records the signal counted, for the drill-down from a tile to the log: values of its
actionandoutcomeparameters. An emptyoutcomemeans every outcome.Show child attributesHide child attributes
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"at most 16 items
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"at most 4 items
No other properties are accepted.
Where the threat a signal counts is described.
at most 8 items
No other properties are accepted.
What the window's failed sign-ins look like together: the three numbers that tell one account hammered from a few addresses, many accounts sprayed from one, and a leaked list tried from many apart. Aggregates only: no address and no account is named.
Show child attributesHide child attributes
Sign-ins refused in the window.
at least 0
Of those, the attempts that resolved to no account: an address no account holds, or an attempt shed before the lookup.
at least 0
Distinct client addresses the refused sign-ins came from.
at least 0
Distinct accounts the refused sign-ins resolved to.
at least 0
The attack the shape of the window's failed sign-ins most resembles.
nonewhen there are too few failures to read a shape in;credential_crackingwhen a few accounts were each tried many times;password_sprayingwhen many accounts were tried from a few addresses;credential_stuffingwhen many accounts, or mostly identifiers no account holds, were tried from many addresses;diffusewhen there are enough failures to look at and no one shape.Possible values"none""credential_cracking""password_spraying""credential_stuffing""diffuse"
No other properties are accepted.
400 Bad Requestapplication/problem+jsonThe query was invalid — a time window that ends before it starts or spans more than 90 days, or longer than the bucket asked for allows (
window_too_large).The query was invalid — a time window that ends before it starts or spans more than 90 days, or longer than the bucket asked for allows (
window_too_large).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]"
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]"
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]"
503 Service Unavailableapplication/problem+jsonThe server is computing as many aggregates as it allows at once, or this one did not finish within its deadline (
busy); retry after Retry-After. Also answered when audit logging is not enabled (unavailable).The server is computing as many aggregates as it allows at once, or this one did not finish within its deadline (
busy); retry after Retry-After. Also answered when audit logging is not enabled (unavailable).Headers
Retry-Afterstring
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]"