Payouts
/v1/payoutsAuthorization
apiKey Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.
The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding.
Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key.
A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.
The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.
In: header
Query Parameters
1 <= value <= 10025Opaque cursor from the previous page's next_cursor.
uuidValue in
- "ethereum"
- "bsc"
- "polygon"
- "arbitrum"
- "base"
- "avalanche"
- "tron"
- "solana"
- "ton"
- "bitcoin"
- "dogecoin"
- "optimism"
- "linea"
- "zksync"
- "scroll"
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/payouts"{ "object": "list", "has_more": true, "next_cursor": "string", "data": [ { "object": "payout", "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e", "chain": "ethereum", "asset": "USDT", "asset_id": "b4695157-0d1d-4da0-8f9e-5c53149389e4", "amount": "1500000000000000000", "fee_amount": "1500000000000000000", "to_address": "string", "memo": "string", "status": "queued", "reference": "string", "tx_hash": "string", "amount_usd": "string", "created_at": "2019-08-24T14:15:22Z", "updated_at": "2019-08-24T14:15:22Z" } ]}/v1/payoutsReturns 202 — accepted, not sent. The transaction hash arrives via the payout.submitted and payout.confirmed webhooks.
Idempotency-Key is REQUIRED: a retried POST without one can send funds twice.
decimals must match the asset's configured scale. This is checked because it is where the BSC trap bites — "1000000" is 1 USDT on Tron and 0.000000000001 USDT on BSC.
Above your auto-approve threshold the payout enters pending_approval and waits for a human. That is a safety feature, not an error.
Authorization
apiKey Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.
The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding.
Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key.
A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.
The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.
In: header
Header Parameters
REQUIRED. A retry without one can send funds twice, so the request is rejected outright.
length <= 255Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/payouts" \ -H "Idempotency-Key: string" \ -H "Content-Type: application/json" \ -d '{ "chain": "ethereum", "asset": "USDT", "decimals": 0, "amount": "string", "to_address": "string" }'{ "object": "payout", "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e", "chain": "ethereum", "asset": "USDT", "asset_id": "b4695157-0d1d-4da0-8f9e-5c53149389e4", "amount": "1500000000000000000", "fee_amount": "1500000000000000000", "to_address": "string", "memo": "string", "status": "queued", "reference": "string", "tx_hash": "string", "amount_usd": "string", "created_at": "2019-08-24T14:15:22Z", "updated_at": "2019-08-24T14:15:22Z"}/v1/payouts/{id}Authorization
apiKey Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.
The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding.
Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key.
A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.
The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.
In: header
Path Parameters
uuidResponse Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/payouts/497f6eca-6276-4993-bfeb-53cbbbba6f08"{ "object": "payout", "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e", "chain": "ethereum", "asset": "USDT", "asset_id": "b4695157-0d1d-4da0-8f9e-5c53149389e4", "amount": "1500000000000000000", "fee_amount": "1500000000000000000", "to_address": "string", "memo": "string", "status": "queued", "reference": "string", "tx_hash": "string", "amount_usd": "string", "created_at": "2019-08-24T14:15:22Z", "updated_at": "2019-08-24T14:15:22Z"}/v1/payouts/{id}/cancelReleases the reserved funds back to the customer's available balance. Once signing has begun the chain owns the transaction and cancellation is impossible.
Authorization
apiKey Authorization: Bearer mp<64 hex> for live, mptest<64 hex> for test.
The token is the prefix plus 64 lowercase hex characters (32 CSPRNG bytes) and nothing else — no separators, no embedded fields — so nothing in it needs quoting, escaping or encoding.
Send it in the Authorization header and nowhere else. Never put it in a query string: URLs reach access logs, proxy logs, browser history and Referer headers, and a key that lands in any of those is a leaked key.
A key's KIND (checkout, payout or wallet) is a property of the key, not of the string: it is chosen at creation, returned by GET /v1/ping, and decides which routes the key may reach.
The full key is shown exactly once, at creation. No endpoint can return it afterwards. Moving funds additionally requires signing to be enabled globally, for your project, and for that key — so a read-only key is a supported configuration.
In: header
Path Parameters
uuidResponse Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/payouts/497f6eca-6276-4993-bfeb-53cbbbba6f08/cancel"{ "object": "payout", "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e", "chain": "ethereum", "asset": "USDT", "asset_id": "b4695157-0d1d-4da0-8f9e-5c53149389e4", "amount": "1500000000000000000", "fee_amount": "1500000000000000000", "to_address": "string", "memo": "string", "status": "queued", "reference": "string", "tx_hash": "string", "amount_usd": "string", "created_at": "2019-08-24T14:15:22Z", "updated_at": "2019-08-24T14:15:22Z"}