Skip to content

A wallet's SOL and tokens

GET
/sol/trade/holdings
curl --request GET \
--url 'https://api.getchord.xyz/v1/sol/trade/holdings?wallet=example'

SOL and every token the wallet holds (both token programs, accounts summed), at most 50 by value; more = left out. Name, image and price from Chord’s tape (null for a token it never saw).

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.

wallet
required

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

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

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

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

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

string
/^\d+$/
slot
integer
more
integer
tokens
Array<object>
object
mint

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

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

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

string
/^\d+$/
decimals
integer | null
symbol
string | null
name
string | null
image
string | null
priceUsd
number | null
valueUsd
number | null
Example
{
"wallet": "9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM",
"lamports": "11175972108683952",
"slot": 457371002,
"more": 3059,
"tokens": [
{
"mint": "BZLbGTNCSFfoth2GYDtwr7e4imWzpR5jqcUuGEwr646K",
"amount": "9110839995100000",
"decimals": 8,
"symbol": "IO",
"name": "IO",
"image": "https://bafkreicnqsbhpzxiasdm5esr7fqi3vcjvcbfefo4sq4y3ff747rfqf7w7i.ipfs.nftstorage.link",
"priceUsd": 0.16689062068413946,
"valueUsd": 15205137.417361211
},
{
"mint": "2qEHjDLDLbuBgRYvsxhc5D6uDWAivNFZGan56P1tpump",
"amount": "305126997000000",
"decimals": 6,
"symbol": "Pnut",
"name": "Peanut the Squirrel",
"image": "https://ipfs.io/ipfs/QmNdTtJauw39u4DzGyTaZ35rRx4VgAxqb91wE89zjyHWd2",
"priceUsd": 0.04610248419139405,
"valueUsd": 14067112.555560041
}
]
}

BAD_ADDRESS.

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