These routes are a preview, served on the sandbox to every venue. Production availability is
arranged with trdrs when your venue qualifies.
Before you start
You need a venue and a Venue key for it, created on the back office’s API keys page. The business quickstart walks through both. The key carries every Venue scope, including the ones this guide uses:venue:read, venue:configure, account:issue,
account:read, risk:halt and stage:advance. Venue keys lists what each scope opens.
Set these once in your server’s environment:
VENUE is your venue’s ID. The TypeScript examples use this setup:
Idempotency-Key header of 1 to 128 characters, and a write without one is
refused as 400 idempotency_key_required. Brand writes are the exception and take no key. Send the
same key with the same body again and you get the first result back, so retrying after a timeout is
always safe. The same key with a different body is refused with 409 idempotency_conflict, because
one key can’t stand for two different requests.
Most setup writes also take an expectedRevision: the revision you last read, or null when you’re
creating the thing for the first time. If someone changed it since you read it, your write is
refused with 409 version_conflict instead of overwriting their change.
1
Describe what you trade
Save an instrument candidate for each instrument you offer. A candidate states the facts an
order is checked against: the quantity grid, the tick sizes, the contract multiplier, the
trading sessions, the expiry, and which provider symbol it maps to where orders leave trdrs.Required scope:
venue:configure.instrument.json holds { "specification": { ... } }. The API reference for
Save an instrument candidate
has a complete example, and the
instrument reference catalog
gives you the contract facts for common futures, so you don’t have to look them up.For a registered perpetual, CFD or dated future, read
/api/venues/{venueId}/reference/contract?symbol=HYPERLIQUID%3ABTC for the exact contract
version, currencies, payoff, quantity units, price bands and price source, and copy its
contractVersion into the new candidate. Leave contractVersion out of the read to get the
contract’s default registered version, or add it to read that version instead. Quote and
settlement currencies can differ under a stated payoff, so keep both as the reference states
them rather than setting them to the account’s currency. A builder-deployed Hyperliquid
perpetual, named by its dex and coin (HYPERLIQUID%3AXYZ%3ATSLA), reads the one registry version
that holds it, and a policy that margins it by Hyperliquid’s profile takes that market’s own
leverage tiers and margin modes from its dex, in the one cross pool where the market offers cross
margin. The reference changes no listing or
account, and it leaves sessions, order limits, minimum notional and feed access to you: set those
in the candidate, and margin and funding in your published risk policy.The response is 201 with the saved instrument and its id. A candidate is a saved version:
no account trades it until you activate it in step 3.2
Decide where orders go, and what protects them
A route says where a group’s orders are filled. An The response is the saved
internal route fills them on the paper
book, the simulated market priced from live data that evaluation accounts trade on. An
external route sends them to a provider you have connected, naming the connection and the
account there.Required scope: venue:configure.route with its revision.The collar is your traders’ price protection: how far past a fresh quote a fill may land and
still be accepted, in ticks or basis points. A buy is measured from the ask and a sell from the
bid. Your markup has to fit inside the same collar, so a markup that would push a fill past it
refuses the fill instead of charging more than you promised. A route that leaves the collar out
gets zero ticks, the strictest setting. An internal route refuses uncappedMarketAllowed: true
with 400, because the collar is its protection.A change to where orders go or what protects them waits until the route’s accounts are flat,
because it changes a trade that’s already open: its mode, connection or account, its collar, its
feeReservePerUnit or uncappedMarketAllowed. While one isn’t flat, the change answers
409 not_quiescent with the accounts in blockers. A rename or a retirement applies at once.3
Activate the instrument
Activation points your catalog at one saved candidate. It’s the only thing that makes an
instrument tradable. The instrument needs something that can carry its orders: a mapping to a
live provider connection, or the
internal route from step 2.Required scope: venue:configure.instrumentVersionId is the id step 1 returned. The response is the activation, and the
instrument now shows in your active list.A rename or an entry halt applies at once. Any other change to an active instrument changes what
an open position is worth, so it waits until every account at your venue is flat in that
instrument. If one isn’t, you get 409 not_quiescent with the accounts that are still open, so
you know exactly what to settle.4
Set what an account is charged
A condition profile is your pricing plan and your safety limits: the commission, your markup in
ticks each way, and the limits on order size, position size, notional, the instrument list and
new entries. Every field is stated explicitly. A zero commission is a real choice, and a field
you leave out is inherited from the layer above rather than defaulted.Required scope: The response is
venue:configure.201 with the published profile and its id. Publishing applies nothing.
Put it in force with POST /api/venues/{venueId}/conditions/active, sending
{"profileId": "...", "expectedRevision": null}. Tightening a safety limit or renaming applies
at once. Changing commission or markup waits until every account at your venue is flat.Two fields need care. margin is always null, because what an account must hold comes from
your published risk policy, not from its pricing plan. dailyLossLimit
takes a value only while every account you issued is held to your published risk policy;
otherwise a value is refused with 400 loss_limit_unenforced and field naming the limit. A
limit you save applies to each account from its next session day, and an account that breaks it
is held until you reset it.5
Check a change before you make it
POST /api/venues/{venueId}/conditions/preview tells you whether a proposed profile or
group override changes what accounts are charged, how many accounts it reaches, and which of them
aren’t flat. Send {"profileId": "..."}, or {"groupId": "...", "override": {...}}. It takes
venue:read and writes nothing.A preview holds nothing in place: an account can open a position between your preview and your
change. That’s why the change checks again when you make it.6
Create a group and point it at the route
A group is a set of accounts with one route and one set of rules. Each account in it keeps its own
balance. A prop firm’s evaluation is a group, and so is each later phase of it.
POST /api/venues/{venueId}/conditions/groups creates or updates a group. Send its
groupId, a name, an override of the profile ({} for none), the stageId its accounts run
if it’s an evaluation, and expectedRevision. Then
POST /api/venues/{venueId}/groups/{groupId}/route points it at a route with
{"routeId": "book"}. Both take venue:configure. Changing a group’s charges or its stageId
waits until the group’s accounts are flat.A group starts with no route, and its accounts can’t open anything new until you point it at
one. They can always close what they hold.Two calls work on one account:POST /api/venues/{venueId}/conditions/accounts/{accountId}/groupmoves an account into a group with{"groupId": "..."}, or out of every group withnull.POST /api/venues/{venueId}/conditions/accounts/{accountId}/risksets tighter limits for one account, such as{"risk": {"maxOrderQuantity": "2"}}. These can only tighten what the venue and group allow, so they apply at once.
GET /api/venues/{venueId}/conditions/accounts/{accountId}/effective. Each value comes
back with the layer that decided it: the venue, the group or the account.7
Turn on venue rules
Venue rules are your venue applying its own order limits, stages and analytics to the accounts
it issues. Creating your first group turns them on.
POST /api/venues/{venueId}/rules
with {"enabled": false} turns them off and {"enabled": true} turns them back on
(venue:configure). With them off, your settings stay saved but aren’t applied to trading.Read your venue with GET /api/venues/{venueId} to see where your rules apply.
rules.applies covers accounts on the paper book: orders, fills and stages. rules.appliesAtProvider
covers accounts held at a provider, and all three are false there, because the provider’s own
path carries those orders and fills.8
State the stage rule
If you run evaluations, publish the rule a trader has to meet to pass each phase. Many firms call
an evaluation a challenge and each step of it a phase. On trdrs a phase is a stage, and the
accounts taking it sit in a group whose The response is
stageId names it.Required scope: stage:advance.201 with the published policy and its id. Put it in force with
POST /api/venues/{venueId}/stages/active, sending {"policyId": "...", "expectedRevision": null}.
GET /api/venues/{venueId}/stages/policies lists what you’ve published
(venue:read).Each evaluation is judged by the rule version that was in force when it started. A new version
takes effect at once and reaches each account at its next cycle, so nothing already running is
judged by it.
nextGroupId is the exception: changing only where a passing trader lands applies
at once, even to evaluations already running.The rule is stored rather than sent with each advance, so nobody can make a target easier by
asking a different question.9
Issue accounts into the group
Publish a risk policy for your accounts, then issue each trader an account in the group.
Venue accounts covers both calls, and everything else you do with an
account once it exists: credits and payouts, resets, trading permissions and analytics.
10
Read one account's books
Read an account’s balance, the collateral its working orders hold, its open positions at their
average cost, and the route it trades through.Required scope: This read covers accounts whose balance trdrs keeps. An account held at a provider keeps its books
there, so it answers
venue:read.404 here.Two more reads explain what an account can do:GET /api/venues/{venueId}/accounts/{accountId}/instrumentslists your active instruments as they apply to this account. A blocked instrument is listed with its reasons inblockedBy, whether a halt, the instrument list or a retired route, so you can tell a trader why something they traded yesterday isn’t there today.poolRefusalsays what the account’s risk policy refuses, in the code an order would be refused with. Acollateral_policy_unverifiedrefusal can carryparams.detail: the failing check’scodeandmessage, and for an instrument that disagrees with its registered contract, thefieldwith itsexpectedandactualvalues. Correct that field in a new candidate, since a candidate never changes once saved. A price feed doesn’t change a contract’s currencies or multiplier. Every reason is about opening new positions: a blocked account can still close what it holds. This read can’t see prices, balances or streams, so an instrument with no reasons isn’t a promise that an order fills.GET /api/venues/{venueId}/accounts/{accountId}/incidentreads the account’s open liquidation, if any, with every step taken to reduce it. An open liquidation stops new positions, and closing it doesn’t lift that. Whether the account trades again is your decision.
11
Advance a trader who passes
Check an account against its stage rule. The answer is measured from the account’s own trading,
never from numbers you send.Required scope: The response’s
venue:read.eligibility.verdict has eligible and reasons, which lists every condition
still unmet at once, so a trader one day and one open order short hears about both. facts
carries the measurements, such as netTradingPnl, which never includes the starting balance or
any balance operation.When the account is eligible, advance it with
POST /api/venues/{venueId}/accounts/{accountId}/stages/{stageId}/advance
(stage:advance). The body is {"startingAllocation": {"numerator": "10000000", "denominator": "100"}},
a fraction for the next account’s starting balance (this one is 100,000.00), or
{"startingAllocation": null} for a next account that starts at zero. The field is required.The advance issues one new account in the stage’s nextGroupId and returns it. It happens once
per evaluation: a second attempt, even with a different Idempotency-Key, returns the account
the first one made, because an account once issued can’t be taken back.Read why an account can’t advance
The eligibility read lists these inreasons. The advance answers 409 not_eligible with the
same list.
The advance can also answer these:
Plan groups for prop firms and brokerages
One venue holds as many groups as you run, and they share its instruments while each keeps its own route and rules.- A prop firm runs groups on the paper book. You issue their accounts, their route is
internal, and a stage rule moves a trader from one account to the next. Prop firms covers this path. - A brokerage runs a group on a provider. Its route is
external, naming a provider connection and the account there. You create and price it like any other group, and its orders go through the route once the connection has passed validation and that account is bound to your venue. Brokerages covers this path.
Know what’s checked elsewhere
- Readiness to trade. An order still needs margin, a fresh price and a live account stream, and each is checked when the order arrives.
- Plugging in a provider. That’s your venue’s Providers tab in the back office, which shows each provider’s kind and login style, and the provider and connection routes in the API reference. A connection carries orders only after it passes validation against the provider’s own declaration. Connect, the trader’s account picker, lists your venue once you get listed.
- How a provider fills. Provider conformance proves a public provider follows the provider contract. It runs against a reference provider with no order book, no slippage and no latency, so it measures the contract, and how a real market fills is yours to test.
Test it end to end
Walk the whole sequence in the sandbox with a test trader who has signed up there.- Save and activate one instrument, create the
internalroute, publish and apply a profile, and create a group on the route with astageId. - Publish and activate a stage policy with a small
profitTarget. - Issue the test trader an account in the group, as Venue accounts shows.
- Read its eligibility. A new account answers
eligible: falsewithprofit_target_not_met,minimum_trading_days_not_metandvenue_pause_requiredamong its reasons. - Call the advance. It answers
409 not_eligiblewith the same reasons, and no account is issued.
Next steps
Venue accounts
Publish a risk policy, then issue, credit, reset, halt and read accounts.
Prop firms
See how evaluations, stages and advances fit together.
Receive events
Get resets, balance operations and risk locks pushed to your server.
Venue keys
See what each scope opens, and keep the key on your server.