Agent-readable docs index: /llms.txt. Full docs in one file: /llms-full.txt. Download /docs.zip to grep all markdown files locally.

Place an order

POST /v1/orders
The order is signed with EIP-712. Signing has the domain, the types and working code.
Request
{ "order": { "maker": "0x1111111111111111111111111111111111111111", "underlyingKey": 7, "optionSpecifier": 859008923130267914, "side": 0, "size": 25, "limitPrice": 20000, "nonce": 42, "expiresAt": 200003600000, "maxFeeBps": 100 }, "signature": "0x…" }
body order.makeraddressrequired
The account the order is for. The signer is recovered from the signature and must be the maker or a key the maker registered.
body order.underlyingKeyuint64required
The underlying. See Instruments.
body order.optionSpecifieruint64required
The contract within the underlying: expiry, strike and right. See Instruments.
body order.sideuint8required
0 buy, 1 sell. There is no open or close flag.
body order.sizeuint64required
Contracts, from 1 to 230.
body order.limitPriceuint64required
Micros of probability, on the tick ladder and at most the contract's maximum payoff.
body order.nonceuint64required
Your identifier for this order, unique for the account, in [1, 2^62) with bits 54–61 zero. See Nonces.
body order.expiresAtuint64required
Engine milliseconds. The contract's expiryMs for good-till-expiry, or an earlier instant. See Lifetime.
body order.maxFeeBpsuint8required
The most the order agrees to pay, 0–255 bps. Must be at least both of the instrument's rates.
body signaturestringrequired
65 bytes of hex, r‖s‖v, as eth_signTypedData_v4 returns it.
query waitinteger
Milliseconds to hold the request for the engine's answer, at most 5000.

Without wait

202 Accepted once the order is sequenced:
{ "status": "accepted", "clientId": 42, "fills": [] }
clientId is the order's nonce. Follow the order on the WebSocket's account: channel, or at GET /v1/orders/{maker}/{nonce}.

With wait

200 OK, whatever the engine decided:
{ "status": "resting", "orderId": "1834:12", "clientId": 42, "fills": [{ "size": 10, "price": 20000, "fee": 100000 }] }
statusMeaning
restingIn the book, after any fills it took on the way in. orderId names it.
filledTook liquidity and did not rest. The fills may sum to less than size if the engine was quiet for the rest of the window.
expiredIts lifetime ended before it rested: what was left of a zero-lifetime order.
refusedThe engine refused it. code is the reason; see Refusals.
unknownNo answer within the window. The order may still be live: ask for its status.
fills[].fee is what this order paid on that fill.

Sending the same order twice

Resending a signed order is always safe. If the first send reached the engine, the resend is refused with code NONCE_USED, and an order field says where the first one stands:
{ "status": "refused", "code": "NONCE_USED", "clientId": 42, "fills": [], "order": { "orderId": "1834:12", "state": "resting", "remaining": 15 } }
This holds across gateways too, so a client may fail over to another gateway with the same signed order.