422 Rejected without reaching the host.
Read summaries with List host markets. It is public and paged, and takes optional filters:
The host market summary
Every field is always present. Nullable fields are sent as
null, never omitted.
Contract details: what a size means
Every size is in native contracts: one contract iscontractSize units of contractSizeAsset. This applies to orders, fills, positions and size rules. A size is not necessarily an amount of the base asset. Notionals are always amounts of the quote asset.
Quanto contracts also exist; as always, read contractSize and contractSizeAsset rather than assuming them from the type. settlementAsset is null for spot markets, which have no single settlement asset.
The value of a priced order, in the quote asset, is computed from contractDetails:
- When
contractSizeAssetis the instrument’s base asset:value = price × size × contractSize. - When
contractSizeAssetis the instrument’s quote asset:value = size × contractSize. The price does not matter.
Order types
orderTypes has one entry for each order type in SubmitOrder:
Order types have no entry in the host header; the market summary is the only place to check. Sending a type whose entry is
null returns 422 NotSupported. Different order types on the same market can have different rules, so always read the entry for the type you send.
Input rules
Each order type carries one rules object per input. Every number names the input it limits.
Read the edge cases precisely:
min: nullmeans the host publishes no minimum. It does not mean zero, and the host may still reject a very small order.notional.increment: nullmeans the host publishes no step. Plurex checks only the minimum; the host may reject or round the amount. The returned order’ssizingshows what the host accepted, when the host reports it.- Market orders have no value floor here. They have no price to check against. A host may still reject one worth too little at its own price.
- Maximums are not published. The host can still reject an order above its own limits or outside its price bands.
- Minimum size is not enough on its own. A limit order at the minimum size can still fall below
value.min. Check both.
Options
Every request option has its own flag, and nothing is inferred from anything else.supportsPositionEffect is independent of position mode: a market can accept positionEffect whatever its position mode support.
Market order sizing
A market order states its quantity insizing, either {"type": "Size", "size": ...} in native contracts or {"type": "Notional", "notional": ...} in the quote asset. sizingSupport lists which of these each side accepts:
size rules are present exactly when Size appears on either side, and notional rules exactly when Notional does. Using a sizing type the side does not list returns 422 Rejected.
A notional is not a size promise. The size you receive is the notional divided by the fill price, and it can fall below the market’s size.min.
Trigger rules
Trigger orders addtrigger, a TriggerOrderSupport:
referencePrice has two forms, and they require opposite things of your request:
With
HostSelected, price tells you which reference the host uses; null means the host does not disclose it. Do not assume one.
Settings
settings describes the market’s account settings. Each is null when the setting does not exist on this market. The host header must also allow the operation; see Host capabilities.
Leverage
settings.leverage is a MarketLeverageSpec:
A valid leverage
L satisfies min ≤ L ≤ max and (L − min) / step is a whole number. The grid starts at min, not at zero. Off-grid values return 422 Rejected.
Leverage is a market setting, not an order field. settings.leverage: null means the market has no leverage control at all. That is different from GetMarketLeverage returning Disabled, which means the control exists and leverage is off for the account.
Position mode
settings.positionMode lists the modes the market accepts in values (Hedging, Netting), with the same get and setEffectScope fields for GetMarketPositionMode and SetMarketPositionMode. Setting a mode not in values returns 422 Rejected.
How far a change reaches
setEffectScope tells you what else a set changes:
After a set with a wider scope, re-read the setting on the other markets you trade instead of assuming their values.
Build a valid order
Use exact decimal arithmetic throughout; every value is a JSON string such as"0.001". Rounding direction is a trading decision, so Plurex leaves it to you.
1
Find the order type's rules
Take
orderTypes.limit, .market, .triggerLimit or .triggerMarket. If it is null, the market does not accept that type.2
Put price inputs on their grid
Round
price and trigger.price to whole multiples of their increments. For a buy, rounding the limit price down never pays more than you intended; for a sell, rounding up never sells for less.3
Put the quantity on its grid
For a size, round down to a whole multiple of
size.increment and check it is at least size.min. For a notional, check the side allows Notional, round to notional.increment when it is non-null, and check notional.min.4
Check the value floor
For limit and trigger limit orders, compute the value from
contractDetails and check it is at least value.min. If it is short, raise the size by whole increments.5
Set the options from the flags
Pick a
tif from supportedTimeInForce; set postOnly, reduceOnly and positionEffect only where their flags allow.6
Set the trigger
Pick a condition from
buyConditions or sellConditions for your side. Send trigger.reference from prices for UserSelectable; omit it for HostSelected.Worked examples
The rules in these examples are illustrative; read the live values from List host markets.Limit buy on a linear perpetual
Rules:price.increment "0.1", size.increment "0.001", size.min "0.001", value.min "5", one contract is 1 BTC. You want to buy about 1,000 USDT of BTC at 64,123.47.
- Price: 64,123.47 is not a multiple of 0.1. Round down for a buy: 64123.4. Sending
"64123.47"returns422 Rejected. - Size: 1,000 / 64,123.4 = 0.015594…; round down to 0.001: 0.015, which is at least 0.001.
- Value: 64,123.4 × 0.015 × 1 = 961.851 USDT, at least 5.
postOnly is allowed because supportsPostOnly is true; clientOrderId because the host’s submitOrder.clientOrderId is supported.
The value floor
Rules:price.increment "0.00001", size.increment "1", size.min "1", value.min "5", one contract is 1 DOGE. A buy of 20 at 0.15 passes the size rules, but its value is 0.15 × 20 = 3 USDT, below 5: 422 Rejected. The smallest valid size at this price is 5 / 0.15 = 33.3…, rounded up to 34, worth 5.10 USDT.
Sizing an inverse perpetual
contractDetails: {"contractType": "Inverse", "settlementAsset": "BTC", "contractSize": "1", "contractSizeAsset": "USD"} on a BTC/USD PerpInv. One contract is 1 USD. For 2,500 USD of exposure, send size "2500", whatever the price. The order’s value is 2,500 × 1 = 2,500 USD at any price. Never compute an inverse size as a BTC amount times the price.
Market buy by notional
Rules on a BTC/ZAR spot market:sizingSupport.buy ["Size", "Notional"], notional {"increment": null, "min": "10"}, size.min "0.0001".
sizing shows what it accepted. At a fill price of 1,100,000 ZAR you receive about 0.00227 BTC. A 10 ZAR buy would pass the notional minimum but receive about 0.0000091 BTC, below size.min, too small to sell again with a size-based order.
Leverage grid
Stop-loss sell on a perpetual
You hold a long of 0.015 BTC and want to close it at market if the mark price falls to 58,000. Rules:triggerMarket.trigger.price.increment "0.1", referencePrice {"type": "UserSelectable", "prices": ["LastTrade", "Index", "Mark"]}, sellConditions ["RefPriceGTE", "RefPriceLTE"], options.supportsReduceOnly true, supportedTimeInForce ["IOC"].
tif is omitted, so it defaults to IOC, which the set allows. A trigger price of "58000.05" would be rejected as off grid, and omitting reference would be rejected because the policy is UserSelectable.
On a market whose policy is {"type": "HostSelected", "price": "LastTrade"}, the same intent leaves reference out, here as a stop-limit sell:
Example summaries
Illustrative summaries for a linear perpetual and a spot market. The structure is exact; the numbers are examples, so read the live values with List host markets.Venue increments are not order rules
A venue market summary also hasincrements for price and size. They are the grid the venue quotes market data on, for formatting and grouping order book levels. They are not order rules: never price or size an order from them. Use the host market summary. See Venue capabilities.