GET
/api/v1/exchangesHobbyist tier+ · 30 req/minVenue directory + rollup — OI, 24h volume, coin count, status.
One row per upstream exchange with aggregate OI, 24h notional, active coin count, last heartbeat, and derived status. Same query powering `/markets/exchanges`.
Query parameters
All query parameters are optional unless marked required.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| sort | enum | optional | oi | Sort key. oivolumecoinsheartbeat |
| dir | enum | optional | desc | Sort direction. ascdesc |
| limit | number | optional | 50 | Rows. Max 200. |
Response shape
Always wrapped in the standard envelope. Nullable fields are explicitly marked — treat missing numeric data as a real data-source gap, not as an error.
data payloadtypescript
// Wrapped in the standard envelope:
// {
// data: /* shape below */,
// meta?: { total?: number; limit?: number; offset?: number; ... }
// }
Array<{
source: string;
displayName: string;
type: "CEX" | "DEX" | "OPTIONS" | "AGGREGATOR";
oiUsd: number;
oiSharePct: number;
volume24hUsd: number;
volumeSharePct: number;
coinCount: number;
lastHeartbeatTs: number | null;
status: "live" | "degraded" | "stopped" | "unknown";
}>Example
Copy the curl, replace YOUR_KEY with a real key from your dashboard, and run.
Requestbash
curl -sS "http://localhost:3000/api/v1/exchanges?limit=5" \
-H "Authorization: Bearer cg_live_YOUR_KEY"Responsejson
{
"data": [
{
"source": "binance_futures",
"displayName": "Binance Futures",
"type": "CEX",
"oiUsd": 12410200000,
"oiSharePct": 42.1,
"volume24hUsd": 85200000000,
"volumeSharePct": 38.2,
"coinCount": 210,
"lastHeartbeatTs": 1744835110000,
"status": "live"
}
],
"meta": { "total": 1, "limit": 5, "sort": "oi", "dir": "desc" }
}Next
Check the error code reference, or get an API key to try the request against your own account.