Skip to main content

Error Codes

API error responses and their meanings.

HTTP Status Codes​

CodeDescription
200Success
201Created (signal executed)
202Accepted (signal scheduled)
400Bad Request (validation error)
401Unauthorized (invalid API key)
403Forbidden (insufficient permissions)
404Not Found
409Conflict (duplicate intent, opposing position, etc.)
429Rate Limited
500Internal Server Error
503Service Unavailable

Error Response Format​

{
"error": "Error message",
"code": "ERROR_CODE",
"details": [
{
"path": ["field"],
"message": "Field-specific error"
}
]
}

Common Error Codes​

CodeHTTPDescription
VALIDATION_ERROR400Request body failed validation
SIGNAL_REJECTED400Signal rejected (duplicate sourceId, etc.)
NOT_FOUND404Not found, or no access. POST /api/v1/signals returns it when the account or strategy is missing, deleted, or not yours. POST /api/v1/orders returns it with "Account not found or access denied" when the account or its broker is deleted, and with "Strategy not found" when the strategy is deleted. A missing or not-owned account on POST /api/v1/orders returns a bare 404 with no code.
ACCOUNT_INACTIVE400Returned by POST /api/v1/orders when the account is inactive. UTM does not place orders on it. Applies to every order, including a close. Nothing is placed.
STRATEGY_INACTIVE400Returned by POST /api/v1/orders and POST /api/v1/signals when the strategy is inactive. On POST /api/v1/orders it applies to every order on that strategy, including a close. Nothing is placed.
INSUFFICIENT_FUNDS400Account has insufficient buying power
MARKET_CLOSED400Market is closed for this symbol
SERVICE_UNAVAILABLE503A backing service the signal pipeline depends on is disabled or unreachable, for example the scheduler queue for a scheduled signal.
DUPLICATE_INTENT409A same-direction live signal already exists for this (accountId, strategyId, symbol, action). Response details.conflictingSignalId carries the id.
OPPOSING_POSITION_OPEN409The request would open the opposing side of an existing non-terminal trade for the same (account, symbol) on a netting broker (Alpaca, TradeStation). Response details.conflictingTradeId carries the existing trade id. Same-side stacking is allowed; opposite-side is not, because netting brokers cannot represent both sides at once. Close the conflicting trade to flat first, or route the strategy to a different account.
SIGNAL_ALREADY_TRANSMITTED409Returned by DELETE /api/v1/signals/:id when the signal has already been sent to the broker, so it can no longer be cancelled. Response details.orderIds lists every order linked to the signal, and may be empty. Manage the order in the UTM app. The batch cancel returns the same code and orderIds on that signal's item in results.
SIGNAL_PROCESSING409Returned by DELETE /api/v1/signals/:id when the signal is being sent to the broker right now. It carries no order ids. Check the signal again shortly, then manage its order in the UTM app. A retried cancel is refused again. The batch cancel returns the same code on that signal's item in results.
RECONCILIATION_SYNTHETIC_CONFLICT409Returned by POST /api/v1/reconciliation/link, /unlink, /link-order, /unlink-order, and the POST /api/v1/reconciliation/repair/{tradeId}/* endpoints when the target trade still holds a synthetic (estimate) execution covering the same shares as the fill(s) or order being applied. Recalculating with both present would double-count the position and push it above the broker's reported quantity. Nothing is written. Response details carries accountId, symbol, side, brokerQuantity, utmOpenSum, exceedsBy, and conflictingTradeIds (sorted by openQuantity descending). Remove the synthetic execution first, then retry.
RECONCILIATION_OVER_EXPOSURE409Returned by the same endpoints as RECONCILIATION_SYNTHETIC_CONFLICT when applying the recalculated trade aggregates would push UTM's open quantity for the trade's (account, symbol, side) above the broker's gross open quantity on that side, and no synthetic execution explains it. The write is refused; no partial state is committed. Response details carries the same fields as above.