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

# Create a quotation

> Price a payout before you make it, and hold that price.

The quote is always saved. Send its `quote_id` with a payout and it settles at exactly the amounts, fees and rate you were quoted. `quote_expires_at` says how long that holds — read the field rather than assuming a duration, because the window is configurable.



## OpenAPI

````yaml /openapi/kira-api.2026-04-14.json post /v1/quotations
openapi: 3.1.0
info:
  title: Kira API
  version: '2026-04-14'
  description: >-
    REST API for users, KYC/KYB verification, virtual accounts, payouts,
    recipients, and webhooks. Every request requires an `x-api-key` header and a
    bearer access token (see Authentication). Pin your account to version
    `2026-04-14` before integrating.
  contact:
    name: Kira API Support
    email: support@kirafin.ai
servers:
  - url: https://api.balampay.com
    description: Production
  - url: https://api.balampay.com/sandbox
    description: Sandbox
security:
  - bearerAuth: []
    apiKeyAuth: []
tags:
  - name: Authentication
  - name: Versioning
  - name: Users
  - name: Virtual Accounts
  - name: Recipients
  - name: Quotations
  - name: Payouts
  - name: Reference
paths:
  /v1/quotations:
    post:
      tags:
        - Quotations
      summary: Create a quotation
      description: >-
        Price a payout before you make it, and hold that price.


        The quote is always saved. Send its `quote_id` with a payout and it
        settles at exactly the amounts, fees and rate you were quoted.
        `quote_expires_at` says how long that holds — read the field rather than
        assuming a duration, because the window is configurable.
      operationId: post_v1-quotations
      parameters:
        - in: header
          name: X-Api-Version
          required: false
          description: >-
            Version applied to this request. It wins over your account's pinned
            version — see [Versioning](/using-the-api/versioning).
          schema:
            type: string
            example: '2026-04-14'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/QuotationRequest'
            examples:
              bank:
                summary: A wire to a saved recipient
                value:
                  amount: '1000.00'
                  recipient_id: cccccccc-dddd-eeee-ffff-000000000000
              wallet:
                summary: USDC to a wallet, without a saved recipient
                value:
                  amount: '1000.00'
                  account_type: WALLET
                  wallet_network: polygon
                  wallet_token: USDC
      responses:
        '201':
          description: The quote was priced and saved.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/QuotationResponse'
              example:
                amount: '1000.00'
                currency: USD
                fees:
                  base_fees:
                    bank_account_fee: '10.00'
                    bank_account_fee_percentage: '0.00'
                    fixed_fee: '0.00'
                    percentage_fee: '2.50'
                    total: '12.50'
                  client_markup:
                    fixed_fee: '1.00'
                    percentage_fee: '0.00'
                    total: '1.00'
                  network_fee: '0.00'
                  total_fees: '13.50'
                  total: '13.50'
                recipient_amount: '986.50'
                recipient_currency: USD
                quote_id: dddddddd-eeee-ffff-0000-111111111111
                quote_expires_at: '2026-09-01T12:15:00.000Z'
        '400':
          description: >-
            The request was rejected. Read `code` to tell the two apart:
            `validation_error` means a field is missing or malformed and
            `details` names each one; `bad_request` means the request was well
            formed but cannot be priced — most often the amount is too small to
            cover the fees.
          content:
            application/json:
              examples:
                validation:
                  summary: A field is missing or malformed
                  value:
                    code: validation_error
                    message: Invalid request body
                    details:
                      - path:
                          - amount
                        message: Amount must be greater than zero
                not-priceable:
                  summary: The amount cannot carry the fees
                  value:
                    code: bad_request
                    message: Total fees exceed or equal the payout amount
        '403':
          description: >-
            Your request was turned away before it reached the API. The message
            talks about routing, but any of these causes it:


            - The `x-api-key` header is missing or wrong.

            - Your bearer token has expired. Get a new one from [Get access
            token](/api-reference/authentication/get-access-token).

            - The path or the HTTP method does not match. In sandbox, check that
            the path sits under the `/sandbox` prefix.


            A missing `Authorization` header comes back as a `401` with the same
            body.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                code: invalid_request
                message: >-
                  The request could not be matched to a valid route, or was
                  malformed. Verify the path and HTTP method against the API
                  reference. This is a routing or request error, not a
                  credentials or signature problem.
        '404':
          description: >-
            The `recipient_id` does not belong to you, or your account could not
            be resolved.
          content:
            application/json:
              example:
                code: not_found
                message: Recipient not found
        '500':
          description: >-
            The quote could not be produced. Retry; if it keeps happening,
            contact your Kira contact with the time of the call.
          content:
            application/json:
              example:
                code: internal_error
                message: An unexpected error occurred while creating the quotation
      security:
        - bearerAuth: []
          apiKeyAuth: []
      servers:
        - url: https://api.balampay.com/sandbox
          description: Sandbox
        - url: https://api.balampay.com
          description: Production
