Headless Payout

🚧

Note: This endpoint is only available to merchants configured by the Breeze team. Please reach out to the Breeze team to get access.

This guide explains how to trigger payouts to KYC-approved customers directly via the Breeze API, without any Breeze-hosted pages or redirects. You own the entire customer-facing experience — Breeze handles bank rail selection, fund management, and transfer processing under the hood.

ℹ️

Bank payouts only. Headless Payout currently supports bank account payouts. Card and crypto wallet payouts are not yet available through this endpoint — use a Payout Page if you need those methods today.

Card data & PCI (future). If card payout support is added to Headless Payout, your PCI obligations will depend on how you collect card fields: to minimize your own scope, capture them with a PCI-compliant tokenization provider rather than handling raw card numbers on your servers; if you handle raw card data, you are responsible for your own PCI compliance. Confirm the exact card-collection and PCI setup with your Breeze onboarding contact.

Prerequisites

  1. This endpoint requires the customer to have been KYC-verified via the Headless KYC API with an approved status. See Headless KYC to set this up first before proceeding.
  2. Either the customerId or customerReferenceId from the Headless KYC API call should be passed in as customer.id or customer.referenceId when creating the Payout Page.

How It Works (Conceptual Overview)

sequenceDiagram
    participant Merchant
    participant Customer
    participant Breeze

    Note over Merchant: Step 1 – Verify KYC is approved
    Merchant->>Breeze: GET /v1/headless_kyc?customerReferenceId={id}
    Breeze-->>Merchant: Return KYC status = approved

    Note over Merchant, Breeze: Step 2 – Trigger payout
    Merchant->>Breeze: POST /v1/headless_payout (customer ID + amount + bank details)
    Breeze->>Breeze: Verify KYC status, check balance, select rail
    Breeze-->>Merchant: Payout initiated

    Note over Merchant, Customer: Step 3 – Notify customer
    Merchant->>Customer: Notify of payout status in your UI

Integration Steps

Step 1 — Verify KYC is Approved

Before triggering a payout, confirm the customer's KYC status is approved either by listening to the webhooks, or by polling. See Step 4 — Handling Updates from Breeze for more details.

❗️

Do not proceed until the status is approved. If the status is pending, wait for Breeze's review to complete (<24h SLA). Attempting to trigger a payout for a customer without an approved status will result in an error.


Step 2 — Create a Headless Payout

To trigger a payout, send a POST request to the Breeze API. See 📄 API Reference — Create a headless payout for the full request/response schema.

curl -X POST 'https://api.breeze.cash/v1/headless_payout' \
  -u "YOUR_API_KEY:" \
  --header 'Content-Type: application/json' \
  --data-raw '{
    "clientReferenceId": "payout-ref-001",
    "amount": 1000,
    "currency": "USD",
    "releaseMethod": "AUTOMATIC",
    "customer": {
      "referenceId": "<your-unique-user-id>",
      "email": "[email protected]"
    },
    "bankAccount": {
      "routingNumber": "021000021",
      "accountNumber": "123456789",
      "accountType": "checking"
    }
  }'

This endpoint is idempotent on clientReferenceId.

Request Payload

FieldTypeRequiredNotes
amountnumberAmount in cents
currencystringOnly USD is supported
clientReferenceIdstringYour unique ID for this payout (idempotency key)
releaseMethodstringMANUAL or AUTOMATIC
customer.emailstringThe customer's email address
customer.id / customer.referenceIdstringPass at most one — the customerId or customerReferenceId from Headless KYC
bankAccount.routingNumberstringBank routing number (9 digits)
bankAccount.accountNumberstringBank account number (4–17 digits)
bankAccount.accountTypestringchecking or savings

What Breeze Does

Upon receiving the request, Breeze will:

  • Verify the customer's approved KYC status
  • Check your pre-funded balance (queues payout if insufficient)
  • Attach the KYC-verified legal name to the transfer
  • Auto-select RTP (near-instant) or ACH (1–3 business days) based on the receiving bank's capability

    ⚠️

    Name-match risk: The receiving bank checks the transfer name against the account holder. A mismatch will result in the transfer being returned (typically 2–5 business days). Returned funds are automatically re-credited to your balance.


Step 3 — Handle Payout Status Updates via Webhooks

Breeze sends webhook notifications to your configured endpoint whenever a payout status changes. You should not rely on the initial API response alone — implement webhook handling to track the full lifecycle of each payout.

See Webhook Events for Payout Pages for the full list of events and payload details.

See Payout Page Statuses and Sub-Statuses for the full breakdown of statuses and sub-statuses.

Once the payout is initiated, notify your user of the status within your own UI. You are responsible for all customer-facing communication.

Handling Refunds

⚠️

You are responsible for handling the refund flow on your end. When a payout is returned by the receiving bank (e.g. due to a name mismatch or invalid account), Breeze will re-credit the funds to your balance and set the payout status to REFUNDED. You must listen for this status via webhook and handle the downstream impact to your user — including notifying them of the failed payout and prompting them to resubmit with corrected bank details if applicable.


Balance Management

ScenarioBehavior
Top-upVia wire transfer, ACH push, or crypto
Insufficient balancePayout is queued, not rejected
Returned payoutAutomatically re-credited to your balance
Low-balance alertsThreshold configurable — contact Breeze team


Did this page help you?