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

# Quote a bank payout

> POST /v1/bank/payout/quote - price a payout to a bank account, no virtual account needed.

Prices a payout that lands in a bank account you name. **No virtual account is
involved** - this is the one-off direction, for a user paid out once or
irregularly. If the user already banks with you through a virtual account, see
[Pay out from a virtual account](/api-reference/virtual-account-payout) instead.

Anonymous: no account, no identity, so the price can be shown before anyone
commits.

<Note>
  Needs the **bank-payouts permission** on your API key. See
  [Authentication](/api-reference/authentication).
</Note>

## Request

<ParamField body="cryptoCurrency" type="string" required>
  The asset the user is paying out with (e.g. `"USDC"`).
</ParamField>

<ParamField body="chain" type="number" required>
  Chain id the stablecoins are sent from. Must be enabled on your key.
</ParamField>

<ParamField body="fiatCurrency" type="string" required>
  ISO 4217 code the bank account is credited in (e.g. `"GBP"`).
</ParamField>

<ParamField body="country" type="string" required>
  ISO 3166-1 alpha-2 of the destination bank. The same currency reaches different
  countries over different rails at different cost, so it is priced per country.
</ParamField>

<ParamField body="cryptoAmount" type="string">
  The amount of stablecoin the user gives up. Send this **or** `fiatAmount`.
</ParamField>

<ParamField body="fiatAmount" type="string">
  The amount that must arrive in the bank account, solved backwards.
</ParamField>

<ParamField body="rail" type="string">
  Force a specific rail (e.g. `"sepa_instant"`, `"faster_payments"`, `"ach"`,
  `"pix"`). Omit and the cheapest rail that serves the pair is chosen.
</ParamField>

## Response

<ResponseField name="quoteId" type="string">
  Pass to [POST /v1/bank/payout](/api-reference/bank-payout).
</ResponseField>

<ResponseField name="cryptoAmount" type="string">
  What the user sends.
</ResponseField>

<ResponseField name="fiatAmount" type="string">
  What arrives in the bank account, after both fees.
</ResponseField>

<ResponseField name="rate" type="string">
  Exchange rate used, fiat per unit of crypto.
</ResponseField>

<ResponseField name="rail" type="string">
  The rail this price is for. Read it - a forced rail that is closed is refused,
  but an omitted one may resolve to something slower than you assumed.
</ResponseField>

<ResponseField name="estimatedSettlement" type="string">
  How long the rail takes once sent, as a coarse label: `instant`, `same_day`,
  `t+1`, `t+3`. Never a promise - see the warning below.
</ResponseField>

<ResponseField name="providerFee" type="string">
  The banking partner's fee, in fiat. **Already deducted from `fiatAmount`.**
</ResponseField>

<ResponseField name="ourFee" type="string">
  Rheon's markup, in fiat.
</ResponseField>

<ResponseField name="expiresAt" type="string">
  ISO 8601. Execute before this or the quote is refused as expired. Bank payout
  quotes hold for two hours, which is the banking partner's own window - shorter
  than a card quote and far longer than a crypto one.
</ResponseField>

<Warning>
  **`estimatedSettlement` is the rail's normal behaviour, not a commitment.** A
  receiving bank can hold a transfer for its own checks, and cut-off times push a
  late instruction to the next working day. Show it as an expectation.
</Warning>

<Note>
  Rails differ enough that a percentage taken from one payout misprices the next.
  Quote the amount you are about to send, per country, every time.
</Note>

<RequestExample>
  ```bash cURL theme={null}
  curl -X POST "$RHEON_API/v1/bank/payout/quote" \
    -H "Authorization: Bearer $RHEON_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "cryptoCurrency": "USDC",
      "chain": 42161,
      "fiatCurrency": "GBP",
      "country": "GB",
      "cryptoAmount": "1000.00"
    }'
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "quoteId": "bpq_2e90c4a71f",
    "cryptoAmount": "1000.00",
    "fiatAmount": "731.40",
    "rate": "0.7336",
    "rail": "faster_payments",
    "estimatedSettlement": "instant",
    "providerFee": "2.20",
    "ourFee": "0",
    "expiresAt": "2026-09-02T17:44:12Z"
  }
  ```
</ResponseExample>

## Errors

| HTTP | `code`              | When                                                                        |
| ---- | ------------------- | --------------------------------------------------------------------------- |
| 400  | `invalid_request`   | Missing or malformed amount, both amounts sent, or an unsupported currency. |
| 401  | `unauthorized`      | Missing, malformed, or unknown API key.                                     |
| 403  | `permission_denied` | Your key does not carry the bank-payouts permission.                        |
| 403  | `chain_not_allowed` | Your key is not enabled for `chain` as a source.                            |
| 422  | `no_route`          | No rail serves this currency and country right now.                         |
| 429  | `rate_limited`      | Over your key's rate limit.                                                 |
| 502  | `upstream_error`    | The banking partner is unavailable.                                         |
| 500  | `internal`          | Unexpected server error.                                                    |
