Payouts
/api/pay/v1/payoutsNewest first, cursor-paginated. Requires a PAYOUT-class key.
Authorization
bearerKey Authorization: Bearer clpay_live_<64 hex> for the checkout routes,
Authorization: Bearer clpay_payout_<64 hex> for the payout routes.
The wrong class on a route is PAY_WRONG_KEY_KIND (403).
A key may additionally carry an IP allowlist set in the business
console. Empty (the default) places no restriction; with entries, a
call from an unlisted address is UNAUTHORIZED (401).
In: header
Query Parameters
1 <= value <= 10025next_cursor from the previous page.
Return only payouts, or only refunds.
Value in
- "payout"
- "refund"
ISO 8601 lower bound on created_at.
date-timeISO 8601 upper bound on created_at.
date-timeResponse Body
application/json
curl -X GET "https://example.com/api/pay/v1/payouts"{ "data": [ { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "reference_id": "string", "kind": "payout", "status": "completed", "currency": "string", "amount": "string", "debited_amount": "string", "fee_amount": "string", "fee_percent": "string", "usd_value": "string", "payer_id": "7bded2ff-6743-4a0e-a147-77540fb16606", "payment_id": "d43b87f9-9e28-4802-8eaa-6ee91a40ea71", "comment": "string", "created_at": "2019-08-24T14:15:22Z", "settled_at": "2019-08-24T14:15:22Z" } ], "next_cursor": "string"}/api/pay/v1/payoutsSend coin from your business wallet to a Coinland customer. Requires a PAYOUT-class key.
This is synchronous. A 201 means the money has moved — your
business wallet is debited debited_amount and the recipient's spot
balance is credited exactly amount, in one transaction, before the
response is written. There is no pending state to poll.
Name the recipient in exactly ONE of two ways (sending both, or
neither, is PAY_RECIPIENT_INVALID):
payer_id— the opaque handle carried on every payment that customer has made to you. This is the ordinary path: you already hold the handle, nothing has to be looked up, and no email is sent over the wire.recipient_token+recipient_confirm— the email path, for paying someone who has never paid you. CallPOST /payouts/recipients/lookupfirst, show themasked_nameit returns to a human, and echo that string back VERBATIM asrecipient_confirm. Available only if Coinland has set your payout scope toany.
The fee is yours: the recipient receives exactly amount and your
wallet is debited amount + fee_amount, at the same tier rate your
payments are charged at. Retrying with the same reference_id and an
identical payload returns the original payout with 201 — it does not
pay twice.
Authorization
bearerKey Authorization: Bearer clpay_live_<64 hex> for the checkout routes,
Authorization: Bearer clpay_payout_<64 hex> for the payout routes.
The wrong class on a route is PAY_WRONG_KEY_KIND (403).
A key may additionally carry an IP allowlist set in the business
console. Empty (the default) places no restriction; with entries, a
call from an unlisted address is UNAUTHORIZED (401).
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/api/pay/v1/payouts" \ -H "Content-Type: application/json" \ -d '{ "reference_id": "payout-2291", "currency": "usdt", "amount": "25.00", "payer_id": "7c1e5b90-3f42-4a86-9d05-2b8e4c1f6a37", "comment": "Cashback for order 10492" }'{ "id": "9e3c7a41-0b52-4f18-8d6a-3c7e1f9b40d5", "reference_id": "payout-2291", "kind": "payout", "status": "completed", "currency": "usdt", "amount": "25.00", "debited_amount": "25.125", "fee_amount": "0.125", "fee_percent": "0.5", "usd_value": "25.00", "payer_id": "7c1e5b90-3f42-4a86-9d05-2b8e4c1f6a37", "payment_id": null, "comment": "Cashback for order 10492", "created_at": "2026-08-11T09:31:04.000Z", "settled_at": "2026-08-11T09:31:04.000Z"}/api/pay/v1/payouts/recipients/lookupTurn an email address into a short-lived, signed recipient_token you
can spend on POST /payouts. Requires a PAYOUT-class key, and is open
only to merchants whose payout scope Coinland has set to any —
otherwise it answers MERCHANT_PAYOUTS_DISABLED (403). An address
that cannot be paid — unknown, ineligible, or not fully verified —
answers PAY_RECIPIENT_INVALID (422), one code for every such case so
the endpoint cannot be used to probe who has an account.
The token is valid for 10 minutes, is bound to the merchant that minted it, and carries the resolved recipient inside its signature — the email itself never rides the payout request.
masked_name is a recognition aid, not an identification: show it to a
human, have them confirm it is who they meant, and pass it back as
recipient_confirm. A payout whose confirm does not match is refused.
This endpoint is deliberately not an address-existence oracle. An
unknown address, a disabled account and an account that has not
completed identity verification all answer the same
PAY_RECIPIENT_INVALID, and lookups are metered per merchant.
Authorization
bearerKey Authorization: Bearer clpay_live_<64 hex> for the checkout routes,
Authorization: Bearer clpay_payout_<64 hex> for the payout routes.
The wrong class on a route is PAY_WRONG_KEY_KIND (403).
A key may additionally carry an IP allowlist set in the business
console. Empty (the default) places no restriction; with entries, a
call from an unlisted address is UNAUTHORIZED (401).
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/api/pay/v1/payouts/recipients/lookup" \ -H "Content-Type: application/json" \ -d '{ "email": "customer@example.com" }'{ "recipient_token": "v1.eyJtZXJjaGFudElkIjo0Miwi….9f3c1d60ab72", "masked_name": "A**** B****", "expires_at": "2026-08-11T09:41:22.000Z"}/api/pay/v1/payouts/{id}The authoritative record — what payout.completed tells you to come
read. Requires a PAYOUT-class key.
Authorization
bearerKey Authorization: Bearer clpay_live_<64 hex> for the checkout routes,
Authorization: Bearer clpay_payout_<64 hex> for the payout routes.
The wrong class on a route is PAY_WRONG_KEY_KIND (403).
A key may additionally carry an IP allowlist set in the business
console. Empty (the default) places no restriction; with entries, a
call from an unlisted address is UNAUTHORIZED (401).
In: header
Path Parameters
Payout id (UUID) or your reference_id.
Response Body
application/json
application/json
curl -X GET "https://example.com/api/pay/v1/payouts/string"{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "reference_id": "string", "kind": "payout", "status": "completed", "currency": "string", "amount": "string", "debited_amount": "string", "fee_amount": "string", "fee_percent": "string", "usd_value": "string", "payer_id": "7bded2ff-6743-4a0e-a147-77540fb16606", "payment_id": "d43b87f9-9e28-4802-8eaa-6ee91a40ea71", "comment": "string", "created_at": "2019-08-24T14:15:22Z", "settled_at": "2019-08-24T14:15:22Z"}/api/pay/v1/payments/{id}/refundReturn coin to the customer who paid you. Requires a PAYOUT-class key.
Like a payout, it settles synchronously and answers with the same
object, under kind: "refund".
You name only the amount. The recipient and the currency come from the payment row, never from the request — a refund travels back the way the money came, and there is no field with which to send it somewhere else.
Partial refunds are allowed and can be repeated; what is capped is the
CUMULATIVE total, at the payment's charged_amount. Going over is
PAY_REFUND_EXCEEDS_PAYMENT (422).
Refunds are fee-exempt — fee_amount is "0" and
debited_amount == amount. Coinland keeps the fee charged on the
original payment and takes nothing further, so refunding costs you the
coin and nothing else. The original fee is not returned.
Authorization
bearerKey Authorization: Bearer clpay_live_<64 hex> for the checkout routes,
Authorization: Bearer clpay_payout_<64 hex> for the payout routes.
The wrong class on a route is PAY_WRONG_KEY_KIND (403).
A key may additionally carry an IP allowlist set in the business
console. Empty (the default) places no restriction; with entries, a
call from an unlisted address is UNAUTHORIZED (401).
In: header
Path Parameters
Payment id (UUID) or receipt number (CLP-…).
Request 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
curl -X POST "https://example.com/api/pay/v1/payments/string/refund" \ -H "Content-Type: application/json" \ -d '{ "reference_id": "refund-10492-1", "amount": "10.00", "comment": "One item returned" }'{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "reference_id": "string", "kind": "payout", "status": "completed", "currency": "string", "amount": "string", "debited_amount": "string", "fee_amount": "string", "fee_percent": "string", "usd_value": "string", "payer_id": "7bded2ff-6743-4a0e-a147-77540fb16606", "payment_id": "d43b87f9-9e28-4802-8eaa-6ee91a40ea71", "comment": "string", "created_at": "2019-08-24T14:15:22Z", "settled_at": "2019-08-24T14:15:22Z"}