Developer documentation for the Signal Trade App API: place orders, read positions, cancel pending orders, copy trades, and stream connection health with a single API key.
GET /v1/accounts — List connected accountsGET /v1/stream — Live stream of orders, fills, positions, balances and trailing drawdown (SSE). Use this instead of pollingGET /v1/accounts/{id}/positions — Open positions (snapshot; for live updates use /v1/stream)GET /v1/accounts/{id}/orders — Trade history (returns executed trades, not working orders)GET /v1/fills — Fill ledger: every execution with broker account, fill id, order id, price, fees and time. Catch up after downtime with ?after=<cursor>GET /v1/accounts/{id}/risk — Stored risk settings (returned, not enforced), lock state and remaining drawdown (equity, liquidation level, profit to pass). Live updates on /v1/streamGET /v1/accounts/{id}/working-orders — Live working orders from the broker — unfilled entries and active TP/SL legsPOST /v1/accounts/{id}/orders — Place order, optionally with bracket TP/SL; timeInForce "Day" (default) or "GTC". Supports Idempotency-Key (trade scope)DELETE /v1/accounts/{id}/orders/{orderId} — Cancel a single order. Never flattens an open position (trade scope)POST /v1/accounts/{id}/protect — Attach/replace broker-native TP/SL OCO on an open position; timeInForce "Day" (default) or "GTC"; optional expected → 409 if the position changed (trade scope)POST /v1/accounts/{id}/positions/close — Close one symbol; optional expected → 409 if the position changed (trade scope)DELETE /v1/accounts/{id}/positions — Flatten ALL symbols on the account (trade scope)GET /v1/strategies — List strategies (beta)POST /v1/strategies — Create strategy (beta, trade scope)POST /v1/strategies/{id}/evaluate — Evaluate strategy (beta, trade scope)GET /v1/strategies/{id}/logs — Execution logs (beta)POST /v1/webhooks — Create webhook token (trade scope)GET /v1/user — Current user infoGET /v1/connection-health/stream — Real-time connection status SSE streamBoth full contracts and root symbols are accepted; roots resolve to the current front-month contract automatically.
MNQU6 — Full contract — used exactly as givenMNQ — Root symbol — resolved to the front month (MNQU6)MNQ1! — TradingView continuous contractMNQ! — TradingView continuous, no digitCME:MNQ1! — Exchange-prefixedMNQU26 — MetaTrader four-digit year — normalised to MNQU6400 — Validation failed — check the error.details array for field-level issues.400 — UNKNOWN_SYMBOL — the symbol could not be resolved to a tradable contract. The message names the symbol. Do not retry without changing it.401 — Invalid or missing X-API-Key header.403 — API key does not have permission for this scope, or the account is inactive, or it is locked from the Risk page (ACCOUNT_LOCKED: new orders refused; flatten still works).409 — CANCEL_REJECTED — the broker refused the cancellation, usually because the order already filled or it no longer knows the ID. Terminal: do not retry.422 — BROKER_ORDER_REJECTED — the broker refused the order; the message carries its reason (e.g. "You need an active Prop Firm subscription to trade this contract"). Terminal: do not retry without changing the request or fixing the account at the broker. (Returned 502 before this change.)429 — Rate limit exceeded. Limits: 120 requests/minute per API key, and from October 17, 2026, 12 reads/minute of the same endpoint. Use /v1/stream instead of polling.502 — BROKER_ORDER_REJECTED with "did not return an order ID" — the broker gave no clear answer, so the order may or may not be working. Check GET /working-orders before retrying.403 — ACCOUNT_INACTIVE — the account is closed or inactive at the broker (e.g. an ended eval). Also returned by reads such as GET /working-orders. Terminal: do not retry until the account is active again.503 — BROKER_NOT_CONNECTED — broker connection unavailable or broker manager down. Safe to retry.503 — BROKER_LOGIN_REFUSED — the broker is refusing this connection's login; the message carries its reason and since when. Retrying will not help until the login is fixed at the broker and the connection reconnects. Slow down or stop polling.500 — Internal server error. Contact support.With Signal Trade App you skip the Tradovate developer application entirely. Sign up, go to Settings, and generate an API key in seconds. That single key lets you place orders, read positions, and copy trades across all connected Tradovate accounts.
Tradovate enforces strict per-endpoint quotas that vary by account type. Signal Trade App aggregates and smart-routes requests within those limits so you do not have to track them yourself. Our API allows 120 requests/minute per API key.
Tradovate charges for market data and requires a funded account. Signal Trade App costs $29/month, with a 5-day free trial. A $599 self-hosted lifetime license is also available. There is no separate API fee.
Yes. We maintain persistent WebSocket connections to Tradovate for real-time fills, positions, and order status. You get the speed benefits of WebSocket without writing any WebSocket code — our REST API and webhook endpoints abstract it all into simple HTTP calls.
Yes. Create a webhook token via the API, paste the URL into any TradingView alert, and every alert fires a trade on your Tradovate accounts automatically. No Pine Script changes needed beyond setting the webhook URL and JSON payload.
Yes, with two alerts. Enter with a normal buy or sell alert, then send {"action":"protect","symbol":"MNQ1!","sl":[19900],"tp":[20050,20100],"beAfterTp1":true}. Each tp price becomes its own leg and the position is split evenly across them (4 contracts become 2 + 2), the stop covers the whole position, and when TP1 fills the stop shrinks to what is left and moves to your entry price. Add "beOffsetTicks": 1 to put it one tick past entry. You never send quantities: the engine sizes every leg from the open position. This needs Managed protection turned on in Settings → Trading; with it off the protect alert is refused.
Yes. DELETE /v1/accounts/{id}/orders/{orderId} cancels a single order using the orderId returned when you placed it. It is order-scoped and never flattens: if the entry partially filled, the filled portion stays open as a position and only the unfilled remainder is cancelled. This makes it straightforward to place a resting limit order and cancel it automatically if it has not filled within a set time.
If the bracket entry has not filled yet, cancelling the entry also removes its attached take-profit and stop-loss — you only cancel the entry ID. Once the entry has filled, the TP/SL are live protection on a real position and are cancelled individually by their own order IDs; cancelling them does not close the position. Note that cancelling one leg of a filled bracket re-places the surviving leg under a new order ID, so re-read the working-orders endpoint rather than caching leg IDs.
Both full contracts and root symbols. MNQU6 is used as given, while MNQ, MNQ1!, MNQ!, CME:MNQ1! and the MetaTrader four-digit form MNQU26 all resolve to the current front-month contract automatically. If a symbol cannot be resolved the request fails immediately with 400 UNKNOWN_SYMBOL naming the symbol, and no order is sent to your broker.
Use GET /v1/accounts/{id}/working-orders, which reads the broker directly and returns orders currently resting — unfilled entries and active TP/SL legs. The similarly named /v1/accounts/{id}/orders returns closed trade history rather than working orders, a legacy name kept for backwards compatibility.
Send {"action": "close", "symbol": "MNQ1!"} to your webhook URL — flat, flatten and exit work too, and no qty is needed. That closes the MNQ position and cancels its working orders, and leaves every other symbol on the account alone. Leave out the symbol and the close flattens the whole account: every working order cancelled and every open position closed.
A webhook token is tied to one specific account. If your broker stops reporting that account — which commonly happens when a prop-firm evaluation is reset, breached, or replaced with a new one — the token keeps receiving alerts and rejects every one with 403 Account is inactive, even though your other accounts are connected and healthy. The Signals page flags any token in this state and names the affected account; edit the token to point at a live account and alerts resume immediately.
“I came across Signal Trade App while looking for a reliable webhook provider for my trading automation project, and it turned out to be exactly the tool I needed. […] It not only handles webhook-based trade execution, but also provides the flexibility and API functionality needed to build much more complex automation systems on top of it. […] I contacted the team with a request for additional API functionality, and the feature was implemented and documented the very next day. That level of responsiveness is exceptional.”
Wladimir, DE — rated 5 out of 5
Reviews published on Trustpilot.