---
title: "Best quote: Chord's route or Jupiter's"
method: GET
path: "/sol/trade/quote"
tags: ["Solana swaps"]
---

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

`GET /sol/trade/quote`

## Request

- Base URL: `https://api.getchord.xyz/v1`
- URL: `https://api.getchord.xyz/v1/sol/trade/quote`
- Auth: none declared

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.

## Query parameters

- `mint` string, required: Solana address, base58, case-sensitive. Never lower-case it.
- `side` 'buy' | 'sell', required
- `amount` string, required
- `wallet` string, required: Solana address, base58, case-sensitive. Never lower-case it.
- `slippageBps` integer

## Response `200`

- object
  - `ok` boolean
  - `quote` SolTradeQuote: One executable quote.
    - `ok` true, required
    - `route` 'direct' | 'jupiter' | 'jupiter_meta', required: `direct` = Chord's own route (pump pools or Chord's router) · `jupiter` = Jupiter's swap API · `jupiter_meta` = Jupiter's order (RFQ makers, DFlow, OKX).
    - `mint` string, required: Solana address, base58, case-sensitive. Never lower-case it.
    - `side` 'buy' | 'sell', required
    - `inAmount` string, required: What the wallet puts in: lamports for a buy, the token's smallest unit for a sell.
    - `outAmount` string, required: What the simulation of `tx` delivered to the wallet: tokens for a buy, lamports for a sell (wSOL counted as SOL), after every fee.
    - `minOut` string, required: The least the transaction accepts before it fails, from `slippageBps`.
    - `slippageBps` integer
    - `feeLamports` string: Chord's fee. 0 today.
    - `feeBps` integer: Chord's fee rate. 0 today.
    - `networkFeeLamports` integer: Base + priority fee the wallet pays; 0 when Jupiter or a market maker pays (`gasless`).
    - `units` integer: Compute units of the simulation.
    - `walletLamportsDelta` string: The wallet's whole SOL change in the simulation, network fee and rent of new accounts included.
    - `tx` string, required: The unsigned v0 transaction, base64 — exactly what was simulated. Sign it unchanged and POST it to `/sol/trade/send`.
    - `txBytes` integer
    - `blockhash` string
    - `lastValidBlockHeight` integer: After this block height the transaction can no longer land.
    - `simulatedSlot` integer
    - `ms` number
    - `venue` string: `direct` only: where it trades (the largest leg when the order is split): `pumpswap`, `pumpfun`, `raydium_v4`, `raydium_cpmm`, `raydium_clmm`, `orca`, `meteora_dlmm`, `meteora_damm_v2`, `meteora_dbc`, `raydium_launchlab`.
    - `layout` string: `direct` on a pump pool: the instruction layout copied.
    - `solBased` boolean: A PumpSwap pool whose base is SOL.
    - `pool` string: Solana address, base58, case-sensitive. Never lower-case it.
    - `partial` boolean: A pump.fun curve had fewer tokens left than the input buys: the quote takes all it has, for at most `inAmount`.
    - `hops` object[]: The legs: Chord's router (one or two pools) or Jupiter's route plan.
      - `label` string: Venue.
      - `pool` string: Pool.
      - `percent` number: Share of the input, %.
    - `router` string: `jupiter_meta`: which router won Jupiter's auction (`metis`, `jupiterz`, `dflow`, `okx`).
    - `gasless` boolean: `jupiter_meta`: Jupiter or the market maker pays the network fee; the wallet is a second signer.
    - `expireAt` integer: `jupiter_meta` RFQ quotes: Unix seconds the market maker's price lives to. Ask again when under ten seconds are left.
  - `reason` 'not_a_token' | 'bad_request' | 'no_pool' | 'no_template' | 'no_route' | 'wallet_cannot' | 'pool_limit' | 'no_output' | 'simulation_failed' | 'too_large' | 'error' | 'off': Why a route has no quote. `wallet_cannot` (no funds, or no token account), `pool_limit` (a size the pool refuses, or under half the market value) and `no_output` are about the request; `no_pool` = the route does not cover this token; `simulation_failed`, `too_large`, `error` = the route failed; `off` = not asked or switched off.
  - `detail` string
  - `compared` object: What each route offered. `direct` is the better of the pump route and Chord's router.
    - `direct` union
      - object
        - `ok` true
        - `outAmount` string: Base units as a decimal string (lamports for SOL).
        - `measured` 'simulated' | 'quoted': `simulated` = read from a simulation of the route's own transaction; `quoted` = Jupiter's own figure, shown when a route already in hand gives at least that much, so Jupiter's transaction was not built.
        - `networkFeeLamports` integer, nullable
        - `units` integer, nullable: Compute units.
        - `ms` number
      - object
        - `ok` false
        - `reason` 'not_a_token' | 'bad_request' | 'no_pool' | 'no_template' | 'no_route' | 'wallet_cannot' | 'pool_limit' | 'no_output' | 'simulation_failed' | 'too_large' | 'error' | 'off': Why a route has no quote. `wallet_cannot` (no funds, or no token account), `pool_limit` (a size the pool refuses, or under half the market value) and `no_output` are about the request; `no_pool` = the route does not cover this token; `simulation_failed`, `too_large`, `error` = the route failed; `off` = not asked or switched off.
        - `detail` string: What the route said, for a human.
        - `ms` number
    - `jupiter` union
      - object
        - `ok` true
        - `outAmount` string: Base units as a decimal string (lamports for SOL).
        - `measured` 'simulated' | 'quoted': `simulated` = read from a simulation of the route's own transaction; `quoted` = Jupiter's own figure, shown when a route already in hand gives at least that much, so Jupiter's transaction was not built.
        - `networkFeeLamports` integer, nullable
        - `units` integer, nullable: Compute units.
        - `ms` number
      - object
        - `ok` false
        - `reason` 'not_a_token' | 'bad_request' | 'no_pool' | 'no_template' | 'no_route' | 'wallet_cannot' | 'pool_limit' | 'no_output' | 'simulation_failed' | 'too_large' | 'error' | 'off': Why a route has no quote. `wallet_cannot` (no funds, or no token account), `pool_limit` (a size the pool refuses, or under half the market value) and `no_output` are about the request; `no_pool` = the route does not cover this token; `simulation_failed`, `too_large`, `error` = the route failed; `off` = not asked or switched off.
        - `detail` string: What the route said, for a human.
        - `ms` number
    - `jupiterMeta` union
      - object
        - `ok` true
        - `outAmount` string: Base units as a decimal string (lamports for SOL).
        - `measured` 'simulated' | 'quoted': `simulated` = read from a simulation of the route's own transaction; `quoted` = Jupiter's own figure, shown when a route already in hand gives at least that much, so Jupiter's transaction was not built.
        - `networkFeeLamports` integer, nullable
        - `units` integer, nullable: Compute units.
        - `ms` number
      - object
        - `ok` false
        - `reason` 'not_a_token' | 'bad_request' | 'no_pool' | 'no_template' | 'no_route' | 'wallet_cannot' | 'pool_limit' | 'no_output' | 'simulation_failed' | 'too_large' | 'error' | 'off': Why a route has no quote. `wallet_cannot` (no funds, or no token account), `pool_limit` (a size the pool refuses, or under half the market value) and `no_output` are about the request; `no_pool` = the route does not cover this token; `simulation_failed`, `too_large`, `error` = the route failed; `off` = not asked or switched off.
        - `detail` string: What the route said, for a human.
        - `ms` number
  - `ms` number

## Other responses

- `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".

---

[API](https://skmtc.dev/getchord/apis/chord-api.md) · [All operations](https://skmtc.dev/getchord/apis/chord-api/llms.txt) · [OpenAPI document](https://skmtc.dev/getchord/apis/chord-api/revisions/d3bc4640fea0?raw)
