{"record":{"id":"8c977094c8af8e02","repo":"nautechsystems/nautilus_trader","slug":"unsupported-aggregation","errorCode":null,"errorMessage":"Unsupported aggregation: {:?}","messagePattern":"Unsupported aggregation: (.+?)","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/dydx/src/http/client.rs","lineNumber":1109,"sourceCode":"\n        let instrument = self\n            .get_instrument(&instrument_id)\n            .ok_or_else(|| InstrumentLookupError::not_found(instrument_id))?;\n\n        let ticker = extract_raw_symbol(instrument_id.symbol.as_str());\n        let price_precision = instrument.price_precision();\n        let size_precision = instrument.size_precision();\n        let ts_init = self.generate_ts_init();\n\n        let mut all_bars: Vec<Bar> = Vec::new();\n\n        // Determine bar duration in seconds for pagination chunking\n        let spec = bar_type.spec();\n        let bar_secs: i64 = match spec.aggregation {\n            BarAggregation::Minute => spec.step.get() as i64 * 60,\n            BarAggregation::Hour => spec.step.get() as i64 * 3_600,\n            BarAggregation::Day => spec.step.get() as i64 * 86_400,\n            _ => anyhow::bail!(\"Unsupported aggregation: {:?}\", spec.aggregation),\n        };\n\n        match (start, end) {\n            // Time-chunked pagination for date ranges\n            (Some(range_start), Some(range_end)) if range_end > range_start => {\n                let overall_limit = limit.unwrap_or(u32::MAX);\n                let mut remaining = overall_limit;\n                let bars_per_call = DYDX_MAX_BARS_PER_REQUEST.min(remaining);\n                let chunk_duration =\n                    jiff::SignedDuration::from_secs(bar_secs * bars_per_call as i64);\n                let mut chunk_start = range_start;\n\n                while chunk_start < range_end && remaining > 0 {\n                    let chunk_end = (chunk_start + chunk_duration).min(range_end);\n                    let per_call_limit = remaining.min(DYDX_MAX_BARS_PER_REQUEST);\n\n                    let response = self\n                        .inner","sourceCodeStart":1091,"sourceCodeEnd":1127,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/dydx/src/http/client.rs#L1091-L1127","documentation":"When paginating candle requests, `request_bars` converts bar durations to seconds, but only Minute, Hour, and Day aggregations are mapped. Any other aggregation (e.g. Second, Week, Month, Tick) fails with this error.","triggerScenarios":"Calling `request_bars` with a `BarAggregation::Second` (e.g. 15-SECOND bars), `Tick`, `Week`, or `Month` bar type.","commonSituations":"Sub-minute bar requests against dYdX, which the Indexer candle endpoint does not offer; sharing bar-spec config across adapters where another venue supports seconds/ticks.","solutions":["Use Minute, Hour, or Day aggregation for dYdX bar requests","Source sub-minute bars from another data provider or aggregate externally from trades","Add Second support only if the upstream dYdX Indexer starts offering sub-minute candles"],"exampleFix":"// before\nlet spec = BarSpecification::new(15, BarAggregation::Second, PriceType::Last);\n// after\nlet spec = BarSpecification::new(1, BarAggregation::Minute, PriceType::Last);","handlingStrategy":"validation","validationCode":"matches!(bar_type.spec().aggregation, BarAggregation::Minute | BarAggregation::Hour | BarAggregation::Day);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Restrict dYdX bar configs to Minute/Hour/Day aggregations","Route sub-minute or tick bars to a different data source"],"tags":["rust","dydx","bars","aggregation"],"backgroundTag":"unsupported-enum-value","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}