Skip to main content

Migrate User With Wallet (Single)

Creates one user together with a wallet holding an address the user already has. The address is trimmed, lower-cased and recorded as a self-custody wallet (custody: false) on the chain named by chain_id, labelled with the user's email (or external_id). Unless kyc_sent is true, the platform then sends its KYC token(s) to that address on every network of the chain, asynchronously. See the overview for the identity, KYC and duplicate rules.

Required permission: user:create

Request​

POST /v2/users/migrate/with-wallet

Headers​

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

Body​

FieldTypeRequiredDescription
wallet_addressstringYesThe user's existing address. Stored lower-cased
chain_idstringYesChain (chains id) the address lives on
emailstringNoEmail. Required when external_id is absent; must be a valid email when given
external_idstringNoOpaque identifier for KVKK-anonymized migration. Required when email is absent
namestringNoFirst name; not stored when empty
surnamestringNoLast name; not stored when empty
kyc_sentbooleanNoDefault false. true means KYC was already done: nothing is sent and the wallet is recorded as KYC-verified on every network of the chain

Example​

curl --request POST \
--url '{{baseUrl}}/v2/users/migrate/with-wallet' \
--header 'Authorization: Bearer <access_token>' \
--header 'Content-Type: application/json' \
--data '{
"email": "john@example.com",
"name": "John",
"surname": "Doe",
"wallet_address": "0xAbCdEf0123456789ABCDEF0123456789ABCDEF01",
"chain_id": "6740e0a10000000000000101",
"kyc_sent": false
}'

KVKK mode (identifier only):

curl --request POST \
--url '{{baseUrl}}/v2/users/migrate/with-wallet' \
--header 'Authorization: Bearer <access_token>' \
--header 'Content-Type: application/json' \
--data '{
"external_id": "EXT-1042",
"wallet_address": "0xAbCdEf0123456789ABCDEF0123456789ABCDEF01",
"chain_id": "6740e0a10000000000000101",
"kyc_sent": true
}'

Response​

Status Code: 201 Created

{
"id": "6913872755654191dede37da",
"external_id": "EXT-1042",
"name": "",
"surname": "",
"email": "",
"identity_number": "",
"status": 0,
"created_at": "2026-08-21T09:14:02.511Z",
"kyc": null
}

The created user, in the shape of Get User by ID. It carries no address; the imported wallet is in List User Wallets.

Errors​

StatusCodeDescription
40010015Validation failed (wallet_address or chain_id missing, malformed email) — see details
40010015Row skipped; message is the reason: missing_email_and_external_id, duplicate_email, duplicate_external_id, duplicate_wallet or invalid_chain
40010016chain_id is not a valid id

For imports where one bad row must not stop the rest, use Bulk or CSV. See Errors for the error format and common codes.