{"record":{"id":"4190b194d7d3c3a1","repo":"nautechsystems/nautilus_trader","slug":"binance-futures-does-not-support-second-level-klin","errorCode":null,"errorMessage":"Binance Futures does not support second-level kline intervals","messagePattern":"Binance Futures does not support second-level kline intervals","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/binance/src/futures/data.rs","lineNumber":2028,"sourceCode":"        // Binance Futures uses aggTrade for aggregate trades\n        let stream = format!(\"{}@aggTrade\", format_binance_stream_symbol(&instrument_id));\n\n        self.spawn_ws(\n            async move {\n                ws.subscribe(vec![stream])\n                    .await\n                    .context(\"trades subscription\")\n            },\n            \"trade subscription\",\n        );\n        Ok(())\n    }\n\n    fn subscribe_bars(&mut self, cmd: SubscribeBars) -> anyhow::Result<()> {\n        let bar_type = cmd.bar_type;\n        let ws = self.ws_client.clone();\n        let interval = bar_spec_to_binance_interval(bar_type.spec())?;\n        anyhow::ensure!(\n            interval != crate::common::enums::BinanceKlineInterval::Second1,\n            \"Binance Futures does not support second-level kline intervals\"\n        );\n\n        let stream = format!(\n            \"{}@kline_{}\",\n            format_binance_stream_symbol(&bar_type.instrument_id()),\n            interval.as_str()\n        );\n\n        self.spawn_ws(\n            async move {\n                ws.subscribe(vec![stream])\n                    .await\n                    .context(\"bars subscription\")\n            },\n            \"bar subscription\",\n        );","sourceCodeStart":2010,"sourceCodeEnd":2046,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/a4b06ed870971b5671d12754ea138a3ab99b1dec/crates/adapters/binance/src/futures/data.rs#L2010-L2046","documentation":"Binance futures kline streams and endpoints have no 1-second interval (unlike Binance spot, which added one), so `subscribe_bars` maps the BarSpecification to a `BinanceKlineInterval` and then rejects `Second1`. The check runs before the `@kline_` stream name is formed, so no WebSocket subscription is attempted.","triggerScenarios":"`subscribe_bars` with a bar type whose step is 1 SECOND, e.g. BarType string `BTCUSDT-PERP.BINANCE-1-SECOND-LAST-EXTERNAL` or INTERNAL — the interval mapping yields `BinanceKlineInterval::Second1` and the ensure fails.","commonSituations":"Porting a spot 1-second kline config to futures; low-latency strategies that used 1s bars on another venue; backfilling 1-second bars assuming the futures kline endpoint supports them.","solutions":["Use a bar step of 1 minute or larger (1-MINUTE, 5-MINUTE, 1-HOUR, ...) for Binance Futures","If 1-second bars are required, subscribe to the trade stream and aggregate 1s bars locally (INTERNAL aggregation from trades)"],"exampleFix":"# before\nbar_type = BarType.from_str('BTCUSDT-PERP.BINANCE-1-SECOND-LAST-EXTERNAL')\nactor.subscribe_bars(bar_type)\n\n# after\nbar_type = BarType.from_str('BTCUSDT-PERP.BINANCE-1-MINUTE-LAST-EXTERNAL')\nactor.subscribe_bars(bar_type)","handlingStrategy":"validation","validationCode":"from nautilus_trader.model.data import BarSpecification, BarAggregation\n\ndef is_second_aggregated(bar_spec) -> bool:\n    return bar_spec.aggregation == BarAggregation.SECOND and bar_spec.step == 1\n\nif is_second_aggregated(bar_type.spec):\n    raise ValueError('Binance Futures has no 1-second klines; use >= 1-minute steps or aggregate trades locally')\nactor.subscribe_bars(bar_type)","typeGuard":"def is_supported_futures_kline_step(bar_spec) -> bool:\n    return not (bar_spec.aggregation == BarAggregation.SECOND and bar_spec.step == 1)","tryCatchPattern":"try:\n    actor.subscribe_bars(bar_type)\nexcept Exception as e:\n    if 'second-level kline intervals' in str(e):\n        raise ValueError('Binance Futures klines start at 1 minute; subscribe trades and aggregate 1s bars client-side') from e\n    raise","preventionTips":["Spot's 1s klines do not exist on futures — never copy spot bar configs to futures unreviewed","For sub-minute bars, subscribe to the trade stream and build INTERNAL bars from fills"],"tags":["binance","futures","bars","kline-interval","subscription-validation"],"backgroundTag":"unsupported-bar-interval","analyzedSha":"a4b06ed870971b5671d12754ea138a3ab99b1dec","analyzedAt":"2026-08-16T22:54:50.089Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}