components:
  schemas:
    QuotationRequest:
      type: object
      description: Send `recipient_id` or `account_type` — at least one is required.
      properties:
        amount:
          type: string
          description: >-
            How much to price, as a positive decimal string with up to 8
            decimals. With `inverse_calculation` this is what the recipient
            should end up with instead.
        recipient_id:
          type: string
          format: uuid
          description: >-
            A recipient you saved earlier. Its rail and details are used for the
            pricing.
        account_type:
          type: string
          enum:
            - WIRE
            - ACH
            - WALLET
          description: >-
            Price a rail without saving a recipient first. Ignored when you also
            send `recipient_id`, which carries its own rail.


            With `WALLET` and no `recipient_id`, `wallet_network` and
            `wallet_token` are required too.
        inverse_calculation:
          type: boolean
          description: >-
            Work backwards: treat `amount` as what the recipient receives and
            return the amount you have to send. `false` when you omit it.
        client_markup:
          type: object
          description: >-
            Your own fees for this one quote, replacing whatever is configured
            on your account. `fixed_fee` and `percentage_fee` are both required
            once you send the object.
          properties:
            fixed_fee:
              type: string
              description: A flat charge, as a decimal string with up to 2 decimals.
            percentage_fee:
              type: string
              description: >-
                A share of the amount, as a decimal between `0` and `1` with up
                to 4 decimals — `0.01` is 1%.
            fx_markup:
              type: string
              description: >-
                Your cut of the currency conversion, as a decimal with up to 4
                decimals.
          required:
            - fixed_fee
            - percentage_fee
        wallet_network:
          type: string
          enum:
            - solana
            - polygon
            - tron
          description: >-
            Chain the recipient's wallet is on. Only used with `account_type:
            WALLET` and no `recipient_id`.
        wallet_token:
          type: string
          enum:
            - USDC
            - USDT
          description: >-
            Token the recipient receives. Not every token works on every chain,
            and a pair that does not is rejected with a `400`.
        payment_instructions:
          type: object
          description: >-
            The token and chain you will deposit to fund the payout. Sending
            this makes the quote a crypto-funded one.
          properties:
            network:
              type: string
              enum:
                - solana
                - polygon
                - tron
              description: Chain you will deposit on.
            currency:
              type: string
              enum:
                - USDC
                - USDT
              description: Token you will deposit.
          required:
            - network
            - currency
      required:
        - amount
    QuotationResponse:
      type: object
      description: The priced quote. Every amount is a decimal string.
      properties:
        amount:
          type: string
          description: What you send.
        currency:
          type: string
          description: Currency of `amount`. Always `USD`.
        fees:
          type: object
          description: What comes off the amount before the recipient is paid.
          properties:
            base_fees:
              type: object
              description: What Kira charged, each a decimal string.
              properties:
                bank_account_fee:
                  type: string
                  description: The rail's own flat charge.
                bank_account_fee_percentage:
                  type: string
                  description: The rail's own percentage charge.
                fixed_fee:
                  type: string
                  description: A flat charge.
                percentage_fee:
                  type: string
                  description: A charge worked out from the amount.
                conversion_on_ramp_fee:
                  type: string
                  description: >-
                    Charge for turning USD into a token. Only on a quote that
                    converts.
                total:
                  type: string
                  description: This group added up.
            client_markup:
              type: object
              description: What you charged, each a decimal string.
              properties:
                fixed_fee:
                  type: string
                  description: A flat charge.
                percentage_fee:
                  type: string
                  description: A charge worked out from the amount.
                conversion_on_ramp_fee:
                  type: string
                  description: >-
                    Charge for turning USD into a token. Only on a quote that
                    converts.
                total:
                  type: string
                  description: This group added up.
            network_fee:
              type: string
              description: >-
                The chain's transfer cost. `0` on a quote that does not touch a
                chain.
            fx:
              type: object
              description: >-
                How the conversion was priced. Only on a quote that converts
                between USD and a token.
              properties:
                commercial_rate:
                  type: string
                  description: >-
                    Reference market rate, in USD per unit of the token. Shown
                    for display, and absent when the quote charges conversion as
                    its own fee line instead of as a rate spread.
                mid_market_rate:
                  type: string
                  description: The same value as `commercial_rate`, under a clearer name.
                applied_rate:
                  type: string
                  description: The reference rate less the markup. Shown for display only.
                base_markup_rate:
                  type: string
                  description: Kira's share of the spread, as a rate.
                client_markup_rate:
                  type: string
                  description: Your share of the spread, as a rate.
                markup_cost:
                  type: string
                  description: What the spread comes to in USD.
                depeg_loss:
                  type: string
                  description: >-
                    USD given up because the token was trading below parity.
                    Kept separate so it is not read as revenue.
            total_fees:
              type: string
              description: >-
                `base_fees.total` and `client_markup.total` added up.
                `network_fee` is not in it — add that separately on a payout
                delivered as digital currency.
            total:
              type: string
              description: The same value as `total_fees`.
        recipient_amount:
          type: string
          description: What the recipient ends up with.
        recipient_currency:
          type: string
          description: >-
            Currency of `recipient_amount` — `USD` on a bank payout, `USDC` or
            `USDT` on a wallet payout.
        payment_instructions:
          type: object
          additionalProperties: true
          description: >-
            The funding token and chain, echoed back. Only on a crypto-funded
            quote.
        quote_id:
          type: string
          format: uuid
          description: Send this with a payout to settle at this price.
        quote_expires_at:
          type: string
          description: When the price stops holding, as an ISO 8601 timestamp.
    ErrorResponse:
      type: object
      properties:
        message:
          type: string
        code:
          type: string
        statusCode:
          type: number
        error:
          type: string
        timestamp:
          type: string
        path:
          type: string
        details: {}
      required:
        - message
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        The `data.access_token` value from [Get access
        token](/api-reference/authentication/get-access-token).
    apiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: API key issued by Kira.

````