Migrate Users With Wallets (Bulk)
Migrates up to 500 users that already have an address in one request. Each row is processed like the single endpoint and reported on its own: the request answers 200 even when some rows are skipped or failed. Every row is validated first; one invalid row (for example a missing chain_id) rejects the whole request.
Required permission: user:create
Request
POST /v2/users/migrate/with-wallet/bulk
Headers
| Name | Description |
|---|---|
Authorization | Required. Bearer <access_token> |
Content-Type | Required. application/json |
Body
| Field | Type | Required | Description |
|---|---|---|---|
users | array | Yes | 1–500 rows, each with the fields of the single endpoint (wallet_address and chain_id required on every row) |
Example
curl --request POST \
--url '{{baseUrl}}/v2/users/migrate/with-wallet/bulk' \
--header 'Authorization: Bearer <access_token>' \
--header 'Content-Type: application/json' \
--data '{
"users": [
{
"email": "alice@example.com",
"name": "Alice",
"surname": "Smith",
"wallet_address": "0x1111111111111111111111111111111111111111",
"chain_id": "6740e0a10000000000000101"
},
{
"external_id": "EXT-2042",
"wallet_address": "0x2222222222222222222222222222222222222222",
"chain_id": "6740e0a10000000000000101",
"kyc_sent": true
},
{
"email": "dup@example.com",
"wallet_address": "0x3333333333333333333333333333333333333333",
"chain_id": "6740e0a10000000000000101"
}
]
}'
Response
{
"total": 3,
"success": 2,
"skipped": 1,
"failed": 0,
"results": [
{ "email": "alice@example.com", "user_id": "6913872755654191dede37da", "status": "created" },
{ "external_id": "EXT-2042", "user_id": "6913872755654191dede37db", "status": "created" },
{ "email": "dup@example.com", "status": "skipped", "reason": "duplicate_email" }
]
}
Response Fields
| Field | Type | Description |
|---|---|---|
total | integer | Rows in the request |
success | integer | Rows that created a user |
skipped | integer | Rows skipped for a known reason |
failed | integer | Rows that failed unexpectedly |
results | array | One entry per row, in request order |
results[].email | string | The row's email; omitted when the row sent none |
results[].external_id | string | The row's external_id; omitted when the row sent none |
results[].user_id | string | Created user's ID; only on created rows |
results[].status | string | created, skipped or failed |
results[].reason | string | On skipped rows: missing_email_and_external_id, duplicate_email, duplicate_external_id, duplicate_wallet or invalid_chain. On failed rows: free-text error |
Errors
| Status | Code | Description |
|---|---|---|
| 400 | 10015 | Validation failed (empty users, more than 500 rows, a row without wallet_address / chain_id, a malformed email) — see details |
See Errors for the error format and common codes.