Perpetuals: market data
Public endpoints for perp contract specs, book, tape, candles, mark and index prices, funding and venue aggregates.
All endpoints on this page are public — no key, no signature. Perpetuals are USDC-margined, non-expiring, and cover crypto, US equities, ETFs and commodities under one symbol grammar (<BASE>-USDC).
What is listed
curl -s https://api-mainnet.1024ex.com/api/v1/system/info
curl -s https://api-mainnet.1024ex.com/api/v1/perp/marketsGET /api/v1/system/info returns the flat list of tradable perp symbols; GET /api/v1/perp/markets returns the same set with per-market metadata.
Contract specs
curl -s https://api-mainnet.1024ex.com/api/v1/perp/markets/BTC-USDC{
"market": "BTC-USDC",
"baseAsset": "BTC",
"quoteAsset": "USDC",
"status": "active",
"tickSize": "0.010000000000000000",
"stepSize": "0.000010000000000000",
"minOrderSize": "0.00001",
"maxOrderSize": "58.01341",
"maxLeverage": 100,
"marketMaxLeverage": 100,
"sessionDegraded": false,
"maxOrderNotionalE6": 5000000000000,
"capReason": null,
"fundingInterval": 28800000
}| Field | Meaning |
|---|---|
tickSize / stepSize | price and size increments; orders off-grid are rejected, not rounded |
minOrderSize / maxOrderSize | per-order size bounds in base units |
maxOrderNotionalE6 | per-order notional ceiling in micro-USDC (5000000000000 = $5,000,000) |
maxLeverage | the ceiling currently applied, after any risk-driven reduction |
marketMaxLeverage | the market's structural ceiling |
capReason | non-null when maxLeverage < marketMaxLeverage, naming why |
sessionDegraded | true when the underlying's price session is degraded (equities outside RTH, oracle gaps) |
fundingInterval | ms between funding settlements — 28800000 is 8 hours |
Read maxLeverage, not marketMaxLeverage, before sizing: the gap between them is where TRADE_LEVERAGE_INVALID (13012) comes from.
Book, tape, candles
curl -s "https://api-mainnet.1024ex.com/api/v1/perp/markets/BTC-USDC/orderbook?depth=20"
curl -s "https://api-mainnet.1024ex.com/api/v1/perp/markets/BTC-USDC/trades"
curl -s "https://api-mainnet.1024ex.com/api/v1/perp/markets/BTC-USDC/klines?interval=1h&limit=500"The book is [price, size] pairs, best-first:
{
"market": "BTC-USDC",
"bids": [["86167.19", "0.003393"], ["86157.2", "0.003277"]],
"asks": [["86204.51", "0.003335"], ["86211.05", "0.003219"]],
"timestamp": 1790095097073
}depth is 1–100 (default 20). Klines take interval ∈ 1m 5m 15m 1h 4h 1d (default 1h) and limit 1–1000 (default 500).
One behaviour to know about candles: for markets with fewer than 100 trades in the last 24 h, the exchange falls back to external reference data (Coinbase / Binance / Yahoo) rather than serving a nearly-empty internal series. Liquid markets always serve the internal series. Either way the shape is identical — but do not treat low-volume candles as evidence of on-venue volume.
Prices
| Endpoint | Returns |
|---|---|
GET /perp/markets/{market}/ticker | 24 h summary: last, mark, index, bid/ask, OI, funding rate, next funding time |
GET /perp/markets/{market}/mark-price | mark price — the number margin and liquidation are computed against |
GET /perp/markets/{market}/index-price | index with its component feeds |
GET /perp/markets/{market}/open-interest | open interest |
Mark, not last, is what the risk engine uses. A position's PnL, its maintenance margin and its liquidation price all move with mark; the last trade is cosmetic.
Funding
Funding settles every fundingInterval (8 h on crypto). The canonical pair is:
curl -s "https://api-mainnet.1024ex.com/api/v1/perp/markets/BTC-USDC/funding-rate"
curl -s "https://api-mainnet.1024ex.com/api/v1/perp/markets/BTC-USDC/funding-history?limit=50"Several aliases exist for the same data because integrations kept guessing at paths — /perp/funding-rate?market=, /perp/funding-rate/{market}, /perp/markets/{market}/funding, and the list forms /perp/funding-rates, /perp/funding. They are 1:1 with the canonical handlers, with one difference worth knowing:
- the single-market endpoint returns the live predicted rate (
source: "live"), - the list endpoints return the latest settled rate per market (
source: "settled").
If you are comparing markets for a carry screen, use the list form and accept that it lags the prediction; if you are deciding whether to hold through the next settlement, use the single-market form. Funding rates flip sign at minute granularity — do not cache a rate for a whole interval and trade off it.
Venue-wide numbers
| Endpoint | Returns |
|---|---|
GET /api/v1/analytics/tickers | every market's ticker in one call |
GET /api/v1/analytics/markets/summary | per-market volume / OI / funding summary |
GET /api/v1/analytics/open-interest (+ /history) | OI now and over time |
GET /api/v1/analytics/volume, /fees, /tvl (+ /history) | protocol aggregates |
GET /api/v1/analytics/liquidations, /liquidations/recent | liquidation flow |
GET /api/v1/analytics/insurance-fund | insurance fund balance |
GET /api/v1/perp/adl/events | recent auto-deleveraging events |
Prefer analytics/tickers over looping GET /ticker across 100+ markets — it is one request against your read budget instead of a hundred.
Staying current
Polling market data burns the 50 req/s read budget fast. The same data streams over perp.ticker, perp.orderbook, perp.trades, perp.kline and perp.funding — see WebSocket.
Updated 9 days ago
