associatedWallet requirement, and rate-limit buckets.
Request body
forbidNonWhitelisted); any extra
field returns 400 validation_failed.
maker is the vault address. The signing EOA is recovered from
signature and must satisfy vaultFactory.vaultOf(signer) == maker.
The backend re-runs that check before storing the order, so passing the
EOA in maker instead of the vault returns 400 bad_signature.
Validation rules
Worked example — BUY 2 YES at 0.42
Response shape
clientOrderId field is echoed verbatim when the request supplied
one — present on every shape (success, REJECTED, idempotent replay). Use
it to correlate the server-issued orderId to your own client-side handle
without a follow-up GET /api/orders/{id}. The same value is also carried
on the events.order_placed and events.order_cancelled frames over
/ws/user, so partners that drive their state machine off the WS feed get
the correlation key on both surfaces.
Batch placement
Submit up to 10 orders in one request withPOST /api/orders/place-batch.
Each entry is the exact same body as single placement; the
batch is processed sequentially in array order with independent
per-order outcomes — one rejected order never aborts the rest, and there
is no all-or-nothing atomicity.
PlaceOrderResp (identical to single place) plus a success flag:
Per-wallet limits accumulate across the batch. KYC deposit-tier,
responsible-gambling, and partner trade caps are charged against the
running total of accepted entries, so a batch can never admit more
exposure than the same orders sent one at a time.
Post-only orders
SetpostOnly: true to guarantee an order only ever rests on the book
and never matches on entry. It’s the maker-side guarantee market makers need
to avoid paying taker fees or accidentally crossing their own quotes.
gtc time-in-force (optionally with
expiry). Omit it (or send false) for today’s behavior.
Sell orders
Same shape;side: 'sell'. Balance is not locked for SELL orders —
the outcome token (ERC-1155) must already sit in the vault, not
the EOA. Position resolution is keyed by maker (the vault), which is
why on-chain splits (USDC → YES + NO) must be initiated by
vault.splitPosition(...) rather than by the EOA directly. See
Vaults for the split flow.
Next
Time-in-force
GTC vs IOC vs FOK behaviour.
Cancelling orders
Single-order and cancel-all flows.