---
title: "Create a payout quote"
method: POST
path: "/v2/payouts/quotes"
tags: ["Quotes"]
---

# Create a payout quote

`POST /v2/payouts/quotes`

## Request

- Base URL: `https://openapi.infini.money`
- URL: `https://openapi.infini.money/v2/payouts/quotes`
- Auth: API key in header `Authorization`
- TypeScript: <https://skmtc.dev/infini/apis/infini-fiat-payout-api/docs/v2/payouts/quotes/post.ts> (a function with typed inputs; its response is checked against the schema)

Validates one bank destination and returns a time-limited payout quote. Requires `payout.write` permission.

The destination is submitted inline because this release does not expose a separate recipient resource. Infini binds a normalized, immutable destination snapshot to `quote_id`. The payout create request cannot replace or modify it.

The first release supports only these amount and fee-responsibility combinations:

- `amount_mode=send` with `fee_paid_by=BENEFICIARY`: fees are deducted internally. `amount` fixes `sending_amount`; `transfer_fee_amount = sending_amount × fee_rate_decimal`; and `receiving_amount = sending_amount - transfer_fee_amount - bank_fee_amount`. For `amount=1000.00`, rate `0.001`, and bank fee `50.00`, the recipient receives `949.00`.
- `amount_mode=receive` with `fee_paid_by=PAYER`: fees are deducted externally. `amount` fixes `receiving_amount`; `transfer_fee_amount = sending_amount × fee_rate_decimal`; and `sending_amount = receiving_amount + transfer_fee_amount + bank_fee_amount`. For `amount=1000.00`, rate `0.001`, and bank fee `50.00`, the source balance is debited `1051.05`.

In `receive` mode, Infini grosses up `sending_amount` until the recipient amount remains exact after all fees.

Changing `fee_paid_by` changes the calculation and requires a new quote. The accepted `quote_id` locks the fee responsibility and both calculated amounts used by the payout.

The quote step performs preliminary destination, route, amount, compliance, and limit checks. It does not reserve balance, approve a payout, create a payout, or guarantee execution. `POST /v2/payouts` repeats all execution-critical checks against current state.

## Headers

- `X-API-Key-ID` string, required
- `X-API-Timestamp` string, required
- `X-API-Nonce` string, required
- `Digest` string, required
- `Authorization` string, required

## Request body

- CreateQuoteRequest
  - `amount` string, required: Positive USD amount expressed according to `amount_mode`.
  - `amount_mode` 'send' | 'receive', required: Side fixed by `amount`. `send` is the source-account debit; `receive` is the recipient amount.
  - `fee_paid_by` 'PAYER' | 'BENEFICIARY', required: Fee responsibility and calculation input. `PAYER` applies fees externally; `BENEFICIARY` deducts fees internally. The first release accepts `receive` with `PAYER`, or `send` with `BENEFICIARY`.
  - `source_currency` 'USD', required: Organization balance currency. The first release supports USD only.
  - `destination_currency` 'USD', required: Currency delivered to the recipient. Payout quotes currently support USD only.
  - `destination_country` string, required: Destination country as an ISO 3166-1 alpha-2 code.
  - `payout_type` 'swift', required: Payout rail. The current release supports SWIFT only.
  - `destination` BankDestinationInput, required
    - `type` 'bank_account', required: Destination type.
    - `account_holder_type` 'individual' | 'business', required: Legal type of the bank-account holder.
    - `account_holder_name` string, required: Full legal name registered on the bank account.
    - `bank_country` string, required: Bank country as an ISO 3166-1 alpha-2 code.
    - `bank_name` string, required: Receiving bank's legal name.
    - `account_number` string, required: Receiving bank account number.
    - `swift_code` string, required: Receiving bank SWIFT/BIC code.
    - `address` PostalAddress
      - `line1` string, required: Primary street address.
      - `line2` string, nullable: Secondary address details.
      - `city` string, required: City or locality.
      - `state` string, nullable: State, province, or region.
      - `postal_code` string, required: Postal or ZIP code.
      - `country` string, required: Address country as an ISO 3166-1 alpha-2 code.

## Response `200`

Time-limited payout quote

