Skip to content

Send the signed quote

POST
/sol/trade/send
curl --request POST \
--url https://api.getchord.xyz/v1/sol/trade/send \
--header 'Content-Type: application/json' \
--data '{ "tx": "<base64 signed transaction>" }'

Relays a transaction Chord quoted in the last three minutes, signed by the wallet it was quoted for — anything else is refused. Chord sends it to several RPC providers and again every 2 seconds until it lands or its blockhash expires; a jupiter_meta order goes through Jupiter’s execute endpoint instead (Jupiter or the market maker adds its signature). Then poll /sol/trade/tx/{signature}.

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.

Media typeapplication/json
object
tx
required

quote.tx signed by the wallet, base64. Do not change the message.

string
Example
{
"tx": "<base64 signed transaction>"
}
Media typeapplication/json
object
ok
boolean
signature

Transaction signature, base58.

string
/^[1-9A-HJ-NP-Za-km-z]{64,88}$/
status

A sent swap.

object
signature

Transaction signature, base58.

string
/^[1-9A-HJ-NP-Za-km-z]{64,88}$/
status
string
Allowed values: pending confirmed finalized failed expired
route

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

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

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

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

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

Unix seconds.

integer
sends

How many times Chord sent it (every 2 seconds until it lands or its blockhash expires).

integer
slot
integer | null
error
string | null
quotedOut

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

string
/^\d+$/
receivedOut

What the wallet really got, read from the landed transaction with the quote’s measure.

string | null
/^-?\d+$/
confirmedAt

Unix seconds.

integer | null
error
string
message
string
Example
{
"status": {
"status": "pending",
"route": "direct",
"side": "buy"
}
}

BAD_TRANSACTION (not a transaction, or not base64) · UNKNOWN_TRANSACTION (not one a quote handed out in the last three minutes, or changed before signing — ask for a new quote) · NOT_SIGNED / BAD_SIGNATURE (not signed by the quoted wallet).

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"
}

SEND_FAILED: no RPC accepted the transaction.

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"
}