Developer documentation for the Muunship 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/accounts/{id}/positions — Open positionsGET /v1/accounts/{id}/orders — Trade history (returns executed trades, not working orders)GET /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. 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 (trade scope)DELETE /v1/accounts/{id}/positions — Flatten 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 account is inactive.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.429 — Rate limit exceeded. Limit: 120 requests/minute per API key.502 — Broker rejected the order or did not return an order ID.503 — Broker connection unavailable or broker manager down. Safe to retry.500 — Internal server error. Contact support.With Muunship 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. Muunship 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. Muunship costs $30 for the first month, then $15/mo 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.
Not today. A webhook payload supports a single bracket with one take-profit and one stop-loss. Multi-target scale-outs, trailing stops, and automated breakeven moves require multiple API calls or manual management of the remaining position.
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"} to your webhook URL — flat, flatten and exit work too, and no symbol or qty is needed. This flattens the account: it cancels every resting order and closes every open position on it, not just one symbol. Because of that, if you include a symbol and the account is also holding a different one, the request is refused with 409 and nothing is closed, rather than liquidating a position your alert never mentioned. To exit one symbol precisely, send an ordinary opposite-side buy or sell for that quantity instead.
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 Muunship 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.