---
api: 'Revolut X Crypto Exchange REST API'
---

# Request RFQ quote

Request an RFQ quote for a large-block trade.

:::note[Availability]
RFQ trading is available to UK customers with passed KYC/KYB.
Additionally, UK retail clients must be categorised as High Net Worth investors.
:::

Provide exactly one of:
- `qty`: The quantity to trade, in the pair's **base** currency (e.g., BTC in `BTC/USD`).
- `amount`: The amount to spend or receive, in the pair's **counter** currency (e.g., USD in `BTC/USD`).

The returned `signature` is a signed, short-lived token that binds the quote to your account.
To execute the trade, pass it to [Accept RFQ quote](https://developer.revolut.com/docs/api/revolut-x-crypto-exchange#accept-rfq-quote) before `expires_at`.

#### Rate limits

| Limit | Total tokens | Refresh rate | Token cost rule |
| :--- | ---: | :--- | :--- |
| **Per-second limit** | 10 | 10 tokens / second | 1 token / request |

For retry guidance, see the `429 Rate Limit Exceeded` response below. The `Retry-After` header specifies the delay in milliseconds.

#### Required API key permissions

To call this endpoint, your API key must have the following permissions (scopes):

| Permission | Mapped scope | Audience |
| :--- | :--- | :--- |
| View | `rest.otc.view` | Users |
| View | `agent.otc.view` | Agentic clients |

For more information, see the guides: [RFQ trading](https://developer.revolut.com/docs/guides/crypto-exchange/rfq-trading/introduction-to-rfq-trading).

## Endpoint

POST `/1.0/otc/quotes`

## Parameters

### header parameters

- `X-Revx-Timestamp` (integer, required)
  Current timestamp in Unix epoch milliseconds. 
  Used to prevent replay attacks and construct the signature.
  Provided with other authentication headers.

- `X-Revx-Signature` (string, required)
  The Ed25519 signature of the request. 
  Provided with other authentication headers.
  
  :::tip
  See the [Authenticate requests](https://developer.revolut.com/docs/guides/crypto-exchange/get-started/authenticate-requests) guide for details on how to generate this.
  :::

## Request body

RFQ quote request details.

### Attributes

- `symbol` (string)
    The trading pair to quote, in `BASE/COUNTER` format.
- `side` (enum)
    The direction of the RFQ trade.
    Possible enum values:

    - `buy`
    - `sell`
- `qty` (string | null, optional)
    The quantity to trade, in the pair's base currency (e.g., BTC in BTC/USD).
    Provide exactly one of `qty` or `amount`.
- `amount` (string | null, optional)
    The amount to spend or receive, in the pair's counter currency (e.g., USD in BTC/USD).
    Provide exactly one of `qty` or `amount`.

## Returns

### 200

OK

The RFQ quote, including the signed token to accept it.

#### Response attributes

- `data` (object)
    An RFQ quote with a short-lived signed token to accept it.
  - `data.quote_id` (string)
      The unique identifier of the quote.
  - `data.symbol` (string)
      The trading pair, in `BASE/COUNTER` format.
  - `data.side` (enum)
      The direction of the RFQ trade.
      Possible enum values:

      - `buy`
      - `sell`
  - `data.price` (string)
      The executable unit price, adjusted for fees.
  - `data.qty` (string, optional)
      The requested quantity in base currency, if the quote was requested by `qty`. Omitted when the quote was requested by `amount`.
  - `data.amount` (string, optional)
      The requested amount in counter currency, if the quote was requested by `amount`. Omitted when the quote was requested by `qty`.
  - `data.order_book_price` (string)
      The volume-weighted average price (VWAP) of the exchange order book for the requested size.
  - `data.expires_at` (integer)
      The quote expiry as Unix epoch milliseconds. Quotes expire at most 5 seconds after they are issued.
  - `data.signature` (string)
      The signed quote token.
      Pass it to [Accept RFQ quote](https://developer.revolut.com/docs/api/revolut-x-crypto-exchange#accept-rfq-quote) before `expires_at` to execute the trade.
  - `data.liquidity_status` (enum)
      Indicates whether the order book had enough depth to fully cover the requested size when the quote was priced.
      Informational - the quote and price remain valid either way.
      Possible enum values:

      - `filled`
      - `partially_filled`
- `metadata` (object)
    Metadata about the response.
  - `metadata.timestamp` (integer)
      The time the data was captured in Unix epoch milliseconds.

## Error responses

| HTTP status code | Description |
| --- | --- |
| 400 | Bad request  In addition to the standard error responses (like a malformed request), a `400` is returned when the requested size is below the minimum RFQ trade amount for the pair. Retrieve the minimum with [Get RFQ limits](https://developer.revolut.com/docs/api/revolut-x-crypto-exchange#get-rfq-limits). |
| 401 | Unauthorized |
| 403 | Forbidden  In addition to the standard error responses (like missing API key permissions), a `403` is returned when trading this side is temporarily unavailable for the pair due to a liquidity breach. |
| 422 | Unprocessable entity  In addition to the standard error responses (like a validation error), a `422` is returned when the quote cannot be served because liquidity or configured OTC volume limits are unavailable. |
| 429 | Rate Limit Exceeded |
| 5XX | Server Error |
