{"record":{"id":"4a4cb0a534d23f15","repo":"nautechsystems/nautilus_trader","slug":"invalid-external-order-claims-instrument-id-cla","errorCode":null,"errorMessage":"Invalid `external_order_claims` instrument ID {claim}: {e}","messagePattern":"Invalid `external_order_claims` instrument ID (.+?): (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/live/src/python/node.rs","lineNumber":1849,"sourceCode":"        return Ok(None);\n    };\n\n    if claims.is_none() {\n        return Ok(None);\n    }\n\n    if let Ok(claims) = claims.extract::<Vec<InstrumentId>>() {\n        return Ok(Some(claims));\n    }\n\n    let claim_strings = claims\n        .extract::<Vec<String>>()\n        .map_err(|e| anyhow::anyhow!(\"Invalid `external_order_claims` type: {e}\"))?;\n    let claims = claim_strings\n        .into_iter()\n        .map(|claim| {\n            InstrumentId::from_str(&claim).map_err(|e| {\n                anyhow::anyhow!(\"Invalid `external_order_claims` instrument ID {claim}: {e}\")\n            })\n        })\n        .collect::<anyhow::Result<Vec<_>>>()?;\n\n    Ok(Some(claims))\n}\n\n#[cfg(feature = \"examples\")]\ntype BuiltinActorRegister = for<'py> fn(&mut LiveNode, &Bound<'py, PyAny>) -> PyResult<()>;\n\n#[cfg(feature = \"examples\")]\ntype BuiltinStrategyRegister = for<'py> fn(&mut LiveNode, &Bound<'py, PyAny>) -> PyResult<()>;\n\n#[cfg(feature = \"examples\")]\nfn builtin_actor_register(type_name: &str) -> Option<BuiltinActorRegister> {\n    match type_name {\n        \"BookImbalanceActor\" => Some(register_book_imbalance_actor),\n        \"DataTester\" => Some(register_data_tester),","sourceCodeStart":1831,"sourceCodeEnd":1867,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/d1527c24afdf475115785557f89a55c3e336c51f/crates/live/src/python/node.rs#L1831-L1867","documentation":"An element of external_order_claims was a string but could not be parsed as an InstrumentId (expected 'SYMBOL.VENUE' format).","triggerScenarios":"Passing strings like \"btcusdt\" without the venue qualifier, wrong separator, whitespace, or an unregistered venue string.","commonSituations":"Copy-pasting a raw ticker symbol instead of the fully qualified Nautilus instrument ID.","solutions":["Use the fully qualified format SYMBOL.VENUE, e.g. \"BTCUSDT.BINANCE\"","Check for stray whitespace/typos in the venue part","Confirm the instrument ID matches what the adapter publishes (same casing/format)"],"exampleFix":"# before\nexternal_order_claims = [\"BTCUSDT-PERP\"]\n\n# after\nexternal_order_claims = [\"BTCUSDT-PERP.BINANCE\"]","handlingStrategy":"validation","validationCode":"# Python\nfrom nautilus_trader.model.identifiers import InstrumentId\nInstrumentId.from_str(claim)  # raises early with clear error if malformed","typeGuard":"# Python\ndef is_valid_instrument_id(s: str) -> bool:\n    try:\n        InstrumentId.from_str(s)\n        return True\n    except Exception:\n        return False","tryCatchPattern":"try:\n    node = build_node(config)\nexcept Exception as e:\n    if \"instrument ID\" in str(e):\n        # fix claim strings to SYMBOL.VENUE and retry","preventionTips":["Always use SYMBOL.VENUE format","Copy IDs from the instrument definitions the adapter provides","Validate all instrument IDs in config before starting the node"],"tags":["python","config","instrument-id","parsing"],"backgroundTag":"instrument-id-parse-failed","analyzedSha":"d1527c24afdf475115785557f89a55c3e336c51f","analyzedAt":"2026-08-27T04:01:12.327Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}