GET
/api/v1/instrumentsFree tier · 10 req/minPaginated instrument directory — richer sibling of `/api/v1/symbols`.
Same underlying instrument table as `/api/v1/symbols`, exposed with consistent filter semantics under the instruments namespace.
Query parameters
All query parameters are optional unless marked required.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| limit | number | optional | 500 | Rows per page. Max 5000. |
| offset | number | optional | 0 | Pagination offset. |
| base | string | optional | — | Exact base-asset filter. |
| kind | enum | optional | — | Instrument family. perpspotfutureoption |
| search | string | optional | — | Prefix search on canonical symbol. |
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<{
id: number;
canonicalSymbol: string;
base: string;
quote: string;
kind: "perp" | "spot" | "future" | "option";
expiry: string | null;
strike: number | null;
optionType: "C" | "P" | null;
}>Example
Copy the curl, replace YOUR_KEY with a real key from your dashboard, and run.
Requestbash
curl -sS "http://localhost:3000/api/v1/instruments?base=BTC&kind=perp&limit=5"Responsejson
{
"data": [
{
"id": 12,
"canonicalSymbol": "BTCUSDT",
"base": "BTC",
"quote": "USDT",
"kind": "perp",
"expiry": null,
"strike": null,
"optionType": null
}
],
"meta": { "total": 1, "limit": 5, "offset": 0 }
}Next
Check the error code reference, or get an API key to try the request against your own account.