404,
the same as one that doesn’t exist.
Read performance
Required scope:account:read.
{ accountId, analytics }. analytics is one consistent snapshot, identified by
asOf, snapshotId and cycle.id. Reading it places no order, moves no balance, resets nothing and
advances no stage. Money is in the account’s currency, stated once at the precision trdrs posts it
in (cents for US dollars) and rounded half to even, so an equity of 50,070.625
reads 50,070.62. Quantities can be fractional, timestamps are UTC ISO 8601, and a fill is dated by
the instant trdrs recorded it.
Example: $3,010 of realized profit, $10 of fees and a $500 promotional credit produce `netTrading: 3000` and `balanceAdjustments: 500`. The credit can't satisfy a $3,500 trading target.
A closed trade’s net profit can differ from the account’s net trading profit while positions are
open, because the entry fees on those positions are already charged to the account.
An account held at a provider answers from the provider’s own records instead, marked
book: "provider". It has no equity history (equityHistory is null) and no breaches, because
your rules don’t apply there.
trdrs judges your risk rules on the account’s present state, at present prices. If an account’s risk
decisions fall more than a minute behind its prices, for example after an outage, they catch up on
those older prices for the record and act only at the present. A rule the older prices broke that the
account no longer breaks once its decisions catch up isn’t reported in risk.breaches: it locks nothing,
closes nothing and doesn’t disqualify the account. A rule the account still breaks fires at once.
completeness.risk reads false until the decisions catch up.
Count trading days
A qualifying day is a distinct session with at least one fill. Opening fills, closing fills and losing trades count. Placing or cancelling an order that doesn’t fill, signing in, receiving a credit, or holding a position overnight doesn’t. Weekends count too: a crypto fill on Saturday counts if it falls in a distinct session. Sessions come from the stage version the account’s running cycle is judged by, the session your venue published with that stage, andtradingDays.session states which one a response counted in.
A cycle no stage judges is counted in the 17:00 America/Chicago roll: at 17:00 local time the next
session starts, its label is the next calendar date, and the time zone observes daylight-saving
changes. No request can choose another session, so no caller can move an account’s days.
trdrs doesn’t evaluate minimum profitable days, minimum volume per day or exchange-holiday
exclusions. If your stage rule needs them, check them in your backend before you advance.
Page through equity history
equityHistory.points holds the latest samples, up to 1,000, newest first, at most one a minute.
trdrs samples each account’s balance, and its equity from the account’s risk valuation, with a
null equity while that valuation doesn’t cover the account. It’s a sampled curve, not tick-by-tick
history or proof of the exact intraday high and low, and it can have gaps. continuous is always
false.
mayHaveOlderSamples says another page exists. Request the same analytics URL with equityBefore
set to equityHistory.nextBefore to get the next older page, and continue until nextBefore is
null. Check that cycle.id hasn’t changed on each page, and start again if it has. Every other
field describes the latest snapshot, not the page’s time. A missing or stale mark gives a null
equity point, never an invented zero, and a mark values a position for at most 10 seconds.
Check completeness before you use a total
tradingisfalsewhen the cycle’s fills and balance don’t reconcile (balance_does_not_reconcile), a fill’s terms are unknown (execution_terms_unknown), a charge is owed that nobody could price (charge_unpriced), or a source passes 50,000 rows (source_limit_exceeded).reasonsnames each one. A capped response holds partial data, so don’t use its totals as final performance.riskistruewhile the account’s risk decisions cover its whole current cycle, andriskReasonssays why when they don’t. An account whose cycle isn’t fully covered readsfalse, even if no breach can be found.currentEquityisfalsewhile the risk valuation doesn’t cover the account.equityHistoryreadssampled_not_continuous.unresolvedCommandscounts orders and commands whose outcome isn’t known. Any of them blocks advancement, even when the account looks flat.
Read reset boundaries
cycle.startedAt is when the account opened or was last reset. A reset starts a new cycle.id and
restarts the trading-day count and the profit figures. cycle.resetBoundaries lists the reset
boundaries, and cycle.resetAt is the latest reset. The read covers the current cycle alone, so
priorTradingHistoryAvailable is always false. Export analytics before a reset if you need that
history.
When completeness.risk is false, don’t reset the account just to make it pass: review its
history separately. A new cycle is covered from its start, and trdrs never declares an earlier
cycle’s missing evidence complete.
Check a stage and advance
Stage eligibility and the advance are separate venue operations.GET /api/venues/{venueId}/accounts/{accountId}/stages/{stageId}/eligibility measures the
account against the rules its current cycle opened under and states every failing reason, and
POST .../stages/{stageId}/advance issues the one next account a passed stage allows.
Run a venue walks through both.
Handle errors
Never read an error or a missing figure as a pass.