Skip to main content

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​

NameDescription
AuthorizationRequired. Bearer <access_token>
Content-TypeRequired. application/json

Body​

FieldTypeRequiredDescription
usersarrayYes1–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​

FieldTypeDescription
totalintegerRows in the request
successintegerRows that created a user
skippedintegerRows skipped for a known reason
failedintegerRows that failed unexpectedly
resultsarrayOne entry per row, in request order
results[].emailstringThe row's email; omitted when the row sent none
results[].external_idstringThe row's external_id; omitted when the row sent none
results[].user_idstringCreated user's ID; only on created rows
results[].statusstringcreated, skipped or failed
results[].reasonstringOn skipped rows: missing_email_and_external_id, duplicate_email, duplicate_external_id, duplicate_wallet or invalid_chain. On failed rows: free-text error

Errors​

StatusCodeDescription
40010015Validation 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.