Browser-direct registration and password recovery

All routes here are SSO POSTs below the browser-direct base, with endpoint-bound DPoP, registered Origin and JSON. No existing session or management scope is needed; transaction, key and current application policy provide the ceremony boundary. Use fresh proofs for every retry. Signup requires the registration gates; forgot-password recovery requires authentication enabled and works independently of whether new signup is allowed.

Signup

Signup owns a 30-minute transaction bound to organization, application, origin, key and authorization context. Start with native signup or explicitly select a provider while the draft is empty. Provider proof is not account creation.

Relative path Exact input Success
/signup/start Authorization context transaction plus signup view
/signup/availability transaction, field: username or email, value (≤254) field, boolean available; draft only
/signup/authorize transaction, provider: github, discord or m7 authorize_url, state; navigate to returned URL
/signup/submit transaction, username, native password,confirm, optional email,displayname, required granted terms_consent Signup view, possibly verification required
/signup/resend transaction Signup view after sending a new confirmation
/signup/verify transaction, code (six-digit string) Signup view with status: ready on success
/signup/status transaction Current signup view; no account mutation
/signup/complete transaction Completed account receipt, or verification-required view after a policy change
/signup/cancel transaction Cancelled view, only before completion starts

Signup view is signup_id (UUID), status, remaining expires_in, optional provider. Completed adds account_id, account_status, next_action (sign_in for active, await_approval otherwise), and optional provider. Only start returns a new transaction handle; retain it yourself.

Usernames are 3–32 ASCII characters, begin with a letter, end with a letter or digit, and contain letters/digits or isolated ., _, - (no adjacent punctuation). Reserved names include admin, root, system, null, m7, id, user, me, support. Password and confirmation must match and satisfy the shared password policy. Provider signup omits password/confirm. Use terms_consent: "yes" only after explicit agreement. Email is a valid address up to 254 bytes; displayname is up to 255 bytes. Required/enabled email and display-name rules come from effective registration policy. Disabled email is discarded; disabled/empty optional displayname falls back to the username. Verification defaults to required email under the normal registration defaults. Phone-only or combined required phone verification is not supported by this signup ceremony; invalid activation configuration fails instead of silently bypassing verification.

{
  "transaction":"<signup transaction>",
  "username":"sample.member",
  "password":"<new password>","confirm":"<same new password>",
  "email":"member@example.org","displayname":"Sample Member",
  "terms_consent":"yes"
}
stateDiagram-v2
  [*] --> draft
  draft --> verification_required: Submit under verification policy
  draft --> ready: Submit under immediate or approval policy
  verification_required --> ready: Verify email
  ready --> completing: Complete with current policy
  completing --> completed: Account and group enrollment confirmed
  draft --> cancelled
  verification_required --> cancelled
  ready --> cancelled

signup/authorize requires current federation allowance and a draft with no selected provider. Its provider ticket lasts at most ten minutes and never outlives the signup. The callback returns signup=continue,state, or an error; check state and reload status. It proves a provider for this draft, never auto registers. A provider already linked in this organization is denied: sign in instead. To change providers, cancel and start a new signup.

Availability is a convenience check, not a reservation. Username and email ownership are rechecked when creating the member. Submit persists the draft before mail delivery. Repeating the same submitted details returns its view; changing them requires a new transaction. A mail failure does not create the account: inspect status and explicitly resend. Resend replaces the confirmation; verification consumes a six-digit email proof. This family uses the confirmation service's delivery/proof policy and does not expose the email-login family's cooldown/budget contract; do not present those limits as signup guarantees.

Complete rechecks registration, activation and provider policy and enrolls configured registration groups. It can return to verification-required if policy changed. completing uses a persisted creation receipt: retry complete on the same transaction, not a second signup. Completed status/complete returns the same receipt. Successful signup grants no token; sign in afterward. Approval mode waits for an authorized approval. Cancellation cannot undo created accounts and returns 409 once completing/completed. Expired/wrong-bound transactions or proofs return invalid_grant; state/input conflicts return invalid_request (often 409); disabled gates and ineligible accounts return access_denied (403).

Continue an incomplete signup from sign-in

Password login can return outcome: signup_required plus transaction, state, signup_id, status, expires_in, and sometimes send_code: true. If you still hold an unexpired native draft, include signup_transaction in login; matching credentials can recover that exact draft. For an already-created disabled account, the service proves its password and requires a genuine pending verification marker and pending primary email. It does not reopen an arbitrary disabled or previously verified account. Legacy hosted verification-pending accounts can qualify; approval-pending accounts do not become self-approved.

When send_code is true, call signup/resend explicitly, then verify and complete using the returned transaction. This continuation cannot change submitted details or choose a provider. Current email ownership and account state are rechecked. Completion is bound to its own receipt; concurrent disabling or a different activation cannot be mistaken for this transaction's success.

Forgot-password recovery

Recovery is for active, admitted native tenant password members with exactly one verified native password identity and a usable verified email. It cannot create a first password, revive a retired password, reset consumer-linked credentials or change a provider's password. For those accounts use the original provider/consumer recovery or the signed-in first-password flow.

Relative path Exact input Success
/recovery/start username (username/member UUID or email, trimmed, ≤254) transaction plus recovery view
/recovery/resend transaction View with new send cooldown
/recovery/verify transaction, six-digit string code status: ready view
/recovery/status transaction Read-only current view
/recovery/complete transaction, password, confirm Completed view if password update was confirmed
/recovery/cancel transaction Cancelled view before password update starts

Recovery view contains status, expires_in, and, during verification, generic message and resend_after. Completed adds next_action: sign_in; completing includes an uncertainty message. No account UUID, selected mailbox, identity credential or confirmation-job ID is disclosed.

{"username":"member@example.org"}

Unknown/ineligible accounts receive the same generic verification-required view. An email identifier must have one verified active owner in the organization and recovers through that exact address. Username recovery prefers a verified primary address, with a stable verified-address fallback. Current ownership, identity, account and group admission are rechecked before reset.

The transaction lasts 30 minutes, allows five verification attempts in total, and enforces 30 seconds between resends (slow_down, 429). A resend does not reset the attempt budget. This is not the email-login family's cross-transaction member/IP limit. Invalid code/expired authority is invalid_grant; malformed code or wrong phase is invalid_request; denied current policy is access denied.

States are verification_required → ready → completing → completed, or cancelled before completing. The reset authority is consumed before the remote password mutation. Completed receipt can be read/repeated safely, but a stuck completing operation must not replay the password write. Inspect status, try a fresh sign-in with the intended password, or start a new recovery. There is no guarantee that a lost upstream response means failure. Password reset changes native credential/certificate authority; old native token use must not be treated as valid, and fresh sign-in is required. The response does not claim all member/app sessions were synchronously removed. Tenant 2FA enrollment and email preference survive; recovered password sign-in still follows current 2FA.