Tiles
A tile is one contract. It covers:- an underlying (an instrument: BTC, ETH, SOL…);
- a time window
[start, end); - a price range
[min_strike, max_strike).
GET /v1/contracts/{id} decodes it.
Listed today: BTC, ETH, SOL, XRP, HYPE and ZEC, all against USD.
Grids
The exchange accepts any tile, but the market maker quotes, and liquidity gathers, on each instrument’s grids (GET /v1/instruments → grids):
A grid tile starts on a multiple of the window (Unix seconds), and its range starts on a multiple of the price step. For BTC’s 5m tile at time
t and price p:
Market hours
Each instrument has weekly market hours (market_hours, in market_tz). Crypto is always open (""), so every listed instrument today trades around the clock.
GET /v1/instruments/{id}/sessions?from=&to= turns market hours into absolute [start_ms, end_ms] sessions, up to 14 days at a time. A tile whose window doesn’t overlap any session can’t see a trade, so the exchange refuses it (MARKET_CLOSED).
Is a tile tradable?
GET /v1/contracts/{id} gives the same answer POST /v1/orders enforces:
status:upcoming: the window hasn’t started;active: it’s running;settling: it has ended and is within the settlement grace period (GET /v1/exchange→settlement_grace_seconds);settled: past that.
tradableandreason:TILE_ENDED(the window has ended),MARKET_CLOSED(the window lies entirely in closed hours) orUNKNOWN_INSTRUMENT. Active tiles can still be traded.outcome:yes(touched) orno, once the tile has settled.
Finding liquidity
GET /v1/markets?instrument_id=&grid= lists the tradable tiles that have resting orders, with each one’s best bid and ask and its order count. It’s the starting point for a liquidity provider. Stream any of them with the book or top_of_book WebSocket channels.
The underlying’s price
GET /v1/instruments/{id}/pricereturns the last trade.- The
underlying_tradesWebSocket channel streams every trade.