Order Responses
Each order passes through several validation layers before potentially becoming an active order in the market. Each layer serves a specific purpose and helps maintain the integrity and safety of the trading system. A 400 response indicates non-normal operations, suggesting that an operator should be alerted to the error and/or a client system fix should be considered.
Validation Layers
Stateless Validation
The first layer of defense occurs at the API gateway level. This validation checks basic order properties without requiring any market context or state:
- Input format and data types
- Required field presence
- Character limits and encoding
- Basic business rule violations
- Authentication status
Failures at this layer return immediate 400 (Invalid Request) or 401 (Unauthorized) responses without creating any orders.
Stateful Validation
Once an order passes basic validation, it enters the engine where it undergoes checks that require current market state:
- Instrument existence and status
- Account status and permissions
- Price and quantity limits
- Duplicate order checks
- Instrument-specific rules
These checks create a command but reject invalid orders before creating an order.
Market Validation
Orders that pass stateful validation undergo final market-level checks:
- Margin requirements
- Risk limits
- Fill-or-kill conditions
- Post-only conditions
- Market liquidity conditions
These checks create both commands and orders, but may result in immediate cancellation if market conditions aren't met.
Activation Layer
Some order types remain in an inactive state until specific conditions are met:
- Stop orders (waiting for price trigger)
- Contingent orders (OneTriggersTheOther, OneCancelsTheOther)
These orders undergo additional market validation when their activation conditions are met before becoming active in the order book.
Understanding API Responses
The validation layer that processes an order determines the type of response:
- Stateless validation failures return immediately with no order creation
- Stateful validation failures create a command but no order
- Market validation failures create both commands and orders, with a cancellation
- Activation layer adds additional states for orders waiting to be triggered
flowchart TD
A["Order Submitted"] --> B{"Stateless\nValidation"}
B -- Fail --> C["400/401 Response"]
B -- Pass --> D{"Stateful\nValidation"}
D -- Fail --> E["400 Response\nCommand Created"]
D -- Pass --> F{"Order Type"}
F -- Regular Order --> G{"Margin and Risk\nValidation"}
F -- Stop/Trigger Order --> H["Inactive State"]
H --> Q["200 Response"] & I{"Trigger\nCondition Met"}
L["Active Order"] --> S["200 Response"] & M{"Execution"}
I -- Yes --> G
I -- No --> J["Wait for Trigger"]
J --> I
G -- Fail Margin & Risk --> K["Order Cancelled"]
G -- Fail Market --> U["Order Cancelled"]
K --> T["400 Response"]
U --> V["200 Response"]
G -- Pass --> L
M -- Full Fill --> N["Order Complete"]
M -- Partial Fill --> O["Remaining Open or Cancelled"]
M -- No Fill --> P["Order Open or Cancelled"]
B:::validation
C:::response
D:::validation
E:::response
G:::validation
H:::state
Q:::response
L:::state
S:::response
K:::state
U:::state
T:::response
V:::response
N:::state
O:::state
P:::state
classDef validation fill:#f9f,stroke:#333,stroke-width:2px
classDef response fill:#bbf,stroke:#333,stroke-width:2px
classDef state fill:#bfb,stroke:#333,stroke-width:2px