{"record":{"id":"89d43be0f726976a","repo":"nautechsystems/nautilus_trader","slug":"binance-spot-user-data-stream-is-not-active","errorCode":null,"errorMessage":"Binance Spot user data stream is not active","messagePattern":"Binance Spot user data stream is not active","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/binance/src/spot/execution.rs","lineNumber":290,"sourceCode":"            self.ws_trading_handle\n                .as_ref()\n                .is_some_and(|handle| !handle.is_finished())\n        };\n        let user_data_active = if self.config.us {\n            self.ws_user_data_client\n                .as_ref()\n                .is_some_and(BinanceSpotWsTradingClient::is_user_data_active)\n        } else {\n            self.ws_trading_client\n                .as_ref()\n                .is_some_and(BinanceSpotWsTradingClient::is_user_data_active)\n        };\n\n        user_data_active && dispatch_running\n    }\n\n    fn ensure_ws_user_data_active(&self) -> anyhow::Result<()> {\n        anyhow::ensure!(\n            self.ws_user_data_active(),\n            \"Binance Spot user data stream is not active\",\n        );\n        Ok(())\n    }\n\n    fn ws_order_transport_active(&self) -> bool {\n        self.config.use_ws_trading && self.ws_trading_client.is_some() && self.ws_user_data_active()\n    }\n\n    fn submit_order_internal(&self, cmd: &SubmitOrder) -> anyhow::Result<()> {\n        let order = self.core.cache().try_order_owned(&cmd.client_order_id)?;\n\n        let event_emitter = self.emitter.clone();\n        let trader_id = self.core.trader_id;\n        let account_id = self.core.account_id;\n        let client_order_id = order.client_order_id();\n        let strategy_id = order.strategy_id();","sourceCodeStart":272,"sourceCodeEnd":308,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/a4b06ed870971b5671d12754ea138a3ab99b1dec/crates/adapters/binance/src/spot/execution.rs#L272-L308","documentation":"The execution client refuses to accept orders unless its private user data stream is live: for binance.us routing the ws_user_data_client/handle must be active, otherwise the WS trading session's user data must be marked active and its dispatch task still running (spot/execution.rs:266-295). Without the user data stream the client would never observe fills, so submit_order and submit_order_list fail fast via ensure_ws_user_data_active.","triggerScenarios":"Calling submit_order/submit_order_list before the WS session's logon + userDataStream.subscribe completes; after the stream drops (listen-key expiry, disconnect) and before reconnect finishes; missing Binance US credentials for the user data stream.","commonSituations":"A strategy submitting orders in on_start before the venue finishes connecting; trading right after a network blip that killed the user data stream; API keys without the required permissions so the stream never comes up.","solutions":["Delay order submission until the venue is fully connected and the first AccountState has been received","Check stream health and wait/retry after reconnects before resubmitting","Verify API key permissions and (for US routing) that user data credentials are configured"],"exampleFix":"# before: order goes out before the user data stream is live\ndef on_start(self) -> None:\n    self.submit_order(self.order_factory.market(...))\n\n# after: gate on first account state (stream active)\ndef on_start(self) -> None:\n    self._venue_ready = False\n    self.request_account_state()\n\ndef on_account_state(self, event) -> None:\n    if not self._venue_ready:\n        self._venue_ready = True\n        self.submit_order(self.order_factory.market(...))","handlingStrategy":"retry","validationCode":"# gate first submission on the first account state (user data stream live)\ndef on_start(self) -> None:\n    self._venue_ready = False\n    self.request_account_state()\n\ndef on_account_state(self, event) -> None:\n    self._venue_ready = True\n\ndef _submit_when_ready(self, order):\n    if not self._venue_ready:\n        self.clock.set_timer(...)  # retry shortly\n        return\n    self.submit_order(order)","typeGuard":null,"tryCatchPattern":"match client.submit_order(cmd) {\n    Err(e) if e.to_string().contains(\"user data stream is not active\") => {\n        // stream not up yet or reconnecting: back off and retry\n        retry_after_backoff(cmd);\n    }\n    other => other?,\n}","preventionTips":["Never submit in on_start; wait for the first AccountState or venue-connected signal","After any disconnect, quiesce order flow until the stream reports active again","Verify API key permissions (and US-routing credentials) before going live"],"tags":["binance","spot","user-data-stream","websocket","execution","lifecycle"],"backgroundTag":"user-data-stream-inactive","analyzedSha":"a4b06ed870971b5671d12754ea138a3ab99b1dec","analyzedAt":"2026-08-16T22:54:50.089Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}