nautechsystems/nautilus_trader · error · anyhow::Error
Failed to build order detail params: {e}
Error message
Failed to build order detail params: {e} What it means
The order detail request builds its OKX params with a typed builder (GetOrderDetailParamsBuilder / GetOrderHistoryParamsBuilder); if the builder's required fields are missing or invalid, build() returns an error which is wrapped as 'Failed to build order detail params: {e}'.
Source
Thrown at crates/adapters/okx/src/http/client.rs:4382
let instrument = self.instrument_from_cache(instrument_id.symbol.inner())?;
let mut params_builder = GetOrderParamsBuilder::default();
params_builder.inst_id(instrument_id.symbol.inner().to_string());
match (client_order_id, venue_order_id) {
(Some(client_order_id), None) => {
params_builder.cl_ord_id(client_order_id.as_str().to_string());
}
(None, Some(venue_order_id)) => {
params_builder.ord_id(venue_order_id.as_str().to_string());
}
_ => anyhow::bail!(
"Exactly one of client_order_id or venue_order_id is required for an order detail request"
),
}
let params = params_builder
.build()
.map_err(|e| anyhow::anyhow!("Failed to build order detail params: {e}"))?;
let orders = match self.inner.get_order(params).await {
Ok(orders) => orders,
Err(e) if e.is_order_not_found() => return Ok(None),
Err(e) => return Err(e.into()),
};
let order = match orders.as_slice() {
[] => return Ok(None),
[order] => order,
_ => anyhow::bail!(
"Order detail returned {} records for one identifier",
orders.len(),
),
};
if order.inst_id.as_str() != instrument_id.symbol.inner() {
anyhow::bail!(
"Order detail instrument mismatch for {instrument_id}: returned {}",
order.inst_id,View on GitHub (pinned to 18893faf8b)
Solutions
- Pass exactly one of client_order_id or venue_order_id
- Log/inspect the inner builder error message appended to this error for the specific missing field
- Validate the ID is non-empty and correctly formatted before calling
Example fix
// before let params = builder.cl_ord_id(cl_id).ord_id(venue_id).build()?; // after let params = builder.ord_id(venue_id).build()?; // set only one ID
Defensive patterns
Strategy: validation
Validate before calling
let exactly_one = client_order_id.is_some() ^ venue_order_id.is_some();
if !exactly_one { return Err("Set exactly one of client_order_id or venue_order_id".into()); } Try / catch
match client.order_detail(...).await {
Err(e) if e.to_string().starts_with("Failed to build order detail params") => {
// fix builder inputs per the wrapped cause
}
other => other?,
} Prevention
- Enforce XOR of client/venue order ID at the type or call-site level
- Never pass empty ID strings; use Option::None instead
- Surface and read the inner builder error, it names the violated rule
When it happens
Trigger: Calling order detail lookup where exactly one of client_order_id or venue_order_id was set but the builder still fails validation (e.g. both set, neither set, or malformed ID format per builder rules).
Common situations: Passing both client and venue order IDs; passing an empty/blank order ID string; upstream refactor changed builder required fields.
Understand the failure class
Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.
Related errors
- Exactly one of client_order_id or venue_order_id is required
- Order detail instrument mismatch for {instrument_id}: return
- Order detail venue order ID mismatch for {venue_order_id}: r
- Failed to build algo order params: {e}
- {FAILED}: {e}
AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08).
Data as JSON: /api/errors/957b5f7ee2fdd0db.
Report an issue: GitHub.