Skip to main content
Every endpoint is served through the gateway at 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 | sell
string
required
Whole number of contracts.
string
limit (default) | market
string
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.
Returns { order, trades, position } — the order, any fills it produced, and your resulting position.
A limit order priced too far through the mark and the opposite side of the book is rejected with 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 | sell
string
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 | fok
boolean
boolean
string
Idempotency key, as for futures.
POST /orders
The premium you pay or receive is price × quantity × the product’s multiplier (50 for SPX).

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
Returns { 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 | options
string
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.