# Best quote: Chord's route or Jupiter's

`GET https://api.getchord.xyz/v1/sol/trade/quote`

Source: https://getchord.xyz/docs/api-reference/operations/soltradequote/

The quote of the route that leaves the wallet with the most, its unsigned transaction, and what every route offered (`compared`). `ok: false` with `quote: null` and a `reason` is an answer (no route for this token, size or wallet), not an error.

**Open to everyone** since 2026-10-15, no key needed (an `X-API-Key` raises the rate limit). `/sol/trade/config` says whether the lane is on for the caller; when it is off the other routes answer `503 TRADE_NOT_ENABLED`.

A quote is SOL against one token, bought or sold. For every quote Chord builds, for **your wallet**, the transaction of each route — `direct` (Chord's own router: Raydium AMM v4 / CPMM / CLMM, Orca Whirlpool, Meteora DLMM / DAMM v2, Meteora DBC, Raydium LaunchLab, pump.fun, PumpSwap; up to two pools), `jupiter` (Jupiter's swap API, no Jupiter fee) and `jupiter_meta` (Jupiter's order: Metis, its RFQ market makers, DFlow, OKX; Jupiter's fee inside the amount) — simulates each on the chain and returns the one that leaves the wallet with the most: tokens for a buy, SOL for a sell, after every fee. Ties go to `direct`, then `jupiter`. A route handing back under half of the input's market value is refused.

Amounts are base units as decimal strings: lamports for SOL, the token's smallest unit otherwise. Addresses are base58, case-sensitive. Chord takes no fee on Solana today. Nothing is signed by Chord: you sign `quote.tx` unchanged and send it back.

## Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
| `mint` | query | yes | string | The token. |
| `side` | query | yes | `buy` · `sell` | `buy` = SOL in, token out · `sell` = token in, SOL out. |
| `amount` | query | yes | string | Input in base units: lamports for a buy, the token's smallest unit for a sell. |
| `wallet` | query | yes | string | The wallet that will sign: every route is simulated for it, so it must hold the input (and SOL for fees). |
| `slippageBps` | query | no | integer (default `100`) | Tolerance that sets `minOut`. |

## Response 200

Example (captured from the live API):

```json
{
  "ok": true,
  "quote": {
    "ok": true,
    "route": "direct",
    "mint": "98sMhvDwXj1RQi5c5Mndm3vPe9cBqPrbLaufMXFNMh5g",
    "side": "buy",
    "inAmount": "1000000000",
    "outAmount": "1291169314",
    "minOut": "1278257620",
    "slippageBps": 100,
    "feeLamports": "0",
    "feeBps": 0,
    "networkFeeLamports": 13462,
    "units": 53847,
    "walletLamportsDelta": "-1001501902",
    "tx": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAJF36MCIdgv94d3c8ywX8gm4JC7lKq8TH6zYjQ6ixtCwbybQ/ffN89KMzS1moKr3xD+eaLjFLD93Uu7/6fCChoRW+33r5/N5kXzVmVKDnDCPuAkyP2Gtb/z4vZXn9rJrNgnlYtVRIeQFP9RCTKJ4QcFXTmTFrjug4KMZNwxfvPi59T3FuLdqms3IWcwYxorNprzTnpS/UIS8cr22A9a0z5hMQguKAAE9blFXzMeY2Ul+aVjNz5CWJMPZFyDxSfYLteeLFBAdK4u9M26/E24V6FVw6ivZ7F6IKKhmtyA8AUTfymAHzJZSEoI1LREgsRMMb+c3W9Pk5HT+Ci3aCI/WgF+bbdWqpQ+Iq9Y9M30s68O5hGfLeLdlEbgXgDuUWpI64G0UeeEGWqwXbkX0swI7SX5eIdaHc3Qyw0ilOG3FwaVKK3wRwJ7Hd/cQIYGczxT34DxoMVJNeXfeJLQyrGn/5CRYApa3YIBFLBUkXofOcSUKM6WFvxPe9wsqWKl3DHs4sghgHyPnPlSprtPOAV8DiJLgrp8nHRCYh08HSC9eHtCKRKNckuzi1T27nDcSwt5D+6EBI+n21RbgNj47MiJk7XsmsDBkZv5SEXMv/srbpyw5vnvIzlu8X3EmssQ5s6QAAAAIyXJY9OJInxuz0QKRSODYMLWhOZ2v8QhASOe9jb6fhZBpuIV/6rgYT7aH9jRhjANdrEOdwa6ztVmKDwAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpeOF/+c+e8osV49WDJ0Hs54BOB9XJf0LvM+1fBZx0kl8E6eEvvIToJskyzOniZAzOFVkMHGJzsJJXCLo7hSCwvAVKU1qZKSEGTSTocWDaOHx8NbXdvJK7geQfqEBBBUSNsnDWf6mMUc8CEwUTWJYrrzV0K+1ZydlEXpwNDIXHzZF54KJrKMEZBlNIu3jg6xTnaDFVOdmUnu4hys0zsh+wiAgOAAUCiUoBAA4ACQOghgEAAAAAAA8GAAEAEBESAQEPBgACABMREgEBEQIAAQwCAAAAAMqaOwAAAAASAQEBERQWAwQFBgECEBMHFAASEhUWFAgJCgsMDRxBSz9M61tbiADKmjsAAAAA1KkwTAAAAAAAAAAAEgMBAAABCQA=",
    "txBytes": 962,
    "blockhash": "9CkzxZDnrGUqa6v7wWKq3jMxYFkLvqE1c8ogo7DURJjq",
    "lastValidBlockHeight": 435407004,
    "simulatedSlot": 457371000,
    "ms": 269,
    "venue": "meteora_dlmm",
    "pool": "6oQ9wVex4mKZti2GsGCfD8FWTMMC9PLQkztRU5cd6MK8",
    "hops": [
      {
        "label": "Meteora DLMM",
        "pool": "6oQ9wVex4mKZti2GsGCfD8FWTMMC9PLQkztRU5cd6MK8",
        "percent": 100
      }
    ]
  },
  "compared": {
    "direct": {
      "ok": true,
      "outAmount": "1291169314",
      "measured": "simulated",
      "networkFeeLamports": 13462,
      "units": 53847,
      "ms": 269
    },
    "jupiter": {
      "ok": true,
      "outAmount": "1291041752",
      "measured": "simulated",
      "networkFeeLamports": 23574,
      "units": 149660,
      "ms": 128
    },
    "jupiterMeta": {
      "ok": true,
      "outAmount": "1289637269",
      "measured": "simulated",
      "networkFeeLamports": 0,
      "units": 25294,
      "ms": 350
    }
  },
  "ms": 392
}
```

- **400**: `BAD_ADDRESS` / `BAD_SIDE` / `BAD_AMOUNT` / `BAD_SLIPPAGE`.
- **502**: `TRADE_BAD_ANSWER`: the Solana box answered something that is not the quote asked for (another mint, side, amount, tolerance or fee payer, or an unknown shape). Nothing is forwarded.
- **503**: `TRADE_NOT_ENABLED` (the lane is off on this deployment, or not open to this caller yet) or `TRADE_UNAVAILABLE` (the Solana box did not answer). Retry later; do not read it as "no route".
