Local account registration (hosted auth UI)
/v1/auth/registerCreates a local user with an argon2id-hashed password when self-service
registration is enabled (config auth.registration.enabled; gate this in
production). The username is set to the lowercased email so distinct
emails never collide on the username uniqueness constraint. Like sign-in,
the body carries the preserved OAuth parameters and the response may
establish a session and return the /authorize continuation. When the
deployment asks for a captcha (auth.captcha.provider), captcha must
carry a solution of a challenge from GET /v1/auth/captcha.
- Originstring
Browser Origin, checked (with Sec-Fetch-Site) as a same-origin/CSRF guard.
- Sec-Fetch-Sitestring
Fetch metadata; only same-origin is trusted (CSRF guard).
- Content-Typestring
Must be application/json — a JSON body cannot be a CORS simple request, closing form-based CSRF.
- User-Agentstring
- Cookiestring
The request Cookie header; the interactive login / pending-auth session cookie, and the browser marker a sign-in is recognized by, are read from it.
- Accept-Languagestring
The browser's preferred languages (RFC 9110 §12.5.4); a message the operation queues, such as a new-sign-in alert, is written in the first one the server ships.
Request body
A hosted-UI local registration. email must be a valid address (it also becomes the username); password is argon2id-hashed server-side. The preserved OAuth parameters are carried and re-validated exactly as for sign-in.
- Example
"alice@example.com"at most 320 characters
8–4096 characters
- namestring
at most 256 characters
- captchastring
The captcha solution, required when the deployment asks for one: for
altcha, the base64 payload the widget produces from a challenge ofGET /v1/auth/captcha; for a hosted provider, its widget's token.at most 4096 characters
- client_idstring
at most 256 characters
- ui_localesstring
at most 256 characters
- redirect_uristring
at most 2048 characters
- response_typestring
at most 32 characters
- scopestring
at most 2048 characters
- statestring
at most 1024 characters
- noncestring
at most 1024 characters
- code_challengestring
at most 128 characters
- code_challenge_methodstring
at most 16 characters
- login_hintstring
at most 512 characters
- promptstring
at most 64 characters
- request_uristring
at most 512 characters
- resourcestring
at most 2048 characters
- dpop_jktstring
exactly 43 characters · pattern
^[A-Za-z0-9_-]+$ - max_ageinteger · int64
at least 0
- continue_pathstring
at most 128 characters
No other properties are accepted.
200 OKapplication/jsonThe account was created (and optionally signed in).
The account was created (and optionally signed in).
Headers
Set-Cookiearray of stringsCache-Controlno-store
Body
The next step for the hosted UI after an auth action.
redirectTo(when present) is a server-built URL the browser follows — the /authorize continuation or the final client redirect. The MFA/consent fields are reserved for the interactive flows layered on top of this step.- redirectTostring
URL to navigate to next (the /authorize continuation or client redirect).
Example"/authorize?client_id=nauthera_2Rk9&response_type=code&..." - mfaRequiredboolean
An MFA challenge is required before completing sign-in.
- mfaMethodsarray of strings
Available MFA methods, most-preferred first.
- consentRequiredboolean
User consent is required before issuing tokens.
- setupRequiredboolean
The user has no active second factor and must enroll one (forced TOTP enrollment) before sign-in can complete.
- emailVerificationRequiredboolean
The organization requires a verified address and this account's is not. No session was established; a verification link was sent if one could be, and POST /v1/auth/verify-email/resend sends another.
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).
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]"