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

  1. Pass exactly one of client_order_id or venue_order_id
  2. Log/inspect the inner builder error message appended to this error for the specific missing field
  3. 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

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


AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08). Data as JSON: /api/errors/957b5f7ee2fdd0db. Report an issue: GitHub.