clientOrderId alone, another only together with its instrument. One market accepts market orders sized in quote currency, another only in contracts. One venue reports index prices, another does not.
Plurex does not hide these differences behind behaviour you have to discover. Every host and every venue publishes its capabilities: a complete, machine-readable statement of which operations and variants it supports, and every market publishes the rules and options that apply to it. Your program reads them once, decides what to call, and never needs trial and error or exchange-specific code.
What capabilities promise
- Nothing is left out. Every operation and every variant always appears. Unsupported entries say
NotSupportedexplicitly, so a missing field never has to be interpreted. - One shape everywhere. Every host publishes the same tree, and every venue publishes the same tree. Code that reads one host’s capabilities reads them all, including paper hosts.
- Decide before calling. If the capabilities say an operation is supported for a market and your inputs follow that market’s published rules, Plurex passes the request to the host. If they say it is not supported, the call returns
422 NotSupported. The host can still refuse a request for reasons no capability describes, such as insufficient funds. - Every option has its own flag. Plurex never infers one capability from another. For example,
supportsPositionEffectis independent of whether the market has a position mode setting. - Plurex validates exactly what it publishes. Order rules are checked as published, and Plurex never rounds your inputs. See Market order rules.
Where capabilities live
Capabilities come in two levels: the header of each host or venue, and the summary of each of its markets. All four are read with public discovery operations that need no API key. All of them are paged: follownextCursor until it is null.
A venue market tells you what is trading. The matching host market tells you what you may order there. A host market names its venue in
venueId, so you can join it to the venue market with the same instrument.
The header: area, operation, variant, support
A header capability is a tree. Its first level is an area (orders, fills, marketSettings, prices, candles), under which are operations and, where an operation has them, its variants. Each leaf is a support value. A few areas add a level (prices has one entry per price kind) or skip one (marketSettings.getMarketLeverage has no variants), and the stream areas also carry plain values such as changes and includesFillDetails:
type. The leaf orders.getOrder.byClientOrderIdForInstrument gates a GetOrder request whose query.type is ByClientOrderIdForInstrument; orders.listClosedOrders.globalBefore gates ListClosedOrders with query.type GlobalBefore. All variants of one operation return the same result shape.
The market: descriptors with nullable presence
Market summaries do not repeat the support values. They use descriptors:- A descriptor that is
nullmeans the market does not support that thing at all. For example,orderTypes.market: nullmeans no market orders on this market, andsettings.leverage: nullmeans the market has no leverage setting. - A non-null descriptor carries the terms you need: increments, minimums, time-in-force sets, candle intervals, the statistics window.
- Inside a descriptor, each operation has its own flag:
getfor a read,listandlistBeforefor candles, andsetEffectScope(non-null when the setting can be changed). A non-null descriptor can still have one of its flagsfalse, so check the specific flag.
Market, TriggerLimit or TriggerMarket orders is read only from that market’s orderTypes.
Support values
Every support leaf is anOperationSupport, or a CursorQueryCapability for variants that return pages. Both are unions on type.
Supported is a statement about the whole host or venue: it means every market the host lists, not every instrument that exists. PerMarket promises nothing about any particular market until you read that market’s summary.
Paged variants (open and closed orders, fills, transactions, candles) use CursorQueryCapability. Its Supported case also states defaultOrdering: Chronological or ReverseChronological. That is the order results come in, within and across pages. Pages are read live, so items can change while you page.
Native and emulated
implementation tells you how a Supported operation is carried out:
Native: the host’s own operation is used.Emulated: Plurex builds the result from other host calls, or performs the operation itself.
502 CancelAllFailed, after which ListOpenOrders shows what is still open.
implementation appears only on Supported entries. PerMarket entries and market descriptors do not say how a market’s support is provided.
Always supported
A minimal trading loop works on every host and every venue. These entries are alwaysSupported; they still appear in the capabilities, so the tree stays complete and tells you whether each is native or emulated.
Some operations have no capability entry because every host offers them: SubmitOrder itself (the market’s
orderTypes say which order types it accepts), ListWallets, ListOpenPositions, ListAccountMarginStates, GetAccountMarketState, and the List and ListMarkets discovery operations.
Everything else is optional. In the API reference, optional operations carry the Check capabilities badge: “Not every host or venue supports this operation; check its capabilities first or expect 422 NotSupported.” An operation without the badge, such as GetOrder or CancelOrder, can still have optional variants; their byClientOrderId variants are gated like any other.
Can I do X on market M of host H?
Resolve any operation the same way: start at the header, and go to the market only when the header saysPerMarket or when the operation has market-level terms.
orderTypes, and check the header’s orders.submitOrder.clientOrderId only if you send a clientOrderId.
Which descriptor answers which operation:
The same idea as a Python sketch, for host market settings:
Decimal (or your language’s exact decimal type) for every comparison. Values arrive as JSON strings such as "0.01"; binary floating point will misjudge whole multiples.
Today, market settings in the host header are always
PerMarket or NotSupported, because settings are described per market. Venue market-data reads other than the order book and trades are likewise PerMarket or NotSupported. Write your resolver for the general case anyway; it costs nothing.NotSupported and Rejected
Both are HTTP422, and they mean different things.
Submit orders only for markets the host lists in List host markets; do not expect
NotSupported for an order on an unlisted market.
Batch market-data reads never fail as a whole because one market lacks support. GetPrices and the other batch reads return one result per instrument, and an unsupported instrument comes back as {"type": "Unavailable", "code": "NotSupported", ...}. See Venue capabilities.
The full list of codes is in Errors.
Caching and refreshing
Capabilities and market summaries are safe to cache, but they are not constants. Markets are listed and delisted, hosts add support, order rules and leverage ranges change, and a paper host’s supported transaction types can grow while it runs.- Load headers and the market summaries you trade at startup.
- Refresh them periodically. How often depends on your tolerance for stale rules; for most systems, minutes to hours is enough.
- After a
422 NotSupportedon a call your cache said was supported, reload the relevant header and market summary before deciding again. - After a
422 Rejectedon order inputs you built from cached rules, reload the market summary: an increment or minimum may have changed. - Never hard-code rules from an example or from an earlier response.
Unknown values
Plurex adds enum values, union variants and fields over time without a new API version. Write capability code that survives this:- Ignore fields you do not recognise.
- Treat a
typeyou do not recognise, in a support value or anywhere else, as unsupported for your purposes rather than as an error. - Treat unknown enum values in sets such as
supportedTimeInForce,supportedTransactionTypesorsupportedIntervalsas values you will not use. - Send only values the market’s capability sets list. Requests are strict: an enum value the API does not define returns
400 InvalidRequest, and a defined value the market does not list returns422.
Paper hosts
A paper host publishes its own capabilities, read the same way. Its markets follow the order rules of the real host it simulates, named inmodelHostId, but its operations and options can differ from that host’s in both directions. Read the paper host’s capabilities while you paper trade, and the model host’s before you go live. See Paper trading and Going live.
In depth
Host capabilities
Every order, fill, settings, stream and transaction capability, and what each one gates.
Market order rules
Order types, per-input rules, options, triggers and settings on each host market.
Venue capabilities
Which market-data reads each venue and market supports, and on what terms.