Skip to Content
MuoCeon Docs
v1auth context

Verification challenges

Email, password, passkey, authenticator and recovery-code endpoints, plus how a failed challenge is reported.

Verification challenges are the middle steps of the sign-in / registration flow. Every endpoint takes the flow token in Authorization: Bearer and returns a rotated flow token on success.

Endpoints

MethodPathPurpose
POST/verify/emailSend a code to an email address
POST/verify/email/confirmSubmit the email code
POST/verify/passwordVerify the password
POST/verify/passkeyGet a passkey assertion challenge
POST/verify/passkey/confirmSubmit the passkey assertion
POST/verify/authenticatorVerify a TOTP code
POST/verify/recovery-codeVerify a recovery code

Email

POST /verify/email

ParameterTypeRequiredNotes
emailstring✅Destination address, 3–255 chars; trimmed and lowercased
{ "success": true, "flow_token": "eyJhbGciOi..." }

In registration the address is stored as the pending email. In sign-in it is compared against the methods recorded in the flow token, and a mismatch returns success without sending mail.

POST /verify/email/confirm

ParameterTypeRequiredNotes
codestring✅Code from the email, 4–32 chars

The code is matched against the pending codes stored inside the flow token; on success the address is marked verified in the flow.

Password

ParameterTypeRequiredNotes
passwordstring✅1–128 chars

During sign-in it is compared against the stored hash; during registration the bcrypt hash is staged in the flow token and persisted when the flow completes.

Passkey

POST /verify/passkey

No body. Returns PublicKeyCredentialRequestOptions with allowCredentials populated from the account's registered passkeys.

{ "options": { "challenge": "...", "allowCredentials": [] }, "flow_token": "eyJ..." }

POST /verify/passkey/confirm

The body is an AuthenticationResponseJSON, passed through to the WebAuthn check against the stored challenge and credential public key.

Authenticator (TOTP)

ParameterTypeRequiredNotes
codestring✅Six-digit code

Recovery code

ParameterTypeRequiredNotes
codestring✅Single-use code, 8–32 chars

Codes are stored hashed; a match consumes the code and removes it from the set.

How failures are reported

EndpointFailure shape
Passkey confirm200 with success: false, plus a new flow_token
Authenticator TOTP400 with success: false, plus a new flow_token
Recovery code400 with success: false, plus a new flow_token

Failures still return a flow token

The client needs the new flow token to retry. If a failure were reported through a 4xx error body, the token could not come back and the user would have to restart sign-in. Passkey confirm therefore always uses 200 to express "this assertion did not pass", never a status code.

On this page