The Challenge Object
A challenge is a single verification a user has to complete — an OTP, a magic link, a passkey prompt, etc. One challenge tracks one attempt at proving something: that the user owns this email, that they’re really the one signing in, that they consent to a sensitive action.Attributes
Unique identifier.
The app this challenge belongs to.
The user being challenged. May be empty for anonymous flows (e.g. a sign-up before the user record exists).
Why this challenge exists. One of:
authenticate— primary loginmfa— second factor after primary authstep_up— re-verify before a sensitive actionverify_contact— confirm an email or phone numberverify_identity— KYC / identity verificationchange_identifier— confirm a new email or phone before swappingcustom— triggered by you, for your own flow
How the user will prove themselves. One of:
email_otp, sms_otp, magic_link, totp, backup_code, webauthn, oauth, push, plaid_idvCurrent state. One of:
pending— issued, waiting on the usercompleted— user passedfailed— too many wrong attemptsexpired—expires_atpassed before completioncancelled— voided by you or the userdenied— explicitly rejected (e.g. user said “this wasn’t me”)
The email or phone the challenge was sent to, when applicable.
Free-form label for what action this challenge guards (e.g.
login, delete_account, wire_transfer). Useful for filtering and audit.Structured data describing the action. Echoed back when the challenge completes so you can act on it.
Who started the challenge:
user, admin, system, or your own value.ID of the initiator.
If this challenge is a follow-up to another (e.g. MFA after primary auth), the parent’s ID.
Number of guesses made so far.
How many guesses are allowed before the challenge fails. Default
3.max_attempts - attempts. Convenience field.Lifetime in seconds from creation. Default
600.Where the user is sent after completing a magic link or OAuth challenge.
Shareable short URL for magic-link and similar flows. Only present once a short token has been minted.
Arbitrary key/value data you attached when creating the challenge.
Additional context captured by Scute (request origin, flow hints, etc.).
User agent / device fingerprint of the requester, when available.
IP that initiated the challenge.
ISO 8601 timestamp.
When the challenge stops accepting answers.
When the OTP / magic link was successfully sent.
When the user first opened the magic link or OTP message, if tracked.
When the user passed the challenge.
When the challenge reached its final state (verified, failed, expired, cancelled, or denied).