Skip to content

Is the tape following the chain

GET
/chains/solana/status
curl --request GET \
--url https://api.getchord.xyz/v1/chains/solana/status

The ingest’s own health: the last slot written, how far behind the chain it is, the age of the newest block it has written, swaps per minute, and per-venue decode counters since the ingest started (decode is keyed by venue number: 1 pumpswap · 2 pumpfun · 3 meteora_dbc · 4 meteora_damm_v2 · 5 meteora_dlmm · 6 raydium_clmm · 7 orca · 8 raydium_cpmm · 9 raydium_v4 · 10 meteora_pools · 11 raydium_launchlab; the example shows two of the eleven). ok: false or a large blockAgeS means the numbers on the other routes are behind: say so when you show them. Never cached.

Chord’s own Solana tape, read-only. No key needed.

  • What it reads. The swap events of 11 venues: PumpSwap, the pump.fun bonding curve, Meteora DBC, Meteora DAMM v2, Meteora DLMM, Meteora pools (dynamic AMM v1), Raydium CLMM, Raydium CPMM, Raydium AMM v4, Raydium LaunchLab and Orca Whirlpool. Each swap is checked against the pool vaults’ balance changes in the same transaction.
  • What it does not read. Prop AMMs (SolFi, HumidiFi and the like) and order books. SOL/USDC and other major pairs therefore show far less volume than the whole market; the numbers are accurate for pump.fun, Meteora and Raydium style tokens. Transfers are not seen either: wallet PnL is average cost inside the window.
  • History. Live since 2026-10-03 12:01 UTC, plus a backfill of the days before. coverageSince on /chains/solana/overview says from when totals are complete: quote that field, not a date.
  • Addresses are base58 and case-sensitive. Never lower-case a mint or a wallet: a lower-cased mint is a different string, refused with 400 BAD_ADDRESS when it stops being base58 (an L becomes l) and answered 404 TOKEN_NOT_FOUND otherwise. Solana has no numeric chain id here: the path segment is the literal solana.
  • Units. Token amounts are whole tokens (decimals already applied), quoteAmount is whole units of the pool’s quote (SOL, USDC, USDT or the other token), prices and *Usd fields are US dollars. Timestamps, updatedAt included, are Unix seconds.
  • Names are untrusted. symbol, name and image are whatever the token’s creator wrote; many mints share a symbol and there are no wash or impostor flags. Identify a token by its mint.
  • Errors. 400 BAD_* for a bad parameter; 400 UNSUPPORTED_CHAIN if Solana is not public on the deployment and the request has no X-API-Key; 503 CHAIN_DATA_UNAVAILABLE when the Solana store cannot be read in time and 503 CHAIN_NOT_ENABLED when the lane is off: retry later, never read either as “no trades”.
Media typeapplication/json
object
chain
string
Allowed value: solana
ok

The ingest is healthy right now.

boolean
cursor

Last slot written.

integer
genesisSlot

First slot of the live tape.

integer
auditCursor

Last slot re-checked against finalized (orphaned slots removed, late ones written).

integer
lagSlots

Slots between the chain head and cursor.

integer | null
blockAgeS

Age of the newest block written, seconds.

integer | null
slotsPerMin
number | null
swapsPerMin
number | null
startedAt

Unix time, seconds, UTC.

integer | null
solUsd

SOL price the tape is using (from its own SOL/stable swaps).

number | null
decode

Venue number → counters since startedAt.

object
key
additional properties
object
events
integer
swaps
integer
ok

Swaps whose amounts match the vaults’ balance changes exactly.

integer
bad

Swaps that do not match.

integer
unchecked

Not checkable (a fee paid to a third account, a pool created and seeded in the same transaction).

integer
noParent
integer
otherEvents
integer
totals

Since startedAt.

object
slots
integer
swaps
integer
orphaned
integer
late
integer
venues

What the tape reads, in words.

string
notCovered

What it does not read, in words.

string
public

Served to callers without a key.

boolean
gate

The automatic public gate: pass, liveHours, missing24h (missing slots in 24 hours), hourCheck (rollup against raw for the last closed hour), reasons.

object | null
Example
{
"chain": "solana",
"ok": false,
"cursor": 453384220,
"genesisSlot": 452927437,
"auditCursor": 453383708,
"lagSlots": 2065,
"blockAgeS": 15287,
"slotsPerMin": 273,
"swapsPerMin": 33344,
"startedAt": 1791163969,
"solUsd": 121.06980743427287,
"decode": {
"1": {
"events": 412502,
"swaps": 392156,
"ok": 392155,
"bad": 1,
"unchecked": 0,
"noParent": 0,
"otherEvents": 20346
},
"2": {
"events": 127002,
"swaps": 108165,
"ok": 108151,
"bad": 14,
"unchecked": 0,
"noParent": 0,
"otherEvents": 18837
}
},
"totals": {
"slots": 5931,
"swaps": 740575,
"orphaned": 0,
"late": 0
},
"venues": "PumpSwap, pump.fun, Meteora (DAMM v2, DLMM, DBC, dynamic pools), Raydium (CLMM, CPMM, v4, LaunchLab) and Orca",
"notCovered": "prop AMMs such as SolFi / HumidiFi and order books such as Phoenix are not read, so SOL/USDC-style majors are understated",
"public": true,
"gate": {
"pass": false,
"at": 1791166182,
"liveHours": 38.1,
"missing24h": 0,
"hourCheck": {
"hour": 497545,
"hourlyDiff": 0,
"candleDiff": 0
},
"reasons": [
"ingest not healthy right now"
]
}
}

UNSUPPORTED_CHAIN (Solana is not public on this deployment and the request has no X-API-Key).

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

Over the per-minute limit (RATE_LIMIT_EXCEEDED). Read X-RateLimit-Reset and back off.

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

CHAIN_DATA_UNAVAILABLE (the Solana store did not answer in time) or CHAIN_NOT_ENABLED (the lane is off on this deployment). Retry later; do not treat it as an empty answer.

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