Skip to content

Best quote: Chord's route or Jupiter's

GET
/sol/trade/quote
curl --request GET \
--url 'https://api.getchord.xyz/v1/sol/trade/quote?mint=example&side=buy&amount=example&wallet=example&slippageBps=100'

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.

mint
required

Solana address, base58, case-sensitive. Never lower-case it.

string
/^[1-9A-HJ-NP-Za-km-z]{32,44}$/

The token.

side
required
string
Allowed values: buy sell

buy = SOL in, token out · sell = token in, SOL out.

amount
required
string
/^[1-9]\d{0,19}$/

Input in base units: lamports for a buy, the token’s smallest unit for a sell.

wallet
required

Solana address, base58, case-sensitive. Never lower-case it.

string
/^[1-9A-HJ-NP-Za-km-z]{32,44}$/

The wallet that will sign: every route is simulated for it, so it must hold the input (and SOL for fees).

slippageBps
integer
default: 100 >= 1 <= 5000

Tolerance that sets minOut.

Media typeapplication/json
object
ok
boolean
quote

One executable quote.

object
ok
required
boolean
route
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).

string
Allowed values: direct jupiter jupiter_meta
mint
required

Solana address, base58, case-sensitive. Never lower-case it.

string
/^[1-9A-HJ-NP-Za-km-z]{32,44}$/
side
required
string
Allowed values: buy sell
inAmount
required

What the wallet puts in: lamports for a buy, the token’s smallest unit for a sell.

string
/^\d+$/
outAmount
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.

string
/^\d+$/
minOut
required

The least the transaction accepts before it fails, from slippageBps.

string
/^\d+$/
slippageBps
integer
feeLamports

Chord’s fee. 0 today.

string
/^\d+$/
feeBps

Chord’s fee rate. 0 today.

integer
networkFeeLamports

Base + priority fee the wallet pays; 0 when Jupiter or a market maker pays (gasless).

integer
units

Compute units of the simulation.

integer
walletLamportsDelta

The wallet’s whole SOL change in the simulation, network fee and rent of new accounts included.

string
/^-?\d+$/
tx
required

The unsigned v0 transaction, base64 — exactly what was simulated. Sign it unchanged and POST it to /sol/trade/send.

string
txBytes
integer
blockhash
string
lastValidBlockHeight

After this block height the transaction can no longer land.

integer
simulatedSlot
integer
ms
number
venue

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.

string
layout

direct on a pump pool: the instruction layout copied.

string
solBased

A PumpSwap pool whose base is SOL.

boolean
pool

Solana address, base58, case-sensitive. Never lower-case it.

string
/^[1-9A-HJ-NP-Za-km-z]{32,44}$/
partial

A pump.fun curve had fewer tokens left than the input buys: the quote takes all it has, for at most inAmount.

boolean
hops

The legs: Chord’s router (one or two pools) or Jupiter’s route plan.

Array<object>
object
label

Venue.

string
pool

Pool.

string
percent

Share of the input, %.

number
router

jupiter_meta: which router won Jupiter’s auction (metis, jupiterz, dflow, okx).

string
gasless

jupiter_meta: Jupiter or the market maker pays the network fee; the wallet is a second signer.

boolean
expireAt

jupiter_meta RFQ quotes: Unix seconds the market maker’s price lives to. Ask again when under ten seconds are left.

integer
reason

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.

string
Allowed values: not_a_token bad_request no_pool no_template no_route wallet_cannot pool_limit no_output simulation_failed too_large error off
detail
string
compared

What each route offered. direct is the better of the pump route and Chord’s router.

object
direct
One of:
object
ok
boolean
outAmount

Base units as a decimal string (lamports for SOL).

string
/^\d+$/
measured

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.

string
Allowed values: simulated quoted
networkFeeLamports
integer | null
units

Compute units.

integer | null
ms
number
jupiter
One of:
object
ok
boolean
outAmount

Base units as a decimal string (lamports for SOL).

string
/^\d+$/
measured

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.

string
Allowed values: simulated quoted
networkFeeLamports
integer | null
units

Compute units.

integer | null
ms
number
jupiterMeta
One of:
object
ok
boolean
outAmount

Base units as a decimal string (lamports for SOL).

string
/^\d+$/
measured

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.

string
Allowed values: simulated quoted
networkFeeLamports
integer | null
units

Compute units.

integer | null
ms
number
ms
number
Example
{
"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
}

BAD_ADDRESS / BAD_SIDE / BAD_AMOUNT / BAD_SLIPPAGE.

Media typeapplication/json

Every non-2xx body.

object
error
required

Stable machine code, e.g. INVALID_PARAMS, NOT_READY, RATE_LIMIT_EXCEEDED.

string
message

For humans.

string
statusCode

HTTP status, when included.

integer
Example
{
"error": "INVALID_PARAMS",
"message": "amount must be an integer string in the token's smallest unit"
}

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.

Media typeapplication/json

Every non-2xx body.

object
error
required

Stable machine code, e.g. INVALID_PARAMS, NOT_READY, RATE_LIMIT_EXCEEDED.

string
message

For humans.

string
statusCode

HTTP status, when included.

integer
Example
{
"error": "INVALID_PARAMS",
"message": "amount must be an integer string in the token's smallest unit"
}

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”.

Media typeapplication/json

Every non-2xx body.

object
error
required

Stable machine code, e.g. INVALID_PARAMS, NOT_READY, RATE_LIMIT_EXCEEDED.

string
message

For humans.

string
statusCode

HTTP status, when included.

integer
Example
{
"error": "INVALID_PARAMS",
"message": "amount must be an integer string in the token's smallest unit"
}