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

# Pay out at an accepted quote

> **Scope:** `payouts:write`

`type` says where the money goes, and you send the one object it names: `qr` — `{"content": …}`, the QR your end user scanned — or `bank_transfer`, a Bolivian bank account. **`bank_transfer` is not available yet**: it is validated, then answered `422 PAYOUT_TYPE_NOT_AVAILABLE`, so you can build against it now. Sending the other type's object is a `400`.

Send it with the `quote_id` your end user accepted. It is paid at once and the answer says how it ended: `completed`, debiting exactly the quote's `source.amount`; `cancelled`, `rejected` or `failed` with `error.code` saying why — nothing is debited then; or, rarely, `processing` while the network's answer is late — poll `GET /payouts/{id}` or wait for the webhook; sending the same request again (same `transaction_id` and body) is always safe. An open-amount QR is paid the quote's `target.amount`. When the quote named a `resolution_id`, the payout carries it too, in its answer and its webhooks.

**`transaction_id` is your own id and the idempotency key.** One transaction id is one payment: sending it again with the same body returns the same payment, so retrying after a timeout or a `503` is safe; sending it with a different body is refused. No `Idempotency-Key` header is needed.



## OpenAPI

````yaml api-reference/openapi.json POST /payouts
openapi: 3.0.3
info:
  title: Rampa Pay API
  version: 1.0.0
  description: >-
    Hold a USDT balance at Rampa and pay Bolivian merchant QRs in bolivianos.
    Amounts are decimal strings.
servers:
  - url: https://examples.staging.rampapay.com/v1
    description: 'Example server: sample answers, nothing real moves'
security:
  - apiKey: []
tags:
  - name: Accounts
    description: Every balance you hold with Rampa, in one place.
  - name: Wallet
    description: Your USDT balance at Rampa, and how money gets into it.
  - name: Payouts
    description: >-
      Quote a BOB amount in USDT; once your end user accepts, pay it out at that
      quote from your USDT wallet — to a merchant QR today, to a bank account
      soon.
  - name: Webhooks
    description: Where we send events. Each endpoint gets its own signing secret.
