Skip to content

Verify passkey registration and store the credential

POST
/v1/mfa/passkeys/register/verify
curl --request POST \
--url https://api.aetherpush.com/v1/mfa/passkeys/register/verify \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "response": {}, "name": "example", "stepUp": { "type": "passkey", "response": {}, "code": "example" } }'

Session-only. Verifies the browser’s registration response against the stored challenge and persists the credential. Enrolling the account’s first passkey enables MFA and returns the recovery codes, which are shown exactly once. Enrolling an additional passkey on an account that already has MFA enabled requires a fresh step-up proof.

Media typeapplication/json
object
response
required

WebAuthn RegistrationResponseJSON, as returned by startRegistration() from @simplewebauthn/browser.

object
key
additional properties
any
name

Display name for the passkey. Defaults to “Passkey”.

string
>= 1 characters <= 100 characters
stepUp

Required only when enrolling an additional factor on an account that already has MFA enabled. Omitted for the first factor.

object
type
required
string
Allowed values: passkey totp
response

WebAuthn AuthenticationResponseJSON. Required when type is passkey.

object
key
additional properties
any
code

A current authenticator code. Required when type is totp.

string

Passkey stored.

Media typeapplication/json
object
passkey
required
object
id
required
string format: uuid
name
required
string
deviceType

singleDevice or multiDevice, as reported at registration.

string | null
backedUp
required
boolean
transports
required
Array<string>
createdAt
string format: date-time
lastUsedAt
string | null format: date-time
mfaEnabled
required
boolean
recoveryCodes

Present only when this registration enrolled the account’s first passkey. Shown exactly once; the server stores only hashes.

Array<string>
Examplegenerated
{
"passkey": {
"id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"name": "example",
"deviceType": "example",
"backedUp": true,
"transports": [
"example"
],
"createdAt": "2026-04-15T12:00:00Z",
"lastUsedAt": "2026-04-15T12:00:00Z"
},
"mfaEnabled": true,
"recoveryCodes": [
"example"
]
}

Invalid registration response, expired challenge, or bad name.

Media typeapplication/json
object
error
required

Human-readable error message.

string
requestId

Unique identifier for the request, also exposed as the X-Request-Id response header.

string
Example
{
"error": "The requested resource was not found.",
"requestId": "req_abc123"
}

Authentication required, or step-up is required and not satisfied (code: step_up_required).

Media typeapplication/json
One of:
object
error
required

Human-readable error message.

string
requestId

Unique identifier for the request, also exposed as the X-Request-Id response header.

string
Example
{
"error": "The requested resource was not found.",
"requestId": "req_abc123"
}

API keys and named access keys receive a plain 403. A login session that is not a dashboard login session receives code dashboard_session_required.

Media typeapplication/json
One of:
object
error
required

Human-readable error message.

string
requestId

Unique identifier for the request, also exposed as the X-Request-Id response header.

string
Example
{
"error": "The requested resource was not found.",
"requestId": "req_abc123"
}

The credential is already registered.

Media typeapplication/json
object
error
required

Human-readable error message.

string
requestId

Unique identifier for the request, also exposed as the X-Request-Id response header.

string
Example
{
"error": "The requested resource was not found.",
"requestId": "req_abc123"
}

Passkeys are not configured on this server.

Media typeapplication/json
object
error
required

Human-readable error message.

string
requestId

Unique identifier for the request, also exposed as the X-Request-Id response header.

string
Example
{
"error": "The requested resource was not found.",
"requestId": "req_abc123"
}