Create Customer
POST/customersDescription
Create a customer (the person sending crypto). Returns a kyc_url to send the customer through identity verification, and the customer’s persistent deposit_addresses.
The customer must reach active status (KYC complete) before you can create a payout for them.
Headers
| Header | Description | Required |
|---|---|---|
| Authorization | Bearer token with your API key | yes |
| Content-Type | application/json | yes |
Request Body
| Name | Type | Description | Required |
|---|---|---|---|
| person | object | The individual: { "first_name", "last_name", "email" }. | yes |
| external_id | string | Your own reference for this customer (e.g., your internal user id). | no |
Example Request
const response = await fetch('https://checkout-api.exodus-int.com/customers', {
method: 'POST',
headers: {
Authorization: 'Bearer sk_live_xxxxxxxxxxxxxxxx',
'Content-Type': 'application/json',
},
body: JSON.stringify({
person: { first_name: 'Ada', last_name: 'Lovelace', email: '[email protected]' },
external_id: 'STU-12345',
}),
});Response
SUCCESSFUL RESPONSE
{
"id": "cus_9z8y7x",
"object": "customer",
"status": "kyc_pending",
"external_id": "STU-12345",
"kyc_url": "https://verify.exodus.com/v/abc123",
"deposit_addresses": [
{ "address": "0x369aF2…9EDd", "chains": ["ethereum", "arbitrum", "base", "polygon"], "tokens": ["USDC", "USDT"] },
{ "address": "GEhVdAGr…vpJMq", "chains": ["solana"], "tokens": ["USDC", "USDT"] }
],
"created_at": "2026-06-04T12:01:00Z"
}Redirect the customer to kyc_url. Listen for the customer.activated webhook
before creating a payout.
Error Responses
VALIDATION ERROR
{
"error": {
"type": "validation_error",
"message": "email is required",
"param": "person.email"
}
}