Trade through sessions and auctions
Read a market's session state and calendar, collect orders during preopen, follow the live indicative auction price, and handle the uncross and the official close from an integration.
A market with a trading calendar moves through sessions: closed, preopen, then open, with the open happening through a call auction that clears once at a uniform price. Your integration reads the session state from the market, the schedule from the calendar, and the live indicative auction price from the book snapshot and the stream. This page covers those reads and what order placement does in each session state. For placement mechanics and signing, see Place and cancel orders.
Prerequisites
- An API key with an active organization, or an authenticated session.
- A market id from
GET /api/v2/addons/trading-venue-markets. A private market you are not approved for answers not-found on every read on this page.
Read the session state
Every market read carries the session axis alongside status:
curl -X GET "https://your-platform.example.com/api/v2/addons/trading-venue-markets/0198f1c4-5e6f-7a80-bc13-4d5e6f7a8b9c" \
-H "X-Api-Key: sm_dalp_xxxxxxxxxxxxxxxx"The market body includes, among the part-1 fields:
{
"mode": "continuous",
"private": false,
"auctionRemainder": "carry",
"closeMethodology": "last-trade",
"closeVwapWindowMs": null,
"sessionState": "preopen",
"timezone": "Europe/Brussels"
}| Field | Meaning |
|---|---|
sessionState | closed, preopen, open-continuous, or auction-collection. A market without a calendar is always open-continuous. |
mode | continuous or auction-only. Immutable after listing. |
auctionRemainder | What happens to unfilled remainders after an uncross: carry re-rests them at original priority, cancel closes them. Fixed at creation. |
closeMethodology | How the official close is computed: last-trade or vwap over closeVwapWindowMs milliseconds before the close. |
timezone | The IANA timezone of the market's calendar; null without a calendar. |
sessionState is orthogonal to status: a halted market keeps its session state, and a session transition never cancels anything.
Read the calendar
curl -X GET "https://your-platform.example.com/api/v2/addons/trading-venue-markets/0198f1c4-5e6f-7a80-bc13-4d5e6f7a8b9c/calendar" \
-H "X-Api-Key: sm_dalp_xxxxxxxxxxxxxxxx"{
"data": {
"marketId": "0198f1c4-5e6f-7a80-bc13-4d5e6f7a8b9c",
"timezone": "Europe/Brussels",
"uncrossWindowMs": 30000,
"days": [{ "weekday": 1, "preopenTime": "08:00", "openTime": "09:00", "closeTime": "17:30" }],
"exceptions": [{ "date": "2026-12-25", "closed": true }],
"occurrences": [
{
"sessionDate": "2026-08-24",
"preopenAt": "2026-08-24T06:00:00.000Z",
"openAt": "2026-08-24T07:00:00.000Z",
"closeAt": "2026-08-24T15:30:00.000Z",
"appliedState": "none",
"officialCloseTick": null
}
]
},
"links": { "self": "/v2/addons/trading-venue-markets/0198f1c4-5e6f-7a80-bc13-4d5e6f7a8b9c/calendar" }
}days and exceptions are the operator's template in local wall-clock time; occurrences are the materialized sessions in UTC instants, chronological, with a bounded tail of recently closed sessions whose officialCloseTick carries the official close.
The openAt of an occurrence is the scheduled open, not the exact opening moment. The uncross happens at an undisclosed instant within uncrossWindowMs milliseconds after openAt; the drawn instant is never published, by design, so an integration cannot target the last order before the uncross. Treat the window end as the latest moment by which the market opens.
GET /api/v2/addons/trading-venue-market-calendars lists the calendars of every market you can see, paginated.
Place orders during preopen
During preopen and auction-collection, order placement works exactly as in continuous trading, including reservation: the platform accepts and reserves your signed order, and it rests for the uncross without matching. You can cancel throughout the collection window. During closed, intake rejects new orders with the session named as the reason; resting good-till-cancelled orders persist across sessions at their price-time priority.
Follow the indicative auction price
While the market collects orders, the book snapshot carries the live auction equilibrium:
{
"sequence": "42",
"bids": [{ "priceTick": "1010", "quantity": "5000000000000000000", "orderCount": 2 }],
"asks": [{ "priceTick": "1008", "quantity": "3000000000000000000", "orderCount": 1 }],
"indicativePriceTick": "1009",
"indicativeQuantity": "3000000000000000000"
}indicativePriceTick is the price the auction would clear at right now, and indicativeQuantity the base quantity that would match there. Both are computed over the self-trade-excluded book, so the published price is achievable. They are null outside preopen and auction collection, and null while nothing crosses.
The stream delivers the same value as a dedicated indicative event whenever the book changes, throttled to the venue's publication cadence:
event: message
data: {"type":"indicative","marketId":"0198f1c4-5e6f-7a80-bc13-4d5e6f7a8b9c","sequence":"57","priceTick":"1009","quantity":"3000000000000000000","asOf":"2026-08-24T06:59:58.000Z"}Depth snapshots and diffs key on the engine log sequence, not on trades, so preopen book changes reach stream subscribers even though no trade prints. See Read market data and streams for the stream contract.
Handle the uncross
At the drawn instant, the engine uncrosses once. Every crossing fill executes at one uniform clearing price, selected to maximize executable volume, then minimize the residual imbalance, then stay closest to the reference price, and validated on-chain between each fill's own limits. From your integration's view:
- Filled quantity appears in the blotter and in a
tradesstream batch at the clearing price. - The unmatched remainder of your order keeps working at its original price-time priority on a
carrymarket, or closes on acancelmarket. sessionStatemoves toopen-continuouson a continuous market, or back toclosedon an auction-only one.
A stop order's trigger also accepts the auction clearing print; see Place stop orders.
Read the official close
After each close, the session occurrence carries officialCloseTick: the official closing price by the market's methodology, computed from settlement-confirmed trades excluding busted ones. The same value publishes to the platform's price-feed infrastructure as a new observation marked as the official close. A session without trades carries null and publishes nothing.
Errors
| Status | What happened | What to do |
|---|---|---|
404 | The market id does not name a market you can see. For a private market this is deliberate: not-found is the only answer shape for non-members. | Use a market id from your own markets list. |
422 on placement | Intake rejected the order; during closed the reason names the session. | Wait for the next session, or check the calendar occurrences. |
Related
- Place and cancel orders for signing and placement.
- Read market data and streams for the stream and resync contract.
- Configure trading calendars for the operator view of the same calendar.
- Trading venue market structure for the auction model in full.
How to place and cancel Trading Venue orders
Sign an EIP-712 order intent, submit it to the Trading Venue, poll the reserved-balance transaction to completion, and cancel a working order on-chain.
How to place Trading Venue stop orders and set time in force
Arm a stop order that reserves nothing while dormant, understand what triggers it and what can invalidate it, and choose between GTC, GTD, and IOC time in force.