Skip to main content

Tradovate API

The /v1/api/tv surface exposes your linked Tradovate accounts through CrossTrade. Reads return account state (positions, orders, fills, balances). Mutations (place, cancel, change, close, flatten, reverse) run through the same webhook parser and dispatcher that a destination=tradovate alert uses, so validation, account locks, and trade-copier fan-out behave exactly like a webhook signal.

Alpha

The Tradovate API is in a limited alpha. Endpoints and response shapes may change. The in-app Tradovate Account Manager and Trade Copier pages that pair with it are admin-only for now.

Prerequisites

  • Link a Tradovate account. Connect at least one Tradovate identity under My Account, Brokers tab. Requests for an unlinked user return 403 tradovate_not_linked.
  • API access on your plan. The same plan gate as /v1/api applies. Requests without it return 401 api_requires_pro.
  • A bearer token. Use the same token as the rest of the CrossTrade API. See Authentication.

Base URL and auth

All paths are under https://app.crosstrade.io. Every request carries a bearer token:

NameValue
Content-Typeapplication/json
AuthorizationBearer <token>

The {account} path segment is the Tradovate account name (for example DEMO12345678), matched case-insensitively.

Response envelope

Reads return {"success": true, "data": ...}. Mutations return the dispatcher envelope:

{
"success": true,
"destination": "tradovate",
"api": "place_order",
"account": "DEMO12345678",
"instrument": "MES1!",
"response": { "orderId": 123456789 },
"duration_ms": 214
}

On failure the shape is {"success": false, "error": "<message>"} with a 400 status (or the auth status below).

Read endpoints

MethodPathDescription
<mark style={{color: 'green'}}>GET/v1/api/tv/statusToken and connection status for your Tradovate identities.
<mark style={{color: 'green'}}>GET/v1/api/tv/accountsList your linked Tradovate accounts.
<mark style={{color: 'green'}}>GET/v1/api/tv/accounts/snapshotLive per-account P&L, positions, and working orders in one call.
<mark style={{color: 'green'}}>GET/v1/api/tv/accounts/{account}One account plus a cash-balance snapshot.
<mark style={{color: 'green'}}>GET/v1/api/tv/positionsOpen positions across all linked accounts.
<mark style={{color: 'green'}}>GET/v1/api/tv/accounts/{account}/positionsOpen positions on one account.
<mark style={{color: 'green'}}>GET/v1/api/tv/accounts/{account}/ordersWorking orders on one account.
<mark style={{color: 'green'}}>GET/v1/api/tv/accounts/{account}/orders/{id}One order by Tradovate order id or a prior ORDER_ID.
<mark style={{color: 'green'}}>GET/v1/api/tv/fillsRecent fills across linked accounts.
<mark style={{color: 'green'}}>GET/v1/api/tv/accounts/{account}/fillsRecent fills for one account's identity.
<mark style={{color: 'green'}}>GET/v1/api/tv/cashbalancesCash-balance snapshots.
<mark style={{color: 'green'}}>GET/v1/api/tv/marginsnapshotsMargin snapshots.
<mark style={{color: 'green'}}>GET/v1/api/tv/contracts/find?name=Resolve a contract by symbol.
<mark style={{color: 'green'}}>GET/v1/api/tv/contracts/suggest?text=Contract search suggestions.
<mark style={{color: 'green'}}>GET/v1/api/tv/exchangesExchange list.

Trading endpoints

