What you do first
- Confirm the browser supports WebAuthn (Chrome/Edge 108+, Safari 16+, Firefox 119+) before you offer passkeys.
- Register at least one passkey for the user (
POST /auth/passkeyRegistrationOptions, then create the credential, thenPOST /auth/passkeys). - Create a challenge with
POST /auth/challengesandmethod: "passkey". - Run WebAuthn on the device, then verify with
POST /auth/verifiedChallengesand the assertion. - Store the access and refresh tokens the same way you would for OTP.
relyingParty, publicKeyCredentialParameters, algorithm values like ES256), map those to WebAuthn COSE ids in your client.
Supported algorithms: ES256 (preferred for broad device support), RS256, EdDSA, ES384, ES512.
States that matter
Usernameless (recommended)
Omit the identifier. The API returns an emptyallowCredentials list; the browser discovers passkeys on the device.
Username-first
SendphoneNumber or emailAddress on the challenge. Use this when the user prefers to enter an identifier, or as a fallback when usernameless fails.
All Guile passkeys are discoverable (residentKey: "required"). Users can list and delete passkeys, and register more than one device.
When a call fails
Failures come back as problem documents. Open thetype link for the cause, the
fix, and whether retrying is safe.
Common ones on this path:
- Invalid Passkey Assertion: offer OTP on the same challenge API
- Passkey Already Registered: list existing passkeys before registering again
- Challenge Expired: create a new passkey challenge
- Unauthorized: refresh or sign in again before manage calls
Related paths
- Authentication overview: tokens and OTP
- Problem types: how to read a failure