Get Instruments
List all instruments available for trading. Clients should call this on startup and refresh on a timer.
GET /instruments
GET /instruments/{symbol}
Auth: Public. No token required.
Available Symbols
All instruments are USDC-quoted linear perpetuals. Symbols follow the BASE-USDC-PERP format.
| Symbol | Base asset |
|---|---|
AAVE-USDC-PERP | AAVE |
ADA-USDC-PERP | ADA |
APT-USDC-PERP | APT |
ARB-USDC-PERP | ARB |
AVAX-USDC-PERP | AVAX |
BNB-USDC-PERP | BNB |
BTC-USDC-PERP | BTC |
DOGE-USDC-PERP | DOGE |
DOT-USDC-PERP | DOT |
ETH-USDC-PERP | ETH |
HYPE-USDC-PERP | HYPE |
LINK-USDC-PERP | LINK |
NEAR-USDC-PERP | NEAR |
PEPE-USDC-PERP | PEPE |
POL-USDC-PERP | POL |
SOL-USDC-PERP | SOL |
SUI-USDC-PERP | SUI |
TRX-USDC-PERP | TRX |
UNI-USDC-PERP | UNI |
XRP-USDC-PERP | XRP |
This table is a snapshot; GET /instruments below is always the source for the live set (status, tick sizes, fees, etc.).
List All Instruments
curl the REST origin/api/v1/instruments
Response
{
"code": 0,
"data": {
"instruments": [
{
"symbol": "BTC-USDC-PERP",
"symbol_id": 1,
"base": "BTC",
"quote": "USDC",
"contract_type": "perpetual",
"underlying": "BTC/USD",
"index_description": "Pyth BTC/USD",
"settlement_currency": "USDC",
"settlement_type": "cash",
"position_size_unit": "base",
"status": "active",
"tick_size": 0.1,
"lot_size": 0.001,
"max_order_size": 1000,
"price_decimals": 1,
"quantity_decimals": 3,
"max_leverage": 10,
"pyth_feed_id": "<64-character feed id>",
"pyth_lazer_id": 1
}
]
},
"timestamp": "2026-04-20T10:30:00.123Z",
"request_id": "req_01HXYZ..."
}
Single Instrument
curl the REST origin/api/v1/instruments/BTC-USDC-PERP
Returns the same instrument object under data (not wrapped in an instruments array).
Field Reference
| Field | Type | Description |
|---|---|---|
symbol | string | Canonical id used on all other endpoints |
symbol_id | integer | Numeric instrument id used on the encrypted wire |
base | string | Base asset (e.g. BTC) |
quote | string | Quote asset (always USDC) |
contract_type | string | perpetual in v1 |
underlying | string | Display underlying, e.g. BTC/USD |
index_description | string | Human-readable index source |
settlement_currency | string | USDC in v1 |
settlement_type | string | cash in v1 |
position_size_unit | string | base in v1 |
status | string | active, halt, or prelaunch |
tick_size | number | Minimum price increment (quote asset) |
lot_size | number | Minimum quantity increment (base asset) |
max_order_size | number | Maximum order quantity |
price_decimals | integer | Fractional digits in the price domain |
quantity_decimals | integer | Fractional digits in the quantity domain |
max_leverage | number | Maximum leverage permitted on this instrument |
pyth_feed_id | string, optional | Pyth Hermes feed id (lowercase hex, no 0x) |
pyth_lazer_id | integer, optional | Pyth Pro/Lazer feed id |
The launch catalog publishes max_leverage: 10; always use the returned value rather than hard-coding it because runtime listings may differ.
Use tick_size and price_decimals to validate/normalize prices, and
lot_size and quantity_decimals to validate/normalize quantities. SDK inputs
use native numeric types while order/fill outputs use decimal strings, so
applications should preserve the original decimal intent and avoid implicit
binary-float rounding.
Refresh Semantics
The current route returns a normal JSON response on every successful request. It does not publish a version, updated_at, or ETag, and it does not implement If-None-Match / 304 Not Modified.
There is no public instrument WebSocket channel. Poll GET /instruments at an interval appropriate for your client, and treat the REST response as authoritative for listings, halts, and leverage limits.