- Docs
- Api%2Freference%2Fwallets%2FPasskeyRegisterVerify
Finish creating a passkey
Step two of registering a user with a passkey. Serialize the browser credential with `credential.toJSON()`, add the organization the new wallet belongs to, and send the resulting JSON here. We check the passkey really was made for us, in this browser, just now. Then we create the wallet, tie the passkey to it, and sign the person in — the response carries their wallet and a session, with nothing to confirm afterwards. From then on, the same passkey signs both sign-ins and the actions they take, so nothing about the account depends on a password. A passkey already tied to another wallet is refused. No sign-in needed — this is how a new user signs up.
Request Body
application/json
Browser credential JSON from credential.toJSON(), the required
organization_id, and any optional wallet metadata.
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
curl -X POST "https://api.dual.network/wallets/connect/passkey/register/verify" \ -H "Content-Type: application/json" \ -d '{ "id": "example_credential_id", "rawId": "example_credential_id", "type": "public-key", "response": { "clientDataJSON": "<base64url-encoded client data>", "attestationObject": "<base64url-encoded attestation object>", "transports": [ "internal" ] }, "organization_id": "665f1c2d4b1a2c3d4e5f6aa0", "nickname": "alexf", "email": "alex@example.com", "language": "en" }'{
"wallet": {
"id": "665f1c2d4b1a2c3d4e5f6a01",
"fqdn": "dual.network",
"email": "alex@example.com",
"nickname": "alexf",
"language": "en",
"activated": true,
"disabled": false,
"account": {
"address": "0x1234567890abcdef1234567890abcdef12345678",
"type": "SMART_WALLET",
"controller": {
"address": "0x9876543210fedcba9876543210fedcba98765432",
"type": "WEBAUTHN",
"custody": "self-custodial"
},
"smart_account": {
"chain_id": 42161,
"factory": "0x7777777777777777777777777777777777777777",
"implementation": "0x8888888888888888888888888888888888888888",
"index": 0,
"validator": "0x9999999999999999999999999999999999999999",
"validator_type": "WEBAUTHN",
"version": "0.3.1"
}
},
"when_created": "2026-02-01T09:00:00Z",
"when_modified": "2026-02-01T09:00:00Z"
},
"access_token": "<access token>",
"refresh_token": "<refresh token>"
}{
"code": 3,
"message": "Key: 'limit' Error:Field validation for 'limit' failed on the 'lte' tag"
}{
"code": 3,
"message": "limit must be 25 or less",
"details": {}
}{
"code": 13,
"message": "internal error"
}