Skip to main content

HTTP error reference


Risk violations (422)

When an order trips a risk rule, POST /v1/order returns HTTP 200 with a non-empty violations array - the order is not placed.
Always check violations in every order response, even when the HTTP status is 200.
Common rule triggers:
  • Drawdown gate - equity has fallen below the plan’s maximum drawdown threshold.
  • Daily loss limit - realized + unrealized loss for the day would exceed the daily limit.
  • News-event freeze - trading is locked around a scheduled high-impact event.
  • Exposure cap - order would exceed the per-symbol or total exposure limit.

Idempotency

Set a stable client_id on every order intent:
Retrying with the same client_id is always safe - the engine returns the original result rather than placing a duplicate. This means you can retry on network timeouts and 500 errors without risk.
A 409 Conflict means the client_id was already used for a different order body. Use a new client_id for a genuinely new order intent.

Rate limits

The per-key limit is 1,200 requests per minute. When exceeded, the engine returns 429. Implement exponential backoff - start at 1 second and double up to a maximum of 30 seconds.

Operational notes

Timestamps - All timestamps are ISO 8601 UTC. The server clock is NTP-synced. Numeric precision - Quantities and prices use f64 JSON numbers. For sub-cent precision, use string-encoded decimals where supported (most account-balance fields accept this). Pagination - List endpoints accept limit (capped per endpoint) plus from / to ISO 8601 timestamps. Cursor pagination is not yet exposed. Retries - On 500, retry with the same client_id. On 429, back off before retrying. Do not retry 400, 401, 403, or 404 - they indicate a problem with the request itself.