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

# Request a quote

> Run an RFQ across every online resolver and get a firm quote with the terms to sign.

The relay broadcasts the request to every eligible node, collects offers for the RFQ window, validates and
ranks them, simulates the best, and returns it as a firm quote. A quote is open for 20 seconds.

<ParamField body="chainId" type="number">The chain. Defaults to the primary EVM chain. Solana chains take the [Solana shape](/integrators/solana).</ParamField>
<ParamField body="sellToken" type="address" required>The token the taker sells.</ParamField>
<ParamField body="buyToken" type="address" required>The token the taker buys.</ParamField>
<ParamField body="sellAmount" type="string" required>Base units of `sellToken`.</ParamField>
<ParamField body="taker" type="address" required>The wallet that will sign.</ParamField>
<ParamField body="recipient" type="address">Where proceeds go. Defaults to `taker`. Must equal `taker` on Solana.</ParamField>
<ParamField body="takerProof" type="object">`{ issuedAt, signature }`. Required when `requireTakerProof` is true. See [Taker proof](/integrators/taker-proof).</ParamField>
<ParamField body="preferredLiquidityWallets" type="address[]">Up to 10. See [Steering](/integrators/steering).</ParamField>
<ParamField body="restrictedLiquidityWallets" type="address[]">Up to 10. Not with `preferredLiquidityWallets`.</ParamField>

## Response when quoted

<ResponseField name="status" type="'quoted'" />

<ResponseField name="quoteId" type="string">Use it to execute and to follow the lifecycle.</ResponseField>

<ResponseField name="rfqId" type="string" />

<ResponseField name="expiresAt" type="string">When the quote closes.</ResponseField>

<ResponseField name="chainId" type="number" />

<ResponseField name="executor" type="address">The contract the keeper calls.</ResponseField>

<ResponseField name="permit2" type="address" />

<ResponseField name="sellToken" type="address" />

<ResponseField name="buyToken" type="address" />

<ResponseField name="sellAmount" type="string" />

<ResponseField name="resolver" type="object">`{ address, name }` of the winner.</ResponseField>
<ResponseField name="received" type="string">What the resolver pays out, before fees.</ResponseField>
<ResponseField name="fee" type="object">`{ token, amount, bps, usd }`: the protocol fee line.</ResponseField>
<ResponseField name="gasFee" type="object">`{ token, amount, usd }`: what the taker repays the keeper.</ResponseField>
<ResponseField name="takerPays" type="string">Sell token the taker spends, including the fee lines when they are charged in it.</ResponseField>
<ResponseField name="proceeds" type="string">Buy token the taker keeps, net of the fee lines when they are charged in it.</ResponseField>
<ResponseField name="permit" type="object">`{ token, amount, nonce, deadline }`: the Permit2 transfer the taker authorizes.</ResponseField>
<ResponseField name="auth" type="object">`{ offersHash, recipient, feeToken, minOut, maxGasFee }`: the `TakerAuth` witness.</ResponseField>
<ResponseField name="offers" type="object[]">The winning offer(s) as the executor receives them.</ResponseField>
<ResponseField name="typedData" type="object">EIP-712 typed data for `eth_signTypedData_v4`: Permit2's `PermitWitnessTransferFrom` with the `TakerAuth` witness.</ResponseField>
<ResponseField name="band" type="object | null">`{ base, quote, mid, low, high, rate, deviationBps, outside, sources, at }`: the oracle band at quote time and where this price sits in it.</ResponseField>

<ResponseField name="latencyMs" type="number" />

<ResponseField name="alternatives" type="object[]">`{ resolver: { address, name }, received }` for each other valid offer, best first.</ResponseField>
<ResponseField name="declines" type="object[]">`{ resolver, name, reason }` per node that declined.</ResponseField>
<ResponseField name="rejected" type="object[]">`{ resolver, name, reason }` per offer that failed validation.</ResponseField>

## Response when not quoted

<ResponseField name="status" type="'no_quote'" />

<ResponseField name="rfqId" type="string" />

<ResponseField name="reason" type="string">`below_minimum`, `insufficient_balance`, `no_resolvers`, `steering_excluded_all`, `no_replies`, `all_declined`, `no_valid_offers` or `paused`.</ResponseField>
<ResponseField name="eligible" type="number">Nodes the RFQ went to.</ResponseField>

