#
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