{"record":{"id":"2310af0179c4c4dc","repo":"nautechsystems/nautilus_trader","slug":"invalid-trade-id-format","errorCode":null,"errorMessage":"Invalid trade_id format","messagePattern":"Invalid trade_id format","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/kraken/src/common/parse.rs","lineNumber":543,"sourceCode":"    let ts_event = parse_millis_timestamp(time, \"trade.time\")?;\n\n    let side_str = trade_array\n        .get(3)\n        .and_then(|v| v.as_str())\n        .context(\"Missing or invalid side\")?;\n    let aggressor = match side_str {\n        \"b\" => AggressorSide::Buy,\n        \"s\" => AggressorSide::Sell,\n        _ => AggressorSide::NoAggressor,\n    };\n\n    let trade_id_value = trade_array.get(6).context(\"Missing trade_id\")?;\n    let trade_id = if let Some(id) = trade_id_value.as_i64() {\n        TradeId::new_checked(id.to_string())?\n    } else if let Some(id_str) = trade_id_value.as_str() {\n        TradeId::new_checked(id_str)?\n    } else {\n        anyhow::bail!(\"Invalid trade_id format\");\n    };\n\n    TradeTick::new_checked(\n        instrument.id(),\n        price,\n        size,\n        aggressor,\n        trade_id,\n        ts_event,\n        ts_init,\n    )\n    .context(\"Failed to construct TradeTick from Kraken trade\")\n}\n\n/// Parses a Kraken Futures public execution into a Nautilus trade tick.\n///\n/// # Errors\n///","sourceCodeStart":525,"sourceCodeEnd":561,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/kraken/src/common/parse.rs#L525-L561","documentation":"Kraken Spot trade responses put the trade id at array index 6, expected either as an integer or a string. If the JSON value there is neither (e.g. null, object, number that is not an i64), parse_trade_tick_from_array bails with 'Invalid trade_id format' because a TradeId cannot be constructed.","triggerScenarios":"request_trades calls parse_trade_tick_from_array on a Kraken /Trades response where element 6 of a trade array is neither an i64-representable number nor a string (unexpected API payload shape).","commonSituations":"Kraken changing or extending the Trades payload; some trades returning non-standard identifiers; test fixtures with malformed arrays; hitting a different endpoint version.","solutions":["Log the raw trade array and check element 6's actual JSON type to see what Kraken returned.","Update the adapter to the latest version in case Kraken changed the Trades schema.","If Kraken legitimately emits a new format, convert it to a string before TradeId::new_checked (or patch parse to handle the type)."],"exampleFix":"// before\n} else {\n    anyhow::bail!(\"Invalid trade_id format\");\n};\n// after (if Kraken sends floats)\n} else if let Some(f) = trade_id_value.as_f64() {\n    TradeId::new_checked(format!(\"{f:.0}\"))?\n} else {\n    anyhow::bail!(\"Invalid trade_id format\");\n};","handlingStrategy":"type-guard","validationCode":"// Validate the raw Kraken trade array before parsing\nfn has_valid_trade_id(arr: &serde_json::Value) -> bool {\n    arr.get(6).map(|v| v.is_i64() || v.is_string()).unwrap_or(false)\n}","typeGuard":"fn trade_id_is_parseable(v: &serde_json::Value) -> bool {\n    v.is_i64() || v.is_string()\n}","tryCatchPattern":"match parse_trade_tick_from_array(&arr, instrument, ts_init) {\n    Ok(tick) => emit(tick),\n    Err(e) if e.to_string().contains(\"trade_id\") => {\n        log::warn!(\"skipping malformed trade: {arr:?}\");\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Log raw payloads when the Kraken adapter version changes.","Keep the adapter updated after Kraken API schema changes.","Add fixture tests using live Kraken Trades responses."],"tags":["kraken","trade-id","response-parsing","unexpected-payload"],"backgroundTag":"unexpected-api-response-shape","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}