Converting a DOWN order
The matching engine only understands the UP book. If a trader wants to buy DOWN at priced, your frontend must convert that into a SELL order on the UP book at price 1 - d, with the same quantity:
side, order_price, and executed_price in every request and response are always UP-book values. Your frontend is responsible for presenting the DOWN price and direction back to the trader.
Order types
API: POST/v1/order, POST /v1/batch-order, PUT /v1/order
Predict orders accept only LIMIT, IOC (with an explicit price-protection limit), and POST_ONLY. BID, ASK, a literal MARKET type, and FOK are all rejected with BINARY_ORDER_TYPE_NOT_SUPPORTED.
A “Market” entry mode is a frontend concept, not a distinct order_type value: implement it as an IOC order with a protection price so the trader never fills worse than they expect. By default, the protection price is 2 ticks beyond the best available price, and is configurable; either way it is clamped to the 0.01-0.99 quote range. Unfilled quantity beyond the protection price is cancelled immediately rather than chasing the price further.
post_only_adjust is only valid together with POST_ONLY. Sending it with any other order type
also returns BINARY_ORDER_TYPE_NOT_SUPPORTED.margin_mode must be ISOLATED
Every Predict order must explicitly set margin_mode to ISOLATED. Omitting the field does not fall back to a default — it is rejected with BINARY_MARGIN_MODE_NOT_SUPPORTED. There is no cross-margin mode for Predict symbols.
Price, quantity, and minimum notional
Predict info (see Market Data) gives you each round’squote_min, quote_max, quote_tick, base_min, base_max, base_tick, and min_notional. Orders that fall outside these bounds, or that don’t land exactly on a tick, are rejected outright — the platform does not round a non-conforming price or quantity for you.
min_notional is always checked against the UP-book notional (order_price x order_quantity), for both BUY and SELL — never against the DOWN-side price. Because DOWN’s price is $1 minus the UP price, this gives DOWN orders an uneven minimum share count and minimum paid amount depending on price. For example, for a round with min_notional = 5 USDC:
If your frontend takes an amount input rather than a share count, you are responsible for:
- Converting the entered amount to a share count, rounded down to the nearest
base_tick. - Splitting an order into multiple orders when the converted quantity would exceed
base_max(for example, a large amount entered at a low price). Orderly does not auto-split orders for you; submit the resulting orders through POST/v1/batch-order.
Order freeze and MAX amount
When an order is placed, Orderly locks funds to cover the order’s full potential cost plus a small buffer for the trading fee that will apply when it fills:- Buying UP locks
order_price x order_quantity, plus the buffer. - Buying DOWN locks
(1 - order_price) x order_quantity, plus the buffer.
MAX amount = available balance / (1 + b), then converts that amount to a share count and rounds down to the nearest base_tick. The required freeze for a given order cost is required freeze = cost x (1 + b). In both formulas, b is the current fee buffer rate, provided as a constant by the Orderly SDK; always read it from there rather than hard-coding or publishing a specific number, since the platform can change it independently of your frontend.
Because the full potential cost is always locked up front, Predict positions carry no liquidation risk — see Trading Rules: Margin for the trader-facing explanation.
Order cutoff
Every create, edit, and cancel request is judged by the time Orderly’s server receives it, not by a client-side timestamp. Create, edit, and cancel requests all stop being accepted at the same cutoff point shortly before a round’s expiry; any of these three request types that arrives after that point is rejected withROUND_CLOSED.
The cutoff margin defaults to 5000 ms (so orders stop being accepted 5 seconds before expiry), and
the platform can adjust it. Don’t hard-code this value — treat a
ROUND_CLOSED response as the
signal that the cutoff has passed, and never automatically resubmit a ROUND_CLOSED order to the
next round.Cancelling all orders
DELETE/v1/orders without a symbol skips any Predict round that has already passed its cutoff instead of failing the whole request — it cancels everything it still can and moves on.
Filtering by product type
GET/v1/orders accepts an optional product_type query parameter, PERP or BINARY (uppercase only). Omit it to get all products; passing an empty string, lowercase, or any other value is rejected as a parameter error.
Leverage and margin transfers are rejected
Predict positions use isolated margin with no leverage — see Isolated Margin for how isolated margin works generally. For Predict symbols specifically:- Setting leverage on a Predict symbol through POST
/v1/client/leveragesis always rejected, including setting it to 1x. A batch leverage update silently skips any Predict symbols in the batch rather than failing it. - Manually adding or removing margin on a Predict position through POST
/v1/position_marginis always rejected withINVALID_PARAMS.
Exiting a position
To close a Predict position before expiry, submit an opposite-side order withreduce_only=true and a quantity capped at the current position size. This applies whether the exit order is LIMIT, IOC, or POST_ONLY. A reduce_only order never flips a position to the opposite side — it only reduces it, and is still subject to the same price, quantity, and cutoff checks as any other order.
Closing a DOWN position uses the same client-side conversion as opening one (see Converting a DOWN order above): to sell DOWN at price d, send a BUY order at order_price = 1 - d with reduce_only=true.
SELL order at the UP price, with reduce_only=true.
A market-close order flag, if your integration uses one from perpetual futures, is also rejected
for Predict positions with
BINARY_ORDER_TYPE_NOT_SUPPORTED — use the reduce_only approach
above instead.Algo orders are not supported
POST/v1/algo/order and the rest of the algo order family reject Predict symbols; there is no stop, take-profit/stop-loss, or bracket order support for Predict positions.
Errors
Related pages
- Positions and Settlement — read positions, trades, and settlement records, and how fees are calculated.
- Error Codes — the full error reference. The numeric error codes and HTTP statuses for the three Predict-specific errors above are not yet finalized there; match on the error name shown in the table until they are.