> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cbpayapp.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Create a payout

> Disperses fiat to a local bank account. The local amount converts to USDT at **your account's rate** (the same one returned by `GET /v1/rates`); `usdt_amount` plus the fixed fee (when configured) is debited and held until the dispersal completes. If it fails, the full debit is refunded.

**Pay from any balance**: by default the debit comes from your account's default settlement asset (USDT unless changed via `PUT /v1/settlement`). Send `settlement_asset` (USDT, USDC, BTC or GOLD) to pay this specific operation from another balance: the USDT total converts to that asset at the effective settlement price of the moment (see the `settlement` block in `GET /v1/rates`) and the debit, hold and — if it fails — the refund all live in that asset for the exact same amount. If the execution price for BTC/GOLD is unavailable the request returns `503 pricing_unavailable`; volatile assets also have a per-operation limit (`422 settlement_limit_exceeded`).

Requires an idempotency key (body field or `Idempotency-Key` header). Retrying with the same key returns the original payout (`200` with `idempotency_hit: true`).



## OpenAPI

````yaml /openapi.yaml post /v1/payouts
openapi: 3.1.0
info:
  title: CBPay API
  version: '1.89'
  description: |
    CBPay is a multi-currency payment platform: fiat payouts and collections
    across Latin America, internal transfers, on-chain funding and
    withdrawals, and KYC screening. Every account holds four independent
    virtual balances — USDT (the operating currency), USDC, BTC and GOLD
    (grams of fine gold) — that never mix or convert automatically.
    Payouts and service fees can be paid from any of the four balances:
    set a default with `PUT /v1/settlement` or override per payout with
    `settlement_asset`.

    All amounts are decimal strings in each currency's precision (6 decimals
    for USDT/USDC/GOLD, 8 for BTC). Errors always return
    `{"error": "<code>", "message": "<detail>"}`.
servers:
  - url: https://api.qbank.cl/platform
    description: Live (production, real money)
  - url: https://cryptobank.qbank.cl/platform
    description: Test (sandbox, simulated money — pk_test_ keys)
security:
  - bearerAuth: []
tags:
  - name: Receipts
    description: >-
      Branded PDF receipt per operation, with a public signed-QR authenticity
      check, receipt_url on every response/webhook and automatic email delivery
      on final states.
  - name: Authentication
    description: Register and log in account members. Sessions last 24 hours.
  - name: Account
    description: Profile, members and API keys of the calling account.
  - name: Balances
    description: Balances, movement history and FX rates.
  - name: Payouts
    description: >-
      Fiat dispersals debited from the settlement balance of your choice (USDT
      by default).
  - name: Payins
    description: Fiat top-ups credited to the USDT balance.
  - name: Transfers
  - name: Contacts
  - name: Swaps
    description: >-
      Free internal transfers between CBPay accounts (person or company, any
      combination).
  - name: Crypto
    description: On-chain funding and withdrawals (TRON, Ethereum and Bitcoin).
  - name: Segregated wallets
    description: >-
      On-chain wallets with their own balance (companies unlimited; persons 1
      per network+asset pair) — create, import, send, export the private key and
      auto-forward. The balance lives on-chain, never in the ledger.
  - name: QR Crypto POS
    description: >-
      Amount-bearing crypto QR charges for processors with physical POS
      terminals (company accounts): verified merchants, exclusive address + QR
      per charge, early payment detection, per-merchant reconciliation and
      refunds over the crypto withdrawal rail.
  - name: KYC / KYB
  - name: AML screening
    description: >-
      Identity verification: KYC for persons, KYB for companies, with AML
      screening, rescreening and continuous monitoring.
  - name: Wallet screening
    description: >-
      AML risk assessment of blockchain addresses (sanctions, illicit-fund
      exposure) with a per-scan fee, plus free automatic protection on
      withdrawals and deposits.
  - name: Analytics
  - name: Webhooks
    description: Subscriptions to receive signed event notifications.
  - name: Status
    description: Service availability.
  - name: Banking
    description: >-
      Real bank accounts: receive, hold and send money over international
      banking rails.
  - name: Cards
    description: >-
      Virtual and physical cards that spend Just-In-Time from the account's USDT
      balance, with per-card spending limits.
  - name: Security (OTP)
    description: >-
      One-time verification codes over SMS/WhatsApp/email protecting sensitive
      actions, plus self-service 2FA preferences. Applies to user sessions only
      — API keys are exempt.
  - name: Passkeys
    description: >-
      Passwordless sign-in with the device's biometrics (Face ID, Touch ID,
      Windows Hello, security keys) via WebAuthn, authenticator apps (TOTP) with
      backup codes, and session/device management.
  - name: Social login
    description: >-
      Passwordless sign up and sign in with Google, Apple, Microsoft and
      Facebook via token exchange. The front end obtains the provider
      credential; the API verifies it and issues the CBPay session.
