> ## 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.

# Get a firm quote

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

The price your end user accepts. Name the two currencies and fix the amount on one side: for a QR, `target_amount` in BOB. Show `source.amount` and count down to `expires_at` (3 minutes at most). If they accept, pay the QR with `POST /payouts` and this `id` as `quote_id`: it debits exactly `source.amount`. Nothing is reserved until then. A quote pays one payment. Asking again is just another quote — show the one you got.

Today only USDT → BOB with `target_amount` is priced. Other pairs and `source_amount` are validated, then answered `422`, so you can build against them now.



## OpenAPI

````yaml api-reference/openapi.json POST /fx/quotes
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:
  /fx/quotes:
    post:
      tags:
        - Payouts
      summary: Get a firm quote
      description: >-
        **Scope:** `payouts:write`


        The price your end user accepts. Name the two currencies and fix the
        amount on one side: for a QR, `target_amount` in BOB. Show
        `source.amount` and count down to `expires_at` (3 minutes at most). If
        they accept, pay the QR with `POST /payouts` and this `id` as
        `quote_id`: it debits exactly `source.amount`. Nothing is reserved until
        then. A quote pays one payment. Asking again is just another quote —
        show the one you got.


        Today only USDT → BOB with `target_amount` is priced. Other pairs and
        `source_amount` are validated, then answered `422`, so you can build
        against them now.
      operationId: create-fx-quote
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - source_currency
                - target_currency
              properties:
                source_currency:
                  type: string
                  description: '`currency code`. Required. What you pay with: USDT.'
                target_currency:
                  type: string
                  description: >-
                    `currency code`. Required. What the destination receives:
                    BOB.
                target_amount:
                  type: string
                  description: >-
                    `decimal, target's decimals (BOB: ≤ 2)`. Send this or
                    source_amount. Required for USDT → BOB. The QR's amount —
                    or, for an open-amount QR, the amount the end user typed.
                source_amount:
                  type: string
                  description: >-
                    `decimal, source's decimals`. Not available yet: 422
                    SOURCE_AMOUNT_NOT_AVAILABLE. Fixes what you pay instead.
                resolution_id:
                  type: string
                  description: >-
                    `qrr_…`. The id POST /payouts/qr/resolve answered for this
                    QR. The quote and the payout made at it carry it, so you can
                    follow one payment from the QR read to its outcome. It does
                    not change the price.
            example:
              source_currency: USDT
              target_currency: BOB
              target_amount: '1000.00'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                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
                      bps:
                        type: integer
                      flat:
                        type: string
                  fixed_side:
                    type: string
                  resolution_id:
                    type: string
                  expires_at:
                    type: string
                  created_at:
                    type: string
              example:
                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'
                  bps: 100
                  flat: '0.000000'
                fixed_side: target
                resolution_id: qrr_8KqT2mWx5ZbN7cJ4hRvP1sLd
                expires_at: '2026-09-27T14:05:00.000Z'
                created_at: '2026-09-27T14:02:00.000Z'
        '400':
          description: >-
            A currency is missing or not an upper-case code, neither or both of
            target_amount and source_amount were sent, target_amount is not
            positive or has more than 2 decimals, or resolution_id is not a qrr_
            id.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          description: '`RESOLUTION_NOT_FOUND` — No resolution with that id for your key.'
        '409':
          description: >-
            `QUOTE_UNAVAILABLE` — We cannot quote that amount right now. Try a
            smaller amount, or later; tell Rampa if it persists.
        '422':
          description: >-
            `AMOUNT_EXCEEDS_PROVIDER_LIMIT` — Above the per-payment cap. The
            body carries max_amount.


            `CURRENCY_PAIR_NOT_AVAILABLE` — Only USDT → BOB is available.


            `SOURCE_AMOUNT_NOT_AVAILABLE` — Fixing source_amount is not
            available yet. Send target_amount.
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.