Sign up

Create a member account with an email address and password inside an existing organization. `organization_id` is required on this route. They are signed in straight away — the response carries the wallet and a session — and a confirmation email goes out at the same time. Until they confirm, `activated` on their wallet stays `false`; resend the code with `POST /auth/verification-code` if the first one goes astray. The email address has to be free within that organization. The same address may belong to different organizations, but cannot identify two accounts in the same one. For a passkey instead of a password, use `/wallets/connect/passkey/register/*`. For a crypto wallet they already own, use `/wallets/connect/eoa`. To create a standalone account that can start an organization, use `POST /organizations/wallets`. No sign-in needed — this is the sign-up.

POST
/wallets

Request Body

application/json

Who is signing up and the organization they are joining.

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

curl -X POST "https://api.dual.network/wallets" \  -H "Content-Type: application/json" \  -d '{    "organization_id": "665f1c2d4b1a2c3d4e5f6aa0",    "email": "alex@example.com",    "password": "<new password>",    "nickname": "alexf",    "language": "en"  }'
{
  "wallet": {
    "id": "665f1c2d4b1a2c3d4e5f6a01",
    "fqdn": "dual.network",
    "email": "alex@example.com",
    "nickname": "alexf",
    "language": "en",
    "activated": false,
    "disabled": false,
    "account": {
      "address": "0x1234567890abcdef1234567890abcdef12345678",
      "type": "SMART_WALLET",
      "controller": {
        "address": "0x9876543210fedcba9876543210fedcba98765432",
        "type": "SECP256K1",
        "custody": "self-custodial"
      },
      "smart_account": {
        "chain_id": 42161,
        "factory": "0x7777777777777777777777777777777777777777",
        "implementation": "0x8888888888888888888888888888888888888888",
        "index": 0,
        "validator": "0x9999999999999999999999999999999999999999",
        "validator_type": "ECDSA",
        "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": 13,
  "message": "internal error"
}