- QuoteEnvelope
  - `code` 0, required: Business code. `0` means success.
  - `message` string, required: Response message.
  - `data` Quote, required
    - `quote_id` string, required: Time-limited payout quote ID.
    - `provider` 'sgb', required: Read-only execution provider identifier.
    - `payout_type` 'swift', required: Payout rail bound to the quote.
    - `source_currency` 'USD', required: Organization balance currency.
    - `destination_currency` 'USD', required: Currency delivered to the recipient.
    - `destination_country` string, required: Destination country as an ISO 3166-1 alpha-2 code.
    - `amount_mode` 'send' | 'receive', required: Side fixed by the quote request.
    - `fee_paid_by` 'PAYER' | 'BENEFICIARY', required: Party responsible for payout fees. `PAYER` means external deduction; `BENEFICIARY` means internal deduction.
    - `sending_amount` string, required: Total amount debited from the organization's source balance. Use this as the outgoing amount for reconciliation.
    - `receiving_amount` string, required: Amount delivered to the recipient.
    - `transfer_fee_amount` string, required: Infini service fee for processing the payout. It excludes any bank or rail fee and equals `billing.transfer_fee`.
    - `bank_fee_amount` string, required: Banking fee associated with the selected bank and payout rail, such as SWIFT, ACH, or wire. This equals `billing.rail_fee`.
    - `fee_rate_decimal` string, required: Decimal transfer-fee rate applied to the quote.
    - `rate` string, required: Destination-currency units per one source-currency unit.
    - `billing` BillingBreakdown, required
      - `currency` 'USD', required: Currency used by all billing amounts.
      - `transfer_fee` string, required: Infini service fee for processing the payout. It does not include any bank or rail fee.
      - `fx_fee` string, required: Foreign-exchange fee. It is `0.00` for the current USD-to-USD route.
      - `rail_fee` string, required: Banking fee associated with the selected bank and payout rail.
      - `total_fee` string, required: Sum of all fee components in the billing breakdown.
      - `fee_lines` FeeLine[], required: Itemized fee components used for reconciliation.
        - `type` 'transfer_fee' | 'fx_fee' | 'rail_fee', required: Fee component type.
        - `amount` string, required: Fee component amount in `currency`.
        - `currency` 'USD', required: Fee component currency.
        - `rate` string, required: Decimal rate used for this fee line, or `1` for a fixed rail fee.
    - `destination` BankDestinationView, required
      - `type` 'bank_account', required: Destination type.
      - `account_holder_type` 'individual' | 'business', required: Legal type of the bank-account holder.
      - `account_holder_name` string, required: Full legal name registered on the bank account.
      - `bank_country` string, required: Bank country as an ISO 3166-1 alpha-2 code.
      - `bank_name` string, required: Receiving bank's legal name.
      - `account_number_masked` string, required: Masked account number. Raw account details are never returned.
      - `swift_code` string, required: Receiving bank SWIFT/BIC code.
    - `expires_at` integer, required: Quote expiry time as Unix seconds.

## Other responses

- `400`: Request syntax or field validation failed
- `401`: Authentication failed: invalid/disabled credential, signature, timestamp, nonce or digest.
- `403`: Authenticated credential lacks permission or the client IP is not allowed.
- `409`: The request conflicts with idempotency, quote state, or another payout submission
- `422`: Request is syntactically valid but cannot pass payout eligibility or execution checks
- `500`: An unexpected internal error occurred

## Changes

- **2026-10-23** `25c3ff16936d`: 7 breaking, 1 warning
  - added the new required `header` request parameter `X-API-Key-ID`
  - added the new required `header` request parameter `X-API-Nonce`
  - added the new required `header` request parameter `X-API-Timestamp`
  - the `header` request parameter `Authorization` became required
  - …4 more
- **2026-08-18** `44f2f91e720d`: 2 info
  - added the non-success response with the status `409`
  - added the non-success response with the status `500`

[Operation history](https://skmtc.dev/infini/apis/infini-fiat-payout-api/changes/v2/payouts/quotes/post.md)

---

[API](https://skmtc.dev/infini/apis/infini-fiat-payout-api.md) - [All operations](https://skmtc.dev/infini/apis/infini-fiat-payout-api/llms.txt) - [OpenAPI document](https://skmtc.dev/infini/apis/infini-fiat-payout-api/revisions/25c3ff16936d?raw)
