Skip to main content

Create Monitor

Create a monitor for an account. Only account is required. The response is 201 Created with a Location header that points at the new monitor.

Elite

The Management API requires an Elite subscription. See Authentication.

Endpoint​

POST https://app.crosstrade.io/v1/api/manage/nt8/monitors

Headers​

NameRequiredValue
AuthorizationYesBearer <your API token>
Content-TypeYesapplication/json

Body parameters​

NameTypeRequiredDescription
accountstringYesThe account to protect, exactly as NinjaTrader names it (case matters)
any writable fieldsee Monitor fieldsNoLeft out, a field takes the web app default

Code examples​

import requests

resp = requests.post(
"https://app.crosstrade.io/v1/api/manage/nt8/monitors",
headers={"Authorization": "Bearer YOUR_TOKEN"},
json={'account': 'Sim101', 'dailyLossLimit': 500, 'dailyProfitTarget': 1000, 'active': True},
)
print(resp.status_code, resp.json())

Responses​

{
"success": true,
"changed": true,
"data": {
"account": "Sim101",
"nickname": null,
"active": true,
"state": "active",
"stoppedReason": null,
"pnlMode": "standard",
"includeUnrealized": true,
"dailyProfitTarget": 1000,
"dailyLossLimit": 500,
"onProfitTarget": {
"flatten": true,
"signals": "block"
},
"onLossLimit": {
"flatten": true,
"signals": "block"
},
"minimumProfit": {
"enabled": false,
"trigger": 0,
"threshold": 0,
"flatten": true,
"signals": "block"
},
"trailingDrawdown": {
"enabled": false,
"basis": "pnl",
"amount": 0,
"unit": "percent",
"trigger": 0,
"flatten": true,
"signals": "block"
},
"accountFloor": null,
"autoFlattenTime": null,
"tradingWindows": [],
"newsLockout": {
"blockSignals": false,
"flatten": false
},
"blockSignals": false,
"closingOnly": false,
"switchesLocked": false,
"positionProfitTarget": 0,
"positionLossLimit": 0,
"includeCommissions": true,
"cleanSessionProtection": true,
"outlierProtection": {
"enabled": true,
"sensitivity": "low"
},
"created": "2026-10-05T14:31:07Z",
"updated": "2026-10-05T14:31:07Z"
},
"changedFields": [
"account",
"active",
"blockSignals",
"cleanSessionProtection",
"closingOnly",
"dailyLossLimit",
"dailyProfitTarget",
"includeCommissions",
"includeUnrealized",
"minimumProfit.enabled",
"minimumProfit.flatten",
"minimumProfit.signals",
"minimumProfit.threshold",
"minimumProfit.trigger",
"newsLockout.blockSignals",
"newsLockout.flatten",
"onLossLimit.flatten",
"onLossLimit.signals",
"onProfitTarget.flatten",
"onProfitTarget.signals",
"outlierProtection.enabled",
"outlierProtection.sensitivity",
"pnlMode",
"positionLossLimit",
"positionProfitTarget",
"switchesLocked",
"tradingWindows",
"trailingDrawdown.amount",
"trailingDrawdown.basis",
"trailingDrawdown.enabled",
"trailingDrawdown.flatten",
"trailingDrawdown.signals",
"trailingDrawdown.trigger",
"trailingDrawdown.unit"
],
"delivery": {
"status": "queued",
"target": "nt8_addon"
},
"warnings": [],
"meta": {
"requestId": "req_9f2c1a0b7d3e4f51",
"etag": "\"c2:Tm90UmVhbEV0YWcwMg\""
}
}

When it takes effect​

NinjaTrader: sent to the add-on right after the save, or when it next connects. Tradovate: within about 10 seconds.

Notes​

  • New monitors are paused (active: false) unless you send active: true.
  • The account must be yours. On NinjaTrader your add-on must be connected and list the account; Backtest and Playback101 are never accepted. On Tradovate the account is matched against your linked Tradovate login.
  • account may contain inner spaces. Leading or trailing spaces, tabs and other whitespace are refused with 422 validation_failed.
  • A create costs 2 units of your change budget (20 per minute, burst 10), so about 5 creates go through at once and then one every 6 seconds. Creates do not count toward the per-resource budget. See Rate limits.
  • If the response was lost, read the monitor before you retry: a second create for the same account returns 409 already_exists.