Skip to content

Create a reusable deposit address

POST/v1/deposit_addresses

Name exactly one of network, networks or family. The result is ONE DepositAddress per network: with family: "evm" the same address string on every enabled EVM network, each with its own id (payments reference the id of the network they arrived on). A name that already exists is returned, not duplicated (created: false, status 200).

Send your API key as a bearer token in the Authorization header. Secret API key: Authorization: Bearer ctp_live_sk_…. A publishable key (ctp_…_pk_…) is accepted by these operations only, which serve reference data: getRate, listAssets, listNetworks (each marked x-publishable-key: true). Every other operation refuses it with 403 publishable_key_not_allowed, whatever Origin the request carries: that header binds browsers, not other clients, and nothing on this API relies on it.

Name Type Description
Idempotency-Key string Makes the request safe to retry: the same key with the same request replays the first response (Idempotent-Replayed: true) for 24 hours; the same key with a different request is 422 idempotency_key_reused; while the first request is still running, 409 idempotency_request_in_progress with Retry-After. Only POST honours it. At most 255 characters. Pattern ^[!-~]+$.
Field Type Description
name string Your name for the address, unique per network. Creating a name that exists returns it. At most 64 characters.
network string One network slug. At least 2 characters, at most 32 characters.
networks array of strings Several networks of one family. At least 1 item, at most 32 items.
family string Every enabled network of a family: for evm, one address valid on all of them. One of evm, bitcoin, solana, tron.
Terminal window
curl -X POST "https://api.ctpeway.com/v1/deposit_addresses" \
-H "Authorization: Bearer $CTPEWAY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: <a-unique-key>" \
-d '{
"name": "Customer 42",
"family": "evm"
}'
Field Type Description
created boolean false when an address with this name already existed on every network asked for.
data array of objects One object per network. On EVM the same address on each.
data[].id string
data[].name optional string
data[].network string
data[].address string
data[].status string One of active, disabled, archived.
data[].created_at string (date-time)
data[].totals object What this address received on its network. Confirmed payments only: detected, orphaned and dropped payments are not counted.
data[].totals.payments integer Confirmed payments received.
data[].totals.usd_value string Their value in USD, each at the price it confirmed at. A decimal number written as a string, with up to 8 decimal places.
data[].totals.last_payment_at optional string (date-time) When the latest confirmed payment was detected. Absent while there is none.
data[].totals.received array of objects One entry per asset received, by asset symbol.
data[].totals.received[].asset string Asset symbol, e.g. USDT.
data[].totals.received[].asset_id string
data[].totals.received[].contract optional string
data[].totals.received[].decimals integer
data[].totals.received[].amount string Sum of the confirmed payments in this asset, base units. A whole number written as a string of digits.
data[].totals.received[].usd_value string Their value in USD, each at the price it confirmed at. A decimal number written as a string, with up to 8 decimal places.
data[].totals.received[].payments integer Confirmed payments in this asset.
data[].livemode boolean false for objects of the test environment.
{
"created": true,
"data": [
{
"id": "string",
"name": "string",
"network": "string",
"address": "string",
"status": "active",
"created_at": "2026-01-01T00:00:00.000Z",
"totals": {
"payments": 0,
"usd_value": "10.00",
"last_payment_at": "2026-01-01T00:00:00.000Z",
"received": [
{
"asset": "string",
"asset_id": "string",
"contract": "string",
"decimals": 0,
"amount": "1000000",
"usd_value": "10.00",
"payments": 0
}
]
},
"livemode": true
}
]
}

The values are placeholders generated from the schema. They show the shape, not real data.

Field Type Description
created boolean false when an address with this name already existed on every network asked for.
data array of objects One object per network. On EVM the same address on each.
data[].id string
data[].name optional string
data[].network string
data[].address string
data[].status string One of active, disabled, archived.
data[].created_at string (date-time)
data[].totals object What this address received on its network. Confirmed payments only: detected, orphaned and dropped payments are not counted.
data[].totals.payments integer Confirmed payments received.
data[].totals.usd_value string Their value in USD, each at the price it confirmed at. A decimal number written as a string, with up to 8 decimal places.
data[].totals.last_payment_at optional string (date-time) When the latest confirmed payment was detected. Absent while there is none.
data[].totals.received array of objects One entry per asset received, by asset symbol.
data[].totals.received[].asset string Asset symbol, e.g. USDT.
data[].totals.received[].asset_id string
data[].totals.received[].contract optional string
data[].totals.received[].decimals integer
data[].totals.received[].amount string Sum of the confirmed payments in this asset, base units. A whole number written as a string of digits.
data[].totals.received[].usd_value string Their value in USD, each at the price it confirmed at. A decimal number written as a string, with up to 8 decimal places.
data[].totals.received[].payments integer Confirmed payments in this asset.
data[].livemode boolean false for objects of the test environment.
{
"created": true,
"data": [
{
"id": "string",
"name": "string",
"network": "string",
"address": "string",
"status": "active",
"created_at": "2026-01-01T00:00:00.000Z",
"totals": {
"payments": 0,
"usd_value": "10.00",
"last_payment_at": "2026-01-01T00:00:00.000Z",
"received": [
{
"asset": "string",
"asset_id": "string",
"contract": "string",
"decimals": 0,
"amount": "1000000",
"usd_value": "10.00",
"payments": 0
}
]
},
"livemode": true
}
]
}

The values are placeholders generated from the schema. They show the shape, not real data.

A failed request answers with the error format described under Errors.

Besides the codes any endpoint can return, this endpoint can answer with these code values: