Coinland PayDocs
API reference

Payouts

GET/api/pay/v1/payouts

Newest first, cursor-paginated. Requires a PAYOUT-class key.

Authorization

bearerKey
AuthorizationBearer <token>

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

limit?integer
Range1 <= value <= 100
Default25
cursor?string

next_cursor from the previous page.

kind?string

Return only payouts, or only refunds.

Value in

  • "payout"
  • "refund"
from?string

ISO 8601 lower bound on created_at.

Formatdate-time
to?string

ISO 8601 upper bound on created_at.

Formatdate-time

Response 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"}
POST/api/pay/v1/payouts

Send 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. Call POST /payouts/recipients/lookup first, show the masked_name it returns to a human, and echo that string back VERBATIM as recipient_confirm. Available only if Coinland has set your payout scope to any.

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
AuthorizationBearer <token>

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"}
POST/api/pay/v1/payouts/recipients/lookup

Turn 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
AuthorizationBearer <token>

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"}
GET/api/pay/v1/payouts/{id}

The authoritative record — what payout.completed tells you to come read. Requires a PAYOUT-class key.

Authorization

bearerKey
AuthorizationBearer <token>

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

id*string

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"}
POST/api/pay/v1/payments/{id}/refund

Return 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-exemptfee_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
AuthorizationBearer <token>

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

id*string

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"}