https://api.ocx.global, written below as {API_BASE}. Bodies are JSON; prices and sizes are decimal strings. Public endpoints need no credentials; Session endpoints need a signed-in session (cookie or Authorization: Bearer) — see Authentication.
Enums used throughout:
side = buy | sell; order type = limit | market (default limit); timeInForce = gtc | ioc | fok. Quantities are whole contracts.Futures endpoints live under
/fut/*. The same handlers also answer under the legacy /perps/* prefix; use /fut/* in new code. “perp” in a path, field, or bucket name refers to the futures venue — OCX lists no perpetual contracts.Market data
Public — no credentials required.Futures markets
GET /fut/markets (alias GET /markets/linear) — every tradable dated future. Halted and expired markets are excluded.
array
Response
Futures order book
GET /fut/orderbook/{marketId} — aggregated book snapshot. Optional depth (levels per side). Unknown markets return 404.
Response
size is the quantity at that price; total is the cumulative quantity from the top of the book.
Futures stats, tape, and candles
Option board
GET /markets/board?underlying=SPX — the full option chain for one underlying: every strike and expiry with its reference mark, implied volatility, and delta. Always pass underlying (live underlyings include SPX and NDX).
string
The underlying and its current reference price.
string[]
Listed expiry dates.
object
Per-expiry
{ forwardPrice, atmIv, settlementUtc, … } — each expiry is priced off its own forward.array
Board
mark, iv, and delta are OCX reference values, published for pricing and risk. The tradable prices are always the order book. See Options methodology.Option order book and product specs
Fees and insurance fund
Both fee schedules are
per-lot-tiers: a schedule of { min30dLots, makerPerLot, takerPerLot } rows in USDC per contract, keyed on your combined 30-day futures and options volume in lots. See Fees.
Trading — futures
Place an order
POST /fut/orders — Session.
string
required
string
required
buy | sellstring
required
Whole number of contracts.
string
limit (default) | marketstring
Required for
limit. Must sit on the market’s tickSize.string
gtc | ioc | fok. Defaults to gtc for limit orders and ioc for market orders.boolean
Reject instead of taking liquidity.
boolean
Reject if the order would increase your position.
string
Idempotency key. A retry with the same id and parameters returns the original result; the same id with different parameters is rejected (
IDEMPOTENCY_CONFLICT).string
isolated (default) | cross.string
Make the order conditional: it is held and submitted once the OCX book mid (or the only side present) reaches the trigger.
stopPrice and stopLossPrice fire a buy at or above the trigger and a sell at or below it; takeProfitPrice fires a buy at or below and a sell at or above.{ order, trades, position } — the order, any fills it produced, and your resulting position.
PRICE_OUT_OF_BAND; a market order sweeps only to the edge of that band.
Preview an order
POST /fut/orders/preview — Session. Dry-run an order with no side effects. Same body as a live order.
string
quantity ×
contractSize × price.string
string
Estimated fee and the per-contract rate at your tier.
string
maker for postOnly orders, otherwise taker.string
Your 30-day volume in lots, which sets your fee tier.
boolean
Whether the order passes the margin check.
string
Present when
approved is false.Amend, cancel, and close
POST /fut/quotes and POST /fut/quotes/bulk are reserved for OCX’s designated market maker and return 403 QUOTES_MARKET_MAKER_ONLY for other accounts. To make markets in futures, rest postOnly limit orders with POST /fut/orders.Trading — options
Single order
POST /orders — Session. (POST /options/orders is an alias without the automatic collateral top-up.)
string
required
An option id from the board, e.g.
SPX-2026-10-06-7780-P.string
required
buy | sellstring
required
Whole number of contracts.
string
Premium per unit of the underlying. Required for
limit.string
limit (default) | market. Market orders always run ioc.string
gtc (default) | ioc | fokboolean
boolean
string
Idempotency key, as for futures.
POST /orders
Multi-leg strategy
POST /orders/strategy — Session. Place a combo (spread, straddle, …) of 2–8 legs. Combos are all-or-none and immediate: every leg must fully fill against the book or nothing executes.
array
required
Each
{ market, side, quantity, price }, with quantity and price as strings.string
Optional label.
string
POST /orders/strategy
{ strategyId, legs: [{ orderId, fills }], fullyFilled }. A combo that cannot fill every leg is rejected with 422 and { "error": "leg_match_failed", "failedLegIndex", "reason" }.
Option quotes
Both have
/options/… aliases. Every quote is a gtc limit order and is not post-only — a quote priced through the book executes as a taker. Returns { marketId, results: [{ side, response }] }.
Account
Read your own orders, positions, fills, and portfolio. Session.
For live account state, use the streams —
GET /fut/stream/user, GET /fut/stream/events, and GET /portfolio/balances/stream — documented in Streaming.
Wallet
All Session. See Balances & transfers for how the buckets work.Balances
endpoint
{ onchainDepositTotal, walletBalance, tradableBalance, perpsBalance, optionsBalance, pendingWithdrawalTotal } — decimal strings. perpsBalance is futures collateral; tradableBalance equals walletBalance.Transfer between buckets
string
required
wallet | perps | optionsstring
required
A different bucket.
string
required
Positive; cannot exceed the source balance.
POST /wallet/transfer — atomic and ledgered. A move between perps and options is refused if it would leave the source venue under-margined. A move from perps or options back to wallet is refused with 409 while you have any open positions or open orders.
POST /wallet/transfer
Withdraw
string
required
Positive amount of USDC.
POST /wallet/withdraw → { "withdrawalId": "…" }. If wallet is short, OCX first tries to move collateral back from options and perps (subject to the transfer rules above). The amount is then debited from wallet into pendingWithdrawalTotal, and the on-chain payout to your signed-in wallet address proceeds asynchronously. While you have an open loan on OCX’s funding books, a withdrawal must leave enough in the account to cover it; the rejection message states the most you can withdraw.
History & settlements
Settlement
status values: pending, processing, sent, confirmed,
failed, insufficient_liquidity.