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

# Create a payout

> Sends money from your wallet in `currency` to a recipient. The amount plus fee is reserved immediately.

Always send an `Idempotency-Key`: retrying with the same key returns the original payout instead of paying twice.
Listen for the `PAYOUT_COMPLETED` / `PAYOUT_FAILED` webhooks for the final result.

**API key scope:** `payouts:write`



## OpenAPI

````yaml POST /v1/payouts
openapi: 3.1.0
info:
  title: KryptaPay API
  version: 1.0.0
  description: >-
    Collect and pay out across Africa — Mobile Money, bank transfers and
    stablecoins — through one REST API.


    Authenticate every request with your secret API key: `Authorization: Bearer
    kp_<env>_…`.

    All responses use the envelope `{ "ok": boolean, "data"?: …, "error"?: {
    "code", "message", "details"? } }`.
  contact:
    name: KryptaPay Support
    email: support@krypta-pay.com
    url: https://krypta-pay.com
servers:
  - url: https://staging.api.krypta-pay.com
    description: Sandbox
  - url: https://api.krypta-pay.com
    description: Production
security:
  - apiKey: []
tags:
  - name: Payins
    description: Collect money from your customers' Mobile Money wallets.
  - name: Payouts
    description: Send money to Mobile Money wallets, bank accounts and crypto addresses.
  - name: Fees
    description: Know the exact fee before you move money.
  - name: FX
    description: Exchange rates, quotes and conversions between your wallets.
  - name: Wallets
    description: Balances of your multi-currency wallets.
  - name: Transactions
    description: Unified history of every movement on your account.
  - name: Networks
    description: Which payment networks are currently available.
  - name: Status
    description: Public platform status.