paths:
  /payouts:
    post:
      tags:
        - Payouts
      summary: Pay out at an accepted quote
      description: >-
        **Scope:** `payouts:write`


        `type` says where the money goes, and you send the one object it names:
        `qr` — `{"content": …}`, the QR your end user scanned — or
        `bank_transfer`, a Bolivian bank account. **`bank_transfer` is not
        available yet**: it is validated, then answered `422
        PAYOUT_TYPE_NOT_AVAILABLE`, so you can build against it now. Sending the
        other type's object is a `400`.


        Send it with the `quote_id` your end user accepted. It is paid at once
        and the answer says how it ended: `completed`, debiting exactly the
        quote's `source.amount`; `cancelled`, `rejected` or `failed` with
        `error.code` saying why — nothing is debited then; or, rarely,
        `processing` while the network's answer is late — poll `GET
        /payouts/{id}` or wait for the webhook; sending the same request again
        (same `transaction_id` and body) is always safe. An open-amount QR is
        paid the quote's `target.amount`. When the quote named a
        `resolution_id`, the payout carries it too, in its answer and its
        webhooks.


        **`transaction_id` is your own id and the idempotency key.** One
        transaction id is one payment: sending it again with the same body
        returns the same payment, so retrying after a timeout or a `503` is
        safe; sending it with a different body is refused. No `Idempotency-Key`
        header is needed.
      operationId: create-payout
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - transaction_id
                - type
                - quote_id
              properties:
                transaction_id:
                  type: string
                  description: >-
                    `string, 1–100 of A–Z a–z 0–9 . _ : -`. Required. Your id
                    for this payout, and its idempotency key.
                type:
                  type: string
                  enum:
                    - qr
                    - bank_transfer
                  description: >-
                    `qr | bank_transfer`. Required. Where the money goes; send
                    the object of the same name, and only that one.
                quote_id:
                  type: string
                  enum:
                    - uuid
                  description: >-
                    `uuid`. Required. The id of the firm quote the end user
                    accepted, for the amount the destination receives, before it
                    expires.
                qr:
                  type: object
                  properties:
                    content:
                      type: string
                      description: >-
                        `string, ≤ 500`. Type qr. The raw content of the QR the
                        end user scanned.
                bank_transfer:
                  type: object
                  properties:
                    bank_code:
                      type: string
                      description: >-
                        `digits, ≤ 10`. Type bank_transfer (not available yet).
                        The destination bank's code.
                    account_number:
                      type: string
                      description: >-
                        `6–30 digits`. Type bank_transfer. The destination
                        account.
                    branch_city:
                      type: string
                      description: >-
                        `CBB COB LPZ ORU POT SCZ SUC TJA TRI`. Type
                        bank_transfer. The city of the account's branch.
                    holder_name:
                      type: string
                      description: >-
                        `string, 3–80`. Type bank_transfer. The account holder's
                        name.
                    identification_number:
                      type: string
                      description: >-
                        `5–20 of A–Z a–z 0–9 -`. Type bank_transfer. The
                        holder's CI or NIT.
                description:
                  type: string
                  description: >-
                    `string, ≤ 200`. Sent with the payment when the QR carries
                    no description of its own.
            example:
              transaction_id: W-1001
              type: qr
              qr:
                content: 000201010212…
              quote_id: 6f0c2a8e-4b7d-4f1e-9a51-3c2d8e7b9a10
              description: Almuerzo
      responses:
        '201':
          description: Paid · Not paid — QR for another amount
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                  type:
                    type: string
                  status:
                    type: string
                  transaction_id:
                    type: string
                  resolution_id:
                    type: string
                    nullable: true
                  quote:
                    type: object
                    properties:
                      id:
                        type: string
                      source:
                        type: object
                        properties:
                          currency:
                            type: string
                          amount:
                            type: string
                      target:
                        type: object
                        properties:
                          currency:
                            type: string
                          amount:
                            type: string
                      rate:
                        type: string
                      fee:
                        type: object
                        properties:
                          currency:
                            type: string
                          amount:
                            type: string
                      expires_at:
                        type: string
                    nullable: true
                  source:
                    type: object
                    properties:
                      currency:
                        type: string
                      amount:
                        type: string
                    nullable: true
                  target:
                    type: object
                    properties:
                      currency:
                        type: string
                      amount:
                        type: string
                  qr:
                    type: object
                    properties:
                      amount_mode:
                        type: string
                      merchant:
                        type: object
                        properties:
                          name:
                            type: string
                          bank_code:
                            type: string
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                      message:
                        type: string
                    nullable: true
                  completed_at:
                    type: string
                    nullable: true
                  created_at:
                    type: string
              examples:
                paid:
                  summary: Paid
                  value:
                    id: po_9Fz3Kd7RwP2mX8cT4nB6vQ1h
                    type: qr
                    status: completed
                    transaction_id: W-1001
                    resolution_id: qrr_8KqT2mWx5ZbN7cJ4hRvP1sLd
                    quote:
                      id: 6f0c2a8e-4b7d-4f1e-9a51-3c2d8e7b9a10
                      source:
                        currency: USDT
                        amount: '101.500000'
                      target:
                        currency: BOB
                        amount: '1000.00'
                      rate: '9.9500'
                      fee:
                        currency: USDT
                        amount: '1.000000'
                      expires_at: '2026-09-27T14:05:00.000Z'
                    source:
                      currency: USDT
                      amount: '101.500000'
                    target:
                      currency: BOB
                      amount: '1000.00'
                    qr:
                      amount_mode: closed
                      merchant:
                        name: Café del Prado
                        bank_code: '1014'
                    error: null
                    completed_at: '2026-09-27T14:02:12.000Z'
                    created_at: '2026-09-27T14:02:11.000Z'
                not-paid-qr-for-another-amount:
                  summary: Not paid — QR for another amount
                  value:
                    id: po_9Fz3Kd7RwP2mX8cT4nB6vQ1h
                    type: qr
                    status: cancelled
                    transaction_id: W-1001
                    resolution_id: null
                    quote: null
                    source: null
                    target:
                      currency: BOB
                      amount: '1200.00'
                    qr:
                      amount_mode: closed
                      merchant:
                        name: Café del Prado
                        bank_code: '1014'
                    error:
                      code: QUOTE_AMOUNT_MISMATCH
                      message: >-
                        The QR is for a different amount than the quote. Nothing
                        was debited; the quote can still be used.
                    completed_at: null
                    created_at: '2026-09-27T14:02:11.000Z'
        '400':
          description: A field is missing or malformed (the message lists them).
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          description: '`QUOTE_NOT_FOUND` — No quote with that id for your key.'
        '409':
          description: >-
            `QUOTE_EXPIRED` — The quote expired. Nothing was attempted: get a
            new quote and show it to the end user.


            `QUOTE_ALREADY_USED` — Another payment used this quote. Nothing was
            attempted: get a new quote.


            `TRANSACTION_ID_REUSED` — This transaction_id already belongs to a
            payment with a different body. Use a new transaction_id for a new
            payment.
        '422':
          description: >-
            `PAYOUT_TYPE_NOT_AVAILABLE` — type bank_transfer is not available
            yet. Nothing was attempted.
        '503':
          description: >-
            `OPERATION_UNCERTAIN` — We could not confirm the outcome. Retry with
            the same transaction_id and the same body.
components:
  responses:
    Unauthorized:
      description: >-
        `AUTHENTICATION_FAILED` — the key is missing, unknown, revoked or
        expired, or the tenant is suspended.
    Forbidden:
      description: '`SCOPE_REQUIRED` — your key lacks this endpoint''s scope. Ask Rampa.'
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: X-API-Key
      description: >-
        On the example server, any key that starts with `rpk_mock_`, e.g.
        `rpk_mock_yourname`. Never your real key.

````

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