Payouts API

Create, retrieve, list, and cancel stablecoin payouts.

A payout sends stablecoin from your organization's balance to an on-chain address. See the payout lifecycle for how statuses progress and the reference overview for the payout object.

Create a payout

POST /v1/payouts — Scope: payouts:write

Creates a payout and starts its lifecycle: it is screened, then (if it clears and is within the auto-approval limit) executed on-chain. Use it whenever you need to pay a recipient.

Headers

HeaderRequiredDescription
X-API-KeyYesYour API key.
Content-TypeYesapplication/json
Idempotency-KeyYesA unique value per logical payout. Retries with the same key return the original payout. See Idempotency.

Body parameters

FieldTypeRequiredDescription
amountstringYesDecimal amount > 0, e.g. "25.00". Must be within your organization's limits and balance.
currencystringYesAsset to send. Must be supported on destination.network (see the matrix below).
railstringNoDefaults to "stablecoin" (the only supported value).
destinationobjectYesWhere to send. See sub-fields below.
destination.networkstringYesOne of polygon, arbitrum, optimism, base, bsc, ethereum, tron, solana.
destination.addressstringYesThe recipient address, valid for the network.
metadataobjectNoArbitrary key/value pairs echoed back on the payout. Use it to attach your own references.

Supported network / asset combinations

NetworkAssets
polygon, arbitrum, optimism, base, bsc, ethereumUSDC, USDT, ETH
tronUSDT
solanaUSDC, USDT

A combination outside this matrix returns 422 unsupported_destination.

Request

bash
curl https://api.caiboglobal.com/v1/payouts \
  -H "X-API-Key: $CAIBO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 6b2f1e0a-7c3d-4a91-9f2e-1a2b3c4d5e6f" \
  -d '{
    "amount": "25.00",
    "currency": "USDC",
    "rail": "stablecoin",
    "destination": {
      "network": "polygon",
      "address": "0x1234abcd5678ef901234abcd5678ef9012345678"
    },
    "metadata": { "invoice_id": "INV-1001" }
  }'

Response — 201 Created

Returns the payout. If the amount exceeds your auto-approval limit, the status is pending_approval and the HTTP status is 202 Accepted instead of 201.

json
{
  "id": "po_9f8e7d6c5b4a",
  "object": "payout",
  "status": "processing",
  "mode": "live",
  "amount": "25.00",
  "currency": "USDC",
  "rail": "stablecoin",
  "destination": {
    "network": "polygon",
    "address": "0x1234abcd5678ef901234abcd5678ef9012345678"
  },
  "screening_status": "clear",
  "tx_hash": null,
  "metadata": { "invoice_id": "INV-1001" },
  "created_at": "2026-07-23T14:03:00Z"
}

Behavior

  • Screening runs first, in-line. The destination is screened before anything is broadcast. A flagged destination yields 403 screening_blocked and a payout with status blocked; no funds move. See Compliance & screening.
  • Auto-approval. Amounts within your organization's auto-approval limit execute immediately; larger ones return 202 with status pending_approval and wait for a manual approval.
  • Idempotent. Reusing the Idempotency-Key with the same body returns the original payout; with a different body it returns 409 idempotency_conflict.
  • Webhooks. A successful create fires payout.created, then payout.processing and finally payout.completed (or payout.failed with a refund). A blocked payout fires payout.blocked. See Webhook events.

Errors

HTTPtypecodeWhen
400invalid_request_errorbad_requestMissing Idempotency-Key, malformed body, or an invalid amount.
401authentication_errorapi_key_missing / api_key_invalidNo key, or an unknown/revoked key.
403permission_errorscope_insufficientThe key lacks payouts:write.
403compliance_errorkyb_requiredLive mode with an unverified business.
403compliance_errorscreening_blockedThe destination was blocked by screening.
403compliance_errorlimit_exceededThe payout would breach a per-payout, daily, or monthly limit.
402invalid_request_errorinsufficient_balanceBalance below the amount.
409invalid_request_erroridempotency_conflictThe idempotency key was reused with a different request.
422invalid_request_errorunsupported_destinationUnsupported network/asset combination or an empty/invalid destination.
429rate_limit_errorrate_limitedToo many requests. Back off and retry.
503compliance_errorsanctions_unavailableLive-mode screening is temporarily unavailable; the payout was not sent. Retry later.

List payouts

GET /v1/payouts — Scope: payouts:read

Returns your organization's payouts, newest first, cursor-paginated.

Query parameters

ParameterTypeDescription
limitintegerPage size, 1–100. Defaults to 25.
starting_afterstringA payout id; returns the page after it. See Pagination.
statusstringFilter by a single status, e.g. completed.

Request

bash
curl "https://api.caiboglobal.com/v1/payouts?limit=25&status=completed" \
  -H "X-API-Key: $CAIBO_API_KEY"

Response — 200 OK

json
{
  "object": "list",
  "data": [
    {
      "id": "po_9f8e7d6c5b4a",
      "object": "payout",
      "status": "completed",
      "mode": "live",
      "amount": "25.00",
      "currency": "USDC",
      "rail": "stablecoin",
      "destination": { "network": "polygon", "address": "0x1234...5678" },
      "screening_status": "clear",
      "tx_hash": "0x8f3a9c2b1d4e5f60...",
      "created_at": "2026-07-23T14:03:00Z"
    }
  ],
  "has_more": true,
  "next_cursor": "po_9f8e7d6c5b4a"
}

Errors

HTTPtypecodeWhen
401authentication_errorapi_key_missing / api_key_invalidNo key, or an unknown/revoked key.
403permission_errorscope_insufficientThe key lacks payouts:read.
429rate_limit_errorrate_limitedToo many requests.

Retrieve a payout

GET /v1/payouts/{id} — Scope: payouts:read

Fetches a single payout by id. Returns 404 resource_missing if it doesn't exist or isn't yours.

bash
curl https://api.caiboglobal.com/v1/payouts/po_9f8e7d6c5b4a \
  -H "X-API-Key: $CAIBO_API_KEY"

Errors

HTTPtypecodeWhen
401authentication_errorapi_key_missing / api_key_invalidNo key, or an unknown/revoked key.
403permission_errorscope_insufficientThe key lacks payouts:read.
404invalid_request_errorresource_missingNo such payout for your organization.

Cancel a payout

POST /v1/payouts/{id}/cancel — Scope: payouts:write

Cancels a payout that hasn't started processing. Cancellable statuses are pending, screening, pending_approval, and approved. Once the payout is processing or in a terminal state, cancel returns 409 payout_not_cancelable. Cancelling releases any held balance.

bash
curl -X POST https://api.caiboglobal.com/v1/payouts/po_9f8e7d6c5b4a/cancel \
  -H "X-API-Key: $CAIBO_API_KEY"

Response — 200 OK

json
{
  "id": "po_9f8e7d6c5b4a",
  "object": "payout",
  "status": "cancelled",
  "amount": "25.00",
  "currency": "USDC",
  "created_at": "2026-07-23T14:03:00Z"
}

Errors

HTTPtypecodeWhen
401authentication_errorapi_key_missing / api_key_invalidNo key, or an unknown/revoked key.
403permission_errorscope_insufficientThe key lacks payouts:write.
404invalid_request_errorresource_missingNo such payout for your organization.
409invalid_request_errorpayout_not_cancelableThe payout is already processing or terminal.