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.

POST
/wallets/connect/passkey/register/verify

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"
}