MethodPathDescription
<mark style={{color: 'orange'}}>POST/v1/api/tv/accounts/{account}/orders/placePlace an order. Market, limit, or stop, with an optional take-profit / stop-loss bracket.
<mark style={{color: 'orange'}}>POST/v1/api/tv/accounts/{account}/orders/{id}/cancelCancel one order.
<mark style={{color: 'orange'}}>POST/v1/api/tv/accounts/{account}/orders/{id}/changeChange one order (price, quantity).
<mark style={{color: 'orange'}}>POST/v1/api/tv/accounts/{account}/orders/{id}/replaceCancel and replace one order.
<mark style={{color: 'orange'}}>POST/v1/api/tv/accounts/{account}/orders/cancelCancel working orders on the account.
<mark style={{color: 'orange'}}>POST/v1/api/tv/orders/cancelallCancel all working orders.
<mark style={{color: 'orange'}}>POST/v1/api/tv/accounts/{account}/orders/cancel_and_bracketCancel working orders, then place a bracket.
<mark style={{color: 'orange'}}>POST/v1/api/tv/accounts/{account}/orders/flatplaceFlatten the position, then place a new order.
<mark style={{color: 'orange'}}>POST/v1/api/tv/accounts/{account}/positions/closeClose a position, full or partial by qty or percent.
<mark style={{color: 'orange'}}>POST/v1/api/tv/accounts/{account}/positions/flattenFlatten one account.
<mark style={{color: 'orange'}}>POST/v1/api/tv/positions/flattenFlatten every linked account.
<mark style={{color: 'orange'}}>POST/v1/api/tv/accounts/{account}/positions/reverseReverse the position.
<mark style={{color: 'orange'}}>POST/v1/api/tv/accounts/{account}/positions/reversepositionReverse the position (position-scoped variant).

Request fields

Mutation bodies use the CrossTrade webhook vocabulary in lower-case JSON. The command and account come from the path, so a body only needs the trade fields. Common fields:

FieldExampleNotes
instrumentMES1!Symbol. Continuous (MES1!), root (MES), or full contract are accepted.
actionbuy / sellOrder side.
qty1Quantity. quantity is also accepted.
order_typemarket / limit / stopDefaults to market when omitted.
limit_price5000.25Required for limit orders.
stop_price4995.00Required for stop orders.
take_profit20Optional bracket target (ticks or price, per webhook grammar).
stop_loss10Optional bracket stop.
percent50For positions/close, close half.

See Webhook Trading for the full field grammar. The same fields, semantics, and bracket options apply.

Example: place a market order

<mark style={{color: 'orange'}}>POST /v1/api/tv/accounts/DEMO12345678/orders/place

TOKEN="my-secret-token"

curl -X POST "https://app.crosstrade.io/v1/api/tv/accounts/DEMO12345678/orders/place" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"instrument": "MES1!", "action": "buy", "qty": 1, "order_type": "market"}'

A limit order with a bracket looks like this:

curl -X POST "https://app.crosstrade.io/v1/api/tv/accounts/DEMO12345678/orders/place" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"instrument": "MES1!", "action": "buy", "qty": 2, "order_type": "limit", "limit_price": 5000.25, "take_profit": 20, "stop_loss": 12}'

Locks and trade copier

Because mutations flow through the webhook dispatcher, two behaviors come for free:

  • Account locks apply. If the Tradovate Account Manager (or a manual switch) has locked the account, a blocked request returns {"success": false, "error": "Signal blocked, kill switch engaged ..."}. A closing-only lock rejects opening orders unless they carry flatten-first semantics.
  • Copiers fan out. If a signal-mode Trade Copier is configured on the account as a leader, an order placed here mirrors to its followers, exactly as a webhook would.

Errors

StatuserrorMeaning
401invalid_bearerMissing or invalid token.
401inactive_subscriptionSubscription is not active.
401api_requires_proYour plan does not include API access.
403tradovate_not_linkedNo linked Tradovate identity on your account.
403endpoint_not_availablePath is not part of the current /v1/api/tv surface.
429rate_limitedRequest rate exceeded.
429egress_limitedResponse egress budget exceeded.
503temporarily_disabledThe Tradovate API is paused by a kill switch.

Limitations

  • Trades placed manually inside the Tradovate app are not seen by this API and are not blocked by account locks. The Account Manager can still flatten after the fact.
  • Enforcement and live data run server-side, so flatten and lock latency is measured in seconds, not milliseconds.
  • Account names use realistic placeholders in this doc (DEMO12345678). Use your own account names.