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
| Field | Rule | Failure |
|---|---|---|
price | 0 < p < 1 (strict β p >= 1 is rejected to block the fee = k Γ P Γ (1βP) sign flip at P > 1). Tick size is 0.01 β at most 2 decimal places (integer cents, 99 distinct levels). 0.505 returns invalid_amounts with βprice tick size is 0.01β. | 400 invalid_amounts |
quantity | > 0, at most 6 decimal places (USDC scale). | 400 invalid_amounts |
type + timeInForce | MARKET orders require ioc or fok; MARKET+GTC rejected | 400 invalid_tif |
signature | EIP-712 recover (full on-chain Order struct) must equal an EOA whose vault == maker | 400 bad_signature |
expiry | 0 (no expiry, recommended) or unix-seconds in the future. There is no minimum TTL. | 400 expired |
outcome | "0" or "1". The platform maps this to the on-chain tokenId for the market. | 400 invalid_outcome / 409 market_outcomes_not_seeded |
| Balance | available >= price Γ quantity (BUY) | 200 REJECTED, code: insufficient_funds |
| Position | vault.erc1155(tokenId) >= quantity (SELL) | 200 REJECTED, code: insufficient_position |
| Market | market.status === 'OPEN' | 409 market_not_open |
Worked example β BUY 2 YES at 0.42
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.