paths:
  /v1/payouts:
    post:
      tags:
        - Payouts
      summary: Create a payout
      description: >-
        Sends money from your wallet in `currency` to a recipient. The amount
        plus fee is reserved immediately.


        Always send an `Idempotency-Key`: retrying with the same key returns the
        original payout instead of paying twice.

        Listen for the `PAYOUT_COMPLETED` / `PAYOUT_FAILED` webhooks for the
        final result.


        **API key scope:** `payouts:write`
      operationId: createPayout
      parameters:
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                amount:
                  type: string
                  pattern: ^\d+(\.\d{1,8})?$
                  description: >-
                    Decimal amount with up to 8 fractional digits, e.g. "1500"
                    or "1500.75"
                currency:
                  $ref: '#/components/schemas/Currency'
                network:
                  $ref: '#/components/schemas/Network'
                recipient:
                  type: object
                  properties:
                    msisdn:
                      type: string
                      minLength: 6
                      maxLength: 20
                      description: >-
                        MSISDN, local or international format (digits only or
                        with a leading "+"), e.g. "97000000", "22997000000", or
                        "+22997000000". Required for mobile money networks.
                    iban:
                      type: string
                      minLength: 15
                      maxLength: 34
                    address:
                      type: string
                      minLength: 20
                      maxLength: 80
                    chain:
                      $ref: '#/components/schemas/Network'
                    fullName:
                      type: string
                      maxLength: 180
                    customerId:
                      type: string
                      maxLength: 120
                      description: Your own identifier for this recipient.
                    bankName:
                      type: string
                      maxLength: 120
                      description: >-
                        Informational only today — no payment provider reads
                        this field. Kept for display / forward-compatibility.
                    bankId:
                      anyOf:
                        - type: string
                        - type: number
                      description: >-
                        Informational only today — no payment provider reads
                        this field. Use bankCode instead.
                    bankCode:
                      type: string
                      maxLength: 20
                      description: >-
                        Bank code identifying the recipient's bank. Required for
                        BANK_NGN (along with accountNumber) — this is the field
                        payment providers actually read for Nigerian bank
                        transfers.
                    accountNumber:
                      type: string
                      maxLength: 64
                      description: >-
                        Recipient bank account number (e.g. Nigerian NUBAN).
                        Required for BANK_NGN, along with bankCode.
                  additionalProperties: false
                  description: >-
                    Which fields are required depends on `network`: mobile money
                    networks require msisdn; BANK_NGN requires accountNumber and
                    bankCode; crypto networks (ETH/POLYGON/TRON) require
                    address. Every other bank rail (BANK_XOF, BANK_XAF,
                    BANK_GHS, BANK_CDF, BANK_EUR, BANK_USD) is settled manually
                    by KryptaPay today, so at least one recipient identifier is
                    required but no specific field is enforced yet.
                description:
                  type: string
                  maxLength: 500
                category:
                  type: string
                  maxLength: 50
                  description: >-
                    Free-form label for your reporting (e.g. `salaries`,
                    `suppliers`).
              required:
                - amount
                - currency
                - network
                - recipient
              additionalProperties: false
            example:
              amount: '15000'
              currency: XOF
              network: MTN_BJ
              recipient:
                msisdn: '22997000000'
                fullName: Koffi Mensah
              description: 'Supplier payment #1042'
              category: suppliers
        required: true
      responses:
        '201':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                    enum:
                      - true
                  data:
                    type: object
                    properties:
                      id:
                        type: string
                      reference:
                        type: string
                      status:
                        $ref: '#/components/schemas/TransactionStatus'
                      amount:
                        type: string
                        pattern: ^\d+(\.\d{1,8})?$
                        description: >-
                          Decimal amount with up to 8 fractional digits, e.g.
                          "1500" or "1500.75"
                      currency:
                        $ref: '#/components/schemas/Currency'
                      fee:
                        type: string
                        pattern: ^\d+(\.\d{1,8})?$
                        description: >-
                          Decimal amount with up to 8 fractional digits, e.g.
                          "1500" or "1500.75"
                      network:
                        $ref: '#/components/schemas/Network'
                      description:
                        type:
                          - string
                          - 'null'
                      recipient:
                        type: object
                        properties:
                          msisdn:
                            type:
                              - string
                              - 'null'
                          iban:
                            type:
                              - string
                              - 'null'
                          address:
                            type:
                              - string
                              - 'null'
                          chain:
                            $ref: '#/components/schemas/Network'
                        required:
                          - msisdn
                          - iban
                          - address
                          - chain
                        additionalProperties: false
                      failureReason:
                        type:
                          - string
                          - 'null'
                      initiatedAt:
                        type: string
                      settledAt:
                        type:
                          - string
                          - 'null'
                      failedAt:
                        type:
                          - string
                          - 'null'
                      idempotencyKey:
                        type:
                          - string
                          - 'null'
                      approvedAt:
                        type:
                          - string
                          - 'null'
                      autoExecuted:
                        type: boolean
                        description: True when the payout was sent without manual approval.
                      frozen:
                        type: boolean
                        description: >-
                          True when the payout is on hold for compliance review.
                          It stays PENDING until cleared; do not resubmit it.
                    required:
                      - id
                      - reference
                      - status
                      - amount
                      - currency
                      - fee
                      - network
                      - description
                      - recipient
                      - failureReason
                      - initiatedAt
                      - settledAt
                      - failedAt
                      - idempotencyKey
                      - approvedAt
                      - autoExecuted
                      - frozen
                    additionalProperties: false
                required:
                  - ok
                  - data
                additionalProperties: false
              example:
                ok: true
                data:
                  id: cmgx2k1qv0001s60f8h3n5z7a
                  reference: tx_V1StGXR8Z5jdHi6BmyT
                  status: PROCESSING
                  amount: '15000'
                  currency: XOF
                  fee: '150'
                  network: MTN_BJ
                  description: 'Supplier payment #1042'
                  recipient:
                    msisdn: '22997000000'
                  failureReason: null
                  initiatedAt: '2026-10-27T10:15:00.000Z'
                  settledAt: null
                  failedAt: null
                  idempotencyKey: 4b17ddc6-4d7f-4d3e-a7d5-62e3c7f2d18d
                  approvedAt: '2026-10-27T10:15:00.000Z'
                  autoExecuted: true
                  frozen: false
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/ValidationError'
        '429':
          $ref: '#/components/responses/RateLimited'