paths:
  /v1/payouts:
    post:
      tags:
        - Payouts
      summary: Create a payout
      description: >-
        Disperses fiat to a local bank account. The local amount converts to
        USDT at **your account's rate** (the same one returned by `GET
        /v1/rates`); `usdt_amount` plus the fixed fee (when configured) is
        debited and held until the dispersal completes. If it fails, the full
        debit is refunded.


        **Pay from any balance**: by default the debit comes from your account's
        default settlement asset (USDT unless changed via `PUT /v1/settlement`).
        Send `settlement_asset` (USDT, USDC, BTC or GOLD) to pay this specific
        operation from another balance: the USDT total converts to that asset at
        the effective settlement price of the moment (see the `settlement` block
        in `GET /v1/rates`) and the debit, hold and — if it fails — the refund
        all live in that asset for the exact same amount. If the execution price
        for BTC/GOLD is unavailable the request returns `503
        pricing_unavailable`; volatile assets also have a per-operation limit
        (`422 settlement_limit_exceeded`).


        Requires an idempotency key (body field or `Idempotency-Key` header).
        Retrying with the same key returns the original payout (`200` with
        `idempotency_hit: true`).
      operationId: createPayout
      parameters:
        - $ref: '#/components/parameters/idempotencyKeyHeader'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - country
                - currency
                - amount
              properties:
                country:
                  type: string
                  description: ISO 3166-1 alpha-2 destination country (e.g. CL, PE, MX).
                currency:
                  type: string
                  description: Local currency (e.g. CLP, PEN, MXN).
                method:
                  type: string
                  description: >-
                    Payout method from `GET /v1/payouts/methods` (e.g.
                    `bank_transfer`).
                amount:
                  type: string
                  description: Local currency amount as a positive decimal string.
                  example: '50000.00'
                beneficiary:
                  type: object
                  additionalProperties:
                    type: string
                  description: >
                    Destination account details. Required keys depend on the

                    country and method; see `GET /v1/payouts/methods` and

                    `GET /v1/payouts/banks`. Examples: RUT + bank in Chile,
                    CLABE in

                    Mexico, CCI in Peru. Brazil PIX: `pix_key` + `pix_key_type`
                    (cpf,

                    cnpj, phone, email, evp), or a bank account without key
                    using

                    `bank_code` (ISPB) + `branch_code` + `account_number` +
                    `tax_id`.

                    Ecuador (remittance corridor): `document_value` (cédula)
                    plus the

                    sender's data flat in the same object (`sender_name`,

                    `sender_document_value`, ...); optional structured names

                    (`given_name`, `first_surname`, ... and their `sender_*`
                    pairs)

                    take precedence over the automatic split of `name`.
                beneficiary_contact_id:
                  type: string
                  format: uuid
                  description: >-
                    Use the contact's most recent saved beneficiary for this
                    country (and method, when sent) instead of typing
                    `beneficiary` again. An explicit `beneficiary` always wins;
                    422 no_saved_destination if the contact has none.
                save_contact:
                  type: boolean
                  default: true
                  description: >-
                    The beneficiary is saved as a contact automatically; send
                    false to skip it.
                description:
                  type: string
                settlement_asset:
                  type: string
                  enum:
                    - USDT
                    - USDC
                    - BTC
                    - GOLD
                  description: >-
                    Virtual balance to debit for this operation. Omit to use
                    your account's default settlement asset (USDT unless changed
                    via `PUT /v1/settlement`).
                idempotency_key:
                  type: string
            examples:
              cl_bank_transfer:
                summary: Chile — bank transfer (CLP)
                value:
                  country: CL
                  currency: CLP
                  method: bank_transfer
                  amount: '100000'
                  beneficiary:
                    name: Pedro Soto Fuentes
                    tax_id: 12.345.678-5
                    bank_code: '012'
                    account_type: checking
                    account_number: '123456789'
                  description: Supplier payment
                  idempotency_key: cl-prov-0091
              pe_bank_transfer:
                summary: Peru — bank transfer via CCI (PEN)
                value:
                  country: PE
                  currency: PEN
                  method: bank_transfer
                  amount: '1000.00'
                  beneficiary:
                    name: Rosa Alvarez Diaz
                    account_number: 219300123456789020
                  idempotency_key: pe-cci-3310
              pe_yape:
                summary: Peru — Yape to a phone number (PEN)
                value:
                  country: PE
                  currency: PEN
                  method: yape
                  amount: '150.00'
                  beneficiary:
                    name: Luis Ramos Vega
                    phone: '51987654321'
                  idempotency_key: pe-yape-8874
              mx_clabe:
                summary: Mexico — SPEI to a CLABE (MXN)
                value:
                  country: MX
                  currency: MXN
                  method: bank_transfer
                  amount: '1500.00'
                  beneficiary:
                    name: Maria Lopez
                    account_type: clabe
                    account_number: 12180001234567896
                  idempotency_key: mx-clabe-8841
              mx_debit_card:
                summary: Mexico — SPEI to a debit card (MXN)
                value:
                  country: MX
                  currency: MXN
                  method: bank_transfer
                  amount: '800.00'
                  beneficiary:
                    name: Jorge Herrera
                    account_type: debit_card
                    account_number: '4152313412341234'
                    bank_code: '40012'
                  idempotency_key: mx-card-1102
              ve_pago_movil:
                summary: Venezuela — Pago Móvil (VES)
                value:
                  country: VE
                  currency: VES
                  method: pago_movil
                  amount: '2000.00'
                  beneficiary:
                    phone: '04141234567'
                    bank_code: '0102'
                    document_value: V12345678
                  idempotency_key: ve-pm-5567
              ve_bank_transfer:
                summary: Venezuela — bank transfer (VES)
                value:
                  country: VE
                  currency: VES
                  method: bank_transfer
                  amount: '5000.00'
                  beneficiary:
                    name: Carmen Delgado
                    account_number: 1020123456789012400
                    document_value: V87654321
                  idempotency_key: ve-bank-7810
              bo_bank_transfer:
                summary: Bolivia — ACH transfer (BOB)
                value:
                  country: BO
                  currency: BOB
                  method: bank_transfer
                  amount: '1382.00'
                  beneficiary:
                    name: Juan Quispe Mamani
                    tax_id: '4567890'
                    bank_code: '1016'
                    account_number: '1234567890'
                  idempotency_key: bo-ach-2204
              br_pix:
                summary: Brazil — PIX by key (BRL)
                value:
                  country: BR
                  currency: BRL
                  method: pix
                  amount: '350.00'
                  beneficiary:
                    name: João da Silva
                    tax_id: 123.456.789-09
                    pix_key_type: cpf
                    pix_key: '12345678909'
                  idempotency_key: br-pix-3321
              ec_bank_transfer:
                summary: Ecuador — bank transfer (USD, remittance with sender data)
                value:
                  country: EC
                  currency: USD
                  method: bank_transfer
                  amount: '250.00'
                  beneficiary:
                    name: Carlos Andrade Vera
                    document_value: '1712345678'
                    account_number: '2203456789'
                    sender_name: Ana Torres Silva
                    sender_document_value: V23456789
                    sender_country: US
                  idempotency_key: ec-bank-4471
              ec_deuna:
                summary: Ecuador — DE UNA wallet by mobile number (USD)
                value:
                  country: EC
                  currency: USD
                  method: deuna
                  amount: '80.00'
                  beneficiary:
                    name: Lucia Paredes Mora
                    document_value: '0923456781'
                    phone: '0998765432'
                    sender_name: Ana Torres Silva
                  idempotency_key: ec-deuna-5520
              ec_cash_pickup:
                summary: Ecuador — cash pickup at a branch (USD)
                value:
                  country: EC
                  currency: USD
                  method: cash_pickup
                  amount: '120.00'
                  beneficiary:
                    name: Miguel Zambrano Loor
                    document_value: '1309876543'
                    sender_name: Ana Torres Silva
                  idempotency_key: ec-cash-6612
              ec_cnb:
                summary: Ecuador — cash at a non-bank correspondent (USD)
                value:
                  country: EC
                  currency: USD
                  method: cnb
                  amount: '60.00'
                  beneficiary:
                    name: Rosa Cedeño Vera
                    document_value: '0801234567'
                    sender_name: Ana Torres Silva
                  idempotency_key: ec-cnb-7703
              py_bank_transfer:
                summary: Paraguay — bank transfer (PYG)
                value:
                  country: PY
                  currency: PYG
                  method: bank_transfer
                  amount: '500000'
                  beneficiary:
                    name: Sofia Benitez
                    tax_id: '4123456'
                    bank_code: '0011'
                    account_number: '600123456'
                  idempotency_key: py-bank-9917
              cl_paid_from_btc:
                summary: Chile — paid from the BTC balance (settlement_asset)
                value:
                  country: CL
                  currency: CLP
                  method: bank_transfer
                  amount: '100000'
                  beneficiary:
                    name: Pedro Soto Fuentes
                    tax_id: 12.345.678-5
                    bank_code: '012'
                    account_type: checking
                    account_number: '123456789'
                  settlement_asset: BTC
                  idempotency_key: cl-btc-0192
      responses:
        '200':
          description: Idempotency replay of an existing payout.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Payout'
              example:
                payout_id: 7d5c2f0a-1e9b-4a6d-8f3c-0b2a1d9e8c7f
                account_id: 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d
                idempotency_key: invoice-8841
                country: MX
                currency: MXN
                method: bank_transfer
                local_amount: '1500.00'
                fx_rate: '17.50'
                usdt_amount: '85.714286'
                fee: '0.300000'
                total_debit: '86.014286'
                settlement_asset: USDT
                settlement_amount: '86.014286'
                settlement_rate: '1'
                beneficiary:
                  name: Maria Lopez
                  account_type: clabe
                  account_number: 12180001234567896
                description: Invoice 8841
                status: processing
                status_code: ''
                status_message: ''
                created_at: '2026-07-07T12:00:00Z'
                updated_at: '2026-07-07T12:00:00Z'
                idempotency_hit: true
        '202':
          description: Payout accepted and dispatching.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Payout'
              example:
                payout_id: 7d5c2f0a-1e9b-4a6d-8f3c-0b2a1d9e8c7f
                account_id: 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d
                idempotency_key: invoice-8841
                country: MX
                currency: MXN
                method: bank_transfer
                local_amount: '1500.00'
                fx_rate: '17.50'
                usdt_amount: '85.714286'
                fee: '0.300000'
                total_debit: '86.014286'
                settlement_asset: USDT
                settlement_amount: '86.014286'
                settlement_rate: '1'
                beneficiary:
                  name: Maria Lopez
                  account_type: clabe
                  account_number: 12180001234567896
                description: Invoice 8841
                status: processing
                status_code: ''
                status_message: ''
                created_at: '2026-07-07T12:00:00Z'
                updated_at: '2026-07-07T12:00:00Z'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/InsufficientFunds'
        '403':
          description: >-
            Account not active (`account_blocked`) or missing account
            credential.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: account_blocked
                message: account is not active
        '422':
          description: |
            No FX rate for the currency (`currency_not_supported`), or the
            payout was rejected upfront — the response is the payout object
            with `status: failed` and the debit already refunded.
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/Error'
                  - $ref: '#/components/schemas/Payout'
              example:
                payout_id: 7d5c2f0a-1e9b-4a6d-8f3c-0b2a1d9e8c7f
                account_id: 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d
                idempotency_key: invoice-8841
                country: MX
                currency: MXN
                method: bank_transfer
                local_amount: '1500.00'
                fx_rate: '17.50'
                usdt_amount: '85.714286'
                fee: '0.300000'
                total_debit: '86.014286'
                settlement_asset: USDT
                settlement_amount: '86.014286'
                settlement_rate: '1'
                beneficiary:
                  name: Maria Lopez
                  account_type: clabe
                  account_number: 12180001234567896
                description: Invoice 8841
                status: failed
                status_code: core_rejected
                status_message: beneficiary account is invalid
                created_at: '2026-07-07T12:00:00Z'
                updated_at: '2026-07-07T12:00:00Z'
        '503':
          description: >-
            The payout channel is temporarily unavailable
            (`channel_unavailable`); retry later with the SAME idempotency key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: channel_unavailable
                message: >-
                  the payout channel is temporarily unavailable, please retry
                  later
components:
  parameters:
    idempotencyKeyHeader:
      name: Idempotency-Key
      in: header
      required: false
      description: Alternative to the `idempotency_key` body field.
      schema:
        type: string
  schemas:
    Payout:
      type: object
      properties:
        payout_id:
          type: string
          format: uuid
        account_id:
          type: string
          format: uuid
        idempotency_key:
          type: string
        country:
          type: string
        currency:
          type: string
        method:
          type: string
        local_amount:
          type: string
        fx_rate:
          type: string
          description: Your account's rate at execution time (local units per 1 USDT).
        usdt_amount:
          type: string
        fee:
          type: string
        total_debit:
          type: string
        settlement_asset:
          type: string
          enum:
            - USDT
            - USDC
            - BTC
            - GOLD
          description: Virtual balance the operation was actually debited from.
        settlement_amount:
          type: string
          description: >-
            Exact amount debited from the settlement asset's balance (in that
            asset's units). Equals `total_debit` when the asset is USDT. If the
            payout fails this exact amount is refunded — never re-quoted.
        settlement_rate:
          type: string
          description: >-
            Effective USD price per unit of the settlement asset used to convert
            the USDT total ("1" for USDT/USDC).
        beneficiary:
          type: object
        description:
          type: string
        status:
          type: string
          enum:
            - pending
            - processing
            - completed
            - failed
        status_code:
          type: string
        status_message:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        idempotency_hit:
          type: boolean
          description: Present (true) when the response is an idempotent replay.
    Error:
      type: object
      properties:
        error:
          type: string
          description: Machine-readable error code (snake_case).
          example: insufficient_funds
        message:
          type: string
          description: Human-readable explanation.
  responses:
    BadRequest:
      description: Invalid request (see `error` code for the specific validation).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: invalid_json
            message: 'request body is not valid JSON: unknown field'
    Unauthorized:
      description: Missing or invalid credential (`unauthorized`).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: unauthorized
            message: invalid or missing credentials
    InsufficientFunds:
      description: Account balance is not enough for this operation (`insufficient_funds`).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: insufficient_funds
            message: account balance is not enough for this operation
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: |
        Session JWT (from register/login) or API key (`pk_...`).
        `X-API-Key: <token>` is accepted as an alternative header.

````