<ResponseField name="declines" type="object[]" />

<ResponseField name="rejected" type="object[]" />

<ResponseField name="minimum" type="string">On `below_minimum`.</ResponseField>
<ResponseField name="balance" type="string">On `insufficient_balance`: what the taker holds.</ResponseField>
<ResponseField name="maxSellAmount" type="string">On `insufficient_balance`: the largest amount the taker can swap.</ResponseField>

<ResponseField name="latencyMs" type="number" />

## Errors

`400 invalid_request`, `wrong_chain`, `same_token`, `unsupported_token`, `zero_amount`, `invalid_steering`;
`401` taker proof refusals; `429 rate_limited`, `too_many_outstanding_rfqs`. See [Errors](/integrators/errors).

<RequestExample>
  ```bash cURL theme={null}
  curl -s https://relay-production-f175.up.railway.app/v1/quotes \
    -H 'content-type: application/json' -d '{
    "chainId": 84532,
    "sellToken": "0xe2387F04d3858e7Cb64Ef5Ed6617f9B2fcEEAfa2",
    "buyToken": "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
    "sellAmount": "25000000000000",
    "taker": "0xTaker",
    "takerProof": { "issuedAt": 1757750400, "signature": "0x…" }
  }'
  ```
</RequestExample>

<ResponseExample>
  ```json Quoted theme={null}
  {
    "status": "quoted",
    "quoteId": "5f1c…", "rfqId": "9a2e…",
    "expiresAt": "2026-09-14T12:00:20.000Z",
    "chainId": 84532,
    "executor": "0x64DcA68A0186c6aa632088fBE90b630e0c9D6b32",
    "permit2": "0x000000000022D473030F116dDEE9F6B43aC78BA3",
    "sellToken": "0xe2387F04d3858e7Cb64Ef5Ed6617f9B2fcEEAfa2",
    "buyToken": "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
    "sellAmount": "25000000000000",
    "resolver": { "address": "0xResolver", "name": "Lagos desk" },
    "received": "15508060000",
    "fee": { "token": "0x036CbD53842c5426634e7929541eC2318f3dCF7e", "amount": "7754030", "bps": 5, "usd": 7.75 },
    "gasFee": { "token": "0x036CbD53842c5426634e7929541eC2318f3dCF7e", "amount": "100000", "usd": 0.1 },
    "takerPays": "25000000000000",
    "proceeds": "15500205970",
    "permit": { "token": "0xe2387F04d3858e7Cb64Ef5Ed6617f9B2fcEEAfa2", "amount": "25000000000000", "nonce": "…", "deadline": "1757750430" },
    "auth": { "offersHash": "0x…", "recipient": "0xTaker", "feeToken": "0x036C…", "minOut": "15500205970", "maxGasFee": "100000" },
    "offers": [ { "order": "0x…", "sig": "0x…" } ],
    "typedData": { "domain": { "name": "Permit2", "chainId": 84532, "verifyingContract": "0x0000…8BA3" }, "types": { "…": [] }, "primaryType": "PermitWitnessTransferFrom", "message": { "…": "…" } },
    "band": { "base": "0xe238…", "quote": "0x036C…", "mid": 1612.4, "low": 1598.1, "high": 1627.9, "rate": 1612.05, "deviationBps": -2, "outside": false, "sources": 5, "at": 1757750400123 },
    "latencyMs": 812,
    "alternatives": [ { "resolver": { "address": "0xOther", "name": "node-bravo" }, "received": "15490000000" } ],
    "declines": [],
    "rejected": []
  }
  ```

  ```json No quote theme={null}
  {
    "status": "no_quote",
    "rfqId": "9a2e…",
    "reason": "all_declined",
    "eligible": 2,
    "declines": [
      { "resolver": "0xResolver", "name": "Lagos desk", "reason": "ticket_cap" },
      { "resolver": "0xOther", "name": "node-bravo", "reason": "inventory_floor" }
    ],
    "rejected": [],
    "latencyMs": 1503
  }
  ```
</ResponseExample>