components:
  parameters:
    IdempotencyKey:
      name: Idempotency-Key
      in: header
      required: false
      description: >-
        Unique key (a UUID is ideal) for this operation. Retrying with the same
        key returns the original result instead of creating a duplicate.
      schema:
        type: string
        maxLength: 128
  schemas:
    Currency:
      type: string
      enum:
        - XOF
        - XAF
        - NGN
        - GHS
        - CDF
        - EUR
        - USD
        - USDC
        - USDT
      description: ISO currency code (fiat) or stablecoin ticker.
    Network:
      type: string
      enum:
        - MTN_BJ
        - MTN_CI
        - MTN_CM
        - ORANGE_CI
        - ORANGE_SN
        - ORANGE_ML
        - ORANGE_BF
        - ORANGE_CM
        - MOOV_BJ
        - MOOV_TG
        - MOOV_CI
        - MOOV_BF
        - WAVE_CI
        - WAVE_SN
        - FREE_SN
        - TMONEY_TG
        - MOBICASH_ML
        - MOBICASH_BF
        - DJAMO_CI
        - MIXX_SN
        - MTN_CG
        - AIRTEL_CG
        - ORANGE_CD
        - AIRTEL_CD
        - VODACOM_CD
        - AFRICELL_CD
        - AIRTEL_GA
        - MOMO_NG
        - AIRTEL_NG
        - OPAY_NG
        - MTN_GH
        - VODAFONE_GH
        - AIRTELTIGO_GH
        - BANK_XOF
        - BANK_XAF
        - BANK_NGN
        - BANK_GHS
        - BANK_CDF
        - BANK_EUR
        - BANK_USD
        - ETH
        - POLYGON
        - TRON
      description: >-
        Payment network. See [Networks & currencies](/networks) for countries
        and limits.
    TransactionStatus:
      type: string
      enum:
        - PENDING
        - PROCESSING
        - COMPLETED
        - FAILED
        - CANCELLED
        - REFUNDED
      description: >-
        Lifecycle status. `COMPLETED`, `FAILED`, `CANCELLED` and `REFUNDED` are
        final.
    Error:
      type: object
      properties:
        ok:
          type: boolean
          enum:
            - false
        error:
          type: object
          properties:
            code:
              type: string
              description: Stable, machine-readable code. Branch on this, not on `message`.
            message:
              type: string
              description: Human-readable explanation. May change; do not parse.
            details:
              description: >-
                Extra context. For `validation_error`: `{ formErrors,
                fieldErrors }`.
          required:
            - code
            - message
      required:
        - ok
        - error
  responses:
    Unauthorized:
      description: Missing, invalid or expired API key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            ok: false
            error:
              code: unauthorized
              message: Invalid or expired API key
    Forbidden:
      description: >-
        The key lacks the required scope (`insufficient_scope`), or the account
        is not KYB-approved (`kyb_required`).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            ok: false
            error:
              code: kyb_required
              message: Your organization must complete KYB verification.
    Conflict:
      description: The resource is not in a state that allows this action.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            ok: false
            error:
              code: bad_status
              message: Cannot cancel in status PROCESSING
    ValidationError:
      description: >-
        The request failed validation or a business rule. See `error.code` and,
        for `validation_error`, `error.details.fieldErrors`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            ok: false
            error:
              code: validation_error
              message: 'amount: Invalid amount'
    RateLimited:
      description: >-
        Too many requests. Wait for the number of seconds in the `retry-after`
        header.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            ok: false
            error:
              code: rate_limited
              message: Rate limit exceeded, retry in 1 minute
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: >-
        Secret API key from **Dashboard → Developers**: `kp_sandbox_…` for
        Sandbox, `kp_live_…` for Production. Server-side only.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.