Create User
Creates a user. chain_id is optional and decides whether a custody wallet is created with the user:
- With
chain_id: a custody wallet is created asynchronously on that chain's default network. It appears in List User Wallets once the custody provider answers, and the platform then sends its KYC token to the new wallet on every network of the chain. - Without
chain_id: the user is created with no wallet. Add one later with Create User Wallet, or import existing addresses through the migration endpoints.
The server never picks a chain for you. The user is stored before the chain is checked: if chain_id does not resolve, the request answers 400 but the user already exists without a wallet. Add the wallet with Create User Wallet instead of repeating the create (the email is now taken).
Required permission: user:create
Request
POST /v2/users
Headers
| Name | Description |
|---|---|
Authorization | Required. Bearer <access_token> |
Content-Type | Required. application/json |
Body
| Field | Type | Required | Description |
|---|---|---|---|
email | string | Yes | Email address. Must be unique among live users |
name | string | Yes | First name |
surname | string | Yes | Last name |
identity_number | string | Yes | National identity number |
chain_id | string | No | Chain (24-character hex chains id) to create a custody wallet on. The chain must have a default network. Omit it to create the user without a wallet. Chains are listed by GET /v2/chains |
Example
curl --request POST \
--url '{{baseUrl}}/v2/users' \
--header 'Authorization: Bearer <access_token>' \
--header 'Content-Type: application/json' \
--data '{
"email": "burkay.durdu@rudiq.com",
"name": "Burkay",
"surname": "Durdu",
"identity_number": "11111111111",
"chain_id": "6740e0a10000000000000101"
}'
Response
Status Code: 201 Created
{
"id": "6a87455ad5f439809d488ac3",
"external_id": null,
"name": "Burkay",
"surname": "Durdu",
"email": "burkay.durdu@rudiq.com",
"identity_number": "11111111111",
"status": 0,
"created_at": "2026-08-21T09:14:02.511Z",
"kyc": null
}
The response has the shape of Get User by ID. It never contains a wallet: wallet creation is asynchronous.
Errors
| Status | Code | Description |
|---|---|---|
| 400 | 10015 | Validation failed (missing field, malformed email, chain_id not 24 hex characters) — see details |
| 400 | 10015 | chain not found, or chain has no default network configured. The user has already been created |
| 500 | 10000 | Store failure. A second user with an email already in use is refused by the database and currently surfaces here |
See Errors for the error format and common codes.