Which operations are affected
For secure card details, use the
POST form shown above — it is the only one that can
carry a passkey confirmation. On an SSO session the legacy GET form is refused.The flow
Step 1 — enrol the user (once per device)
An SSO user registers a passkey with the ordinary add-a-passkey endpoints, authenticated with theid_token they
already hold — with one extra step that only applies to SSO: the user must confirm a
code emailed to them before the passkey challenge is issued.
1
Start — a code is emailed
POST /v1/auth/passkey/register/start with Authorization: Bearer <id_token> and an
optional friendly_name (e.g. "My iPhone"). On an SSO program this does not
return publicKey. It emails the user a verification code and responds with:2
Start again — with the code
Collect the code from the user and call the same endpoint again, with the same body
plus Once the code is confirmed you get the normal response — a
email_code:session_token and
publicKey creation options — and continue as any other program would.3
On the device
Pass
publicKey to navigator.credentials.create() on web, or the platform credential
API on native — see the platform table.
The user confirms with fingerprint, face, or screen lock.4
Finish
POST /v1/auth/passkey/register/complete with the session_token and the attestation
the device produced.The email address used is the one held on the user’s Orenda account. If your identity
provider changes a user’s email, the code goes to the address we hold — not necessarily the
new one.
GET /v1/auth/passkey/credentials and let
users add one per device. Prompt for enrolment at a calm moment in your app, not in the
middle of a payment.
Step 2 — get a challenge
Immediately before the sensitive call:Step 3 — unlock on the device
Convert the base64url fields to byte arrays, callnavigator.credentials.get() (or the
native equivalent), and encode the result back to base64url. The
passkey sign-in page has the conversion helpers and native
platform notes — the mechanics are identical here.
Step 4 — send the confirmation
Add aconfirmation object to the operation’s request body:
confirmation shape used by every other step-up in the API — see
Confirm with a passkey.
Errors
Both are422, with the code in the response body:
The message on
SCA_MISSING names the accepted method: "Authentication is required (passkey)" for an SSO session, versus "Authentication is required (passkey, TOTP, or PIN)" elsewhere. Branch on the code, not the message text.Building for it
1
Ship enrolment with your first release
Add a passkey screen and prompt existing users. Without enrolled users, payees,
international payments, batches, invites, and card details are all unreachable.
2
Handle 422 as a prompt, not a failure
Treat
SCA_MISSING as “ask the user to confirm”, run the challenge, and retry the same
call. Do not surface it as an error.3
Check device support
Passkeys need WebAuthn. Detect support before you offer it — see the support
check — and tell users which of their
devices can enrol.
4
Ask us if you get stuck
Contact the team if enrolment or step-up doesn’t
behave as described here.