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

# Create payout

> Debit a wallet and send to a bank account or crypto wallet. `reference` is required and unique For crypto, pass `usdc` or `usdt` and a `chain` from GET /crypto/tokens. Do not send `contract_address`.



## OpenAPI

````yaml /openapi.json post /payouts
openapi: 3.0.0
info:
  title: Puplar Integrations API
  version: 1.0.0
  description: >-
    Public API for integrators using **secret keys** (`sk_test_*` /
    `sk_live_*`). Authenticated routes need only **`Authorization: Bearer
    <secret_key>`**. Test keys sandbox payments, virtual accounts, KYC, and bank
    resolve — see guides/test-vs-live for fixtures. Responses follow `{ message,
    data?, errors? }`. Includes customers, collections, payments, products,
    invoices, payouts, wallets, virtual accounts, crypto, refunds, and webhooks.
  contact:
    name: Puplar Support
    email: support@puplar.com
servers:
  - url: https://api.puplar.com
    description: Production
security: []
tags:
  - name: Customers
    description: Customer CRUD and KYC documents
  - name: Virtual accounts
    description: Funding instructions and test deposit simulation
  - name: Webhooks
    description: >-
      Webhook endpoints and delivery logs. Subscriber verification: HMAC-SHA256
      of raw body with webhook secret, header `X-Signature: sha256=<hex>`.
  - name: Payments
    description: One-time payment collection via hosted checkout links
  - name: Crypto
    description: EVM crypto wallet addresses and supported tokens
  - name: Collections
    description: Reusable checkout links
  - name: Products
    description: Catalog items for invoices. Amounts are minor units.
  - name: Invoices
    description: Draft → finalize → paid or void. Finalize returns a payment URL.
  - name: Payouts
    description: >-
      Send wallet funds to a bank account or crypto wallet. Duplicate
      `reference` returns 409.
  - name: Wallets
    description: >-
      Wallet balances per currency (available, pending, total). Amounts in minor
      units.
  - name: Misc
    description: >-
      Country-scoped bank list and account name lookup for payouts (e.g. `ng`
      for Nigeria).
  - name: Meta
    description: Health and service info
paths:
  /payouts:
    post:
      tags:
        - Payouts
      summary: Create payout
      description: >-
        Debit a wallet and send to a bank account or crypto wallet. `reference`
        is required and unique For crypto, pass `usdc` or `usdt` and a `chain`
        from GET /crypto/tokens. Do not send `contract_address`.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - reference
                - amount
                - currency
                - method
                - destination
              properties:
                reference:
                  type: string
                  example: wd_order_98234
                  description: Required unique payout reference. Omit → 422. Reuse → 409.
                amount:
                  type: integer
                  minimum: 1
                  example: 500000
                  description: Amount to debit from the wallet in minor units
                currency:
                  type: string
                  enum:
                    - usd
                    - ngn
                  example: ngn
                  description: Wallet currency to debit
                method:
                  type: string
                  enum:
                    - crypto
                    - bank_transfer
                  example: crypto
                destination:
                  type: object
                  required:
                    - currency
                  properties:
                    currency:
                      type: string
                      enum:
                        - usd
                        - ngn
                        - usdc
                        - usdt
                      example: usdc
                      description: >-
                        Rail currency. Fiat (`ngn`, `usd`) for `bank_transfer`;
                        token (`usdc`, `usdt`) for `crypto`. List networks with
                        GET /crypto/tokens.
                    crypto:
                      type: object
                      required:
                        - wallet_address
                        - chain
                      properties:
                        wallet_address:
                          type: string
                          example: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb'
                        chain:
                          type: string
                          example: polygon-pos
                          description: >-
                            Network id from that token on GET /crypto/tokens
                            (e.g. polygon-pos, ethereum). Not `evm`. Networks
                            differ by token.
                    bank_transfer:
                      type: object
                      required:
                        - account_number
                        - account_name
                      properties:
                        account_number:
                          type: string
                          example: '0123456789'
                        account_name:
                          type: string
                          example: ADA OBI
                        bank_code:
                          type: string
                          example: '058'
                          description: Required for NGN
                        bank_name:
                          type: string
                        routing_number:
                          type: string
                          description: USD ACH routing number
                        iban:
                          type: string
                        bic:
                          type: string
                description:
                  type: string
                  maxLength: 500
                metadata:
                  type: object
                  additionalProperties: true
      responses:
        '201':
          description: Payout created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Success'
        '400':
          description: Validation error, insufficient balance, or business not approved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Payouts are not enabled for this business
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          description: A payout with this reference already exists
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - bearerAuth: []
components:
  schemas:
    Success:
      type: object
      properties:
        message:
          type: string
          example: Success
        data:
          type: object
          nullable: true
    Error:
      type: object
      properties:
        message:
          type: string
          example: Error message
        data:
          type: object
          nullable: true
        errors:
          type: object
          nullable: true
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API Key
      description: >-
        Secret key: `Authorization: Bearer sk_test_...` or `sk_live_...`.
        Business and live/test mode are inferred from the key.

````