Skip to main content

Errors

Every error has the same shape:

{
"success": false,
"error": "validation_failed",
"detail": "One or more fields are invalid.",
"fields": [ { "path": "sizing.ratio", "code": "less_than_equal", "limit": 10 } ],
"meta": { "requestId": "req_9f2c1a0b7d3e4f51" }
}
  • error is a stable code from the tables below. Build your logic on it.
  • detail is a plain-English sentence you can show to a person. Its wording can change.
  • fields appears on validation errors and on a few other errors that point at specific fields (for example account_not_found on connection settings, field_locked and switches_locked). path is the field (dotted for nested fields, for example sizing.ratio), code says what is wrong, and limit or pattern shows the bound that was broken. The values you sent are never repeated back.
  • retryAfter (seconds) and a Retry-After header accompany 429 admission refusals and 503 management_busy, and can accompany 409 concurrent_modification. Other 503 errors may omit them. policy names the budget on rate_limited.
  • meta.etag comes with 412 precondition_failed and holds the current ETag.

Request and access errors​

StatuserrorMeaningWhat to do
400invalid_jsonThe body is not valid JSON, has duplicate keys, NaN/Infinity, or is nested too deeplyFix the body
400unexpected_bodyA GET or DELETE was sent with a bodySend no body
400unknown_parameterAn unknown or repeated query parameterRemove it
400invalid_pathThe account name or id in the path is not validCheck the encoding and the value
401unauthorizedMissing, malformed or revoked token, or a disabled accountCheck the Authorization: Bearer header
403elite_requiredYour plan does not include the Management APIUpgrade to Elite
403not_availableThe Management API is not open for your account yetContact support
403plan_requiredYour plan does not include this featureUpgrade your plan
404not_foundNo such resource on your account, or an unknown endpointCheck the path and id
405method_not_allowedThe endpoint exists but not with that method. The Allow header lists the methods it takesUse an allowed method
408body_timeoutThe body was not received within 10 secondsRetry
413body_too_largeThe body is larger than 64 KBSend a smaller body
415unsupported_content_typeThe body is not application/json, declares a charset other than UTF-8, or is compressedSend uncompressed UTF-8 JSON
429rate_limitedA budget is used upWait retryAfter seconds. See Rate limits
429too_many_concurrent_requestsTwo requests are already running for your accountWait for one to finish
500internal_errorSomething went wrong on our sideRetry later; contact support with the request id
503management_unavailableThe Management API is temporarily offRetry later
503management_read_onlyChanges are temporarily paused; reads still workRetry later
503family_unavailableThis part of the API is temporarily offRetry later
503management_busyThe API is under heavy loadWait retryAfter seconds

Validation errors (422)​

errorMeaningWhat to do
validation_failedOne or more fields are invalid. fields lists each problemFix the listed fields
field_read_onlyThe body contains a field you cannot change (for example id or state)Remove it, or send the saved value
field_not_applicableThe field does not exist for this broker (for example a NinjaTrader-only monitor field on a Tradovate monitor)Remove it
immutable_fieldThe field can only be set when the resource is created (a monitor's account, an account group's destination)Delete and re-create instead
use_kill_switch_endpointkillSwitch was sent to PATCH /controls with a value different from the saved oneUse PUT /controls/kill-switch
invalid_replacementA copier symbol replacement is not allowedSee the copier field reference
invalid_atm_configThe ATM template configuration is not valid. detail names the problem and fields lists the config.* fields involvedFix the named fields

On a create, field_read_only and field_not_applicable refuse the field whatever its value. On a PATCH, field_read_only, immutable_field, use_kill_switch_endpoint and field_not_applicable mean the value you sent differs from what is saved: a matching value is ignored, so you can send back a resource you just read.

Common code values in fields for validation_failed:

codeMeaning
required_when_days_setThe master trading window has days but no start or end
required_when_enabledThe setting is turned on but the value it needs is missing or zero (for example a trailing drawdown with amount: 0, which would stop the account on the first tick)
empty_windowA trading window starts and ends at the same time, which would allow trading for one minute a day
outside_windowclosingOnlyAfter is not strictly inside the master trading window (which runs past midnight when end is earlier than start)
windows_overlapTwo enabled monitor trading windows cover the same time
ratio_not_a_stepA copier ratio is not one of the values the web app offers (0.25 to 1.75 in steps of 0.25, then 2 to 10)
unknown_connectionA connection name is not one of your NinjaTrader connections
string_pattern_mismatchThe value does not match the format, for example a time that is not on a 5-minute mark

Conflicts and state errors​

StatuserrorMeaningWhat to do
409already_existsA monitor already exists for this accountUpdate it instead
409concurrent_modificationAnother change to the same kind of resource is in progressRetry after about a second
409addon_disconnectedThe change needs your NinjaTrader add-on connected (for example to check that an account is yours)Connect the add-on and retry
409addon_version_unsupportedThe change needs a newer add-onUpdate the add-on
404account_not_foundThe account is not on your connection. On connection settings, fields lists where the unknown ones areCheck the account name
409account_identity_unresolvedThe Tradovate account could not be matched to your linked loginCheck the name, or re-link Tradovate
409tradovate_not_linkedYour Tradovate login is not linkedLink Tradovate in the web app
409monitor_lockedMonitor Lock is on and the account reached a limit todayWait for the 5:00 to 6:00 PM ET window, or turn Monitor Lock off
409monitor_stopped_use_restartThe monitor is stopped and active: true cannot resume itUse the restart endpoint
409monitor_not_stoppedRestart was called on a monitor that is not stoppedNothing to do
409would_retripRestarting now would stop the monitor again right awayAdjust the limit first
409tandem_dependencyThe account is a follower in a Tandem copierTurn off Tandem or remove that copier first
409tandem_requires_monitorTandem needs a monitor on every follower accountCreate the monitors first
409copier_cycleThe copier would create a copy loop. Inactive copiers countChange the leader or followers
409duplicate_copierA copier from this leader to this follower already covers these instruments, even if that copier is inactiveEdit the existing copier
409duplicate_followerA follower appears more than onceRemove the duplicate
409follower_conflictThe follower is already used by another copier in a conflicting wayChange the follower
409autosync_conflictTwo Auto-Sync copiers would manage the same follower and instrumentTurn off Auto-Sync on one, or split the instruments
409group_name_conflictThe name is already used by another group or by an accountChoose another name
409group_limit_reachedYou have the maximum number of account groupsDelete a group first
409template_name_conflictAn ATM template with this name existsChoose another name
409limit_reachedYou reached the maximum allowed for this resourceRemove or pause one first
409field_lockedThis setting is managed by another feature on this accountChange it where that feature is configured
409switches_lockedblockSignals or closingOnly was changed on a monitor whose switches are locked (switchesLocked: true)Send switchesLocked: false in the same request, or unlock first
412precondition_failedIf-Match did not strongly match: the resource changed, or you supplied a weak tagRead it again and use the current strong ETag in meta.etag

When the outcome is uncertain​

StatuserrorMeaningWhat to do
503storage_unavailableThe change could not be saved and nothing was appliedRetry shortly
503outcome_unknownThe change may or may not have been appliedRead the resource before retrying