{"record":{"id":"e5fe27974e5852b5","repo":"nautechsystems/nautilus_trader","slug":"unsupported-kraken-ohlc-interval-interval","errorCode":null,"errorMessage":"Unsupported Kraken OHLC interval: {interval}","messagePattern":"Unsupported Kraken OHLC interval: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/kraken/src/websocket/spot_v2/parse.rs","lineNumber":334,"sourceCode":"    let close_time = ohlc.interval_begin + jiff::SignedDuration::from_secs(interval_secs);\n    let ts_event = UnixNanos::from(u64::try_from(close_time.as_nanosecond()).unwrap_or(0));\n\n    Bar::new_checked(bar_type, open, high, low, close, volume, ts_event, ts_init)\n}\n\n/// Converts a Kraken OHLC interval (minutes) to a Nautilus bar specification.\nfn interval_to_bar_spec(interval: u32) -> anyhow::Result<BarSpecification> {\n    let (step, aggregation) = match interval {\n        1 => (1, BarAggregation::Minute),\n        5 => (5, BarAggregation::Minute),\n        15 => (15, BarAggregation::Minute),\n        30 => (30, BarAggregation::Minute),\n        60 => (1, BarAggregation::Hour),\n        240 => (4, BarAggregation::Hour),\n        1440 => (1, BarAggregation::Day),\n        10080 => (1, BarAggregation::Week),\n        21600 => (15, BarAggregation::Day), // 21600 min = 360 hours = 15 days\n        _ => anyhow::bail!(\"Unsupported Kraken OHLC interval: {interval}\"),\n    };\n\n    Ok(BarSpecification::new(step, aggregation, PriceType::Last))\n}\n\n/// Parses Kraken execution type and order status to Nautilus order status.\nfn parse_order_status(\n    exec_type: KrakenExecType,\n    order_status: Option<KrakenWsOrderStatus>,\n) -> OrderStatus {\n    match exec_type {\n        KrakenExecType::Canceled => return OrderStatus::Canceled,\n        KrakenExecType::Expired => return OrderStatus::Expired,\n        KrakenExecType::Filled => return OrderStatus::Filled,\n        KrakenExecType::Trade => {\n            return match order_status {\n                Some(KrakenWsOrderStatus::Filled) => OrderStatus::Filled,\n                Some(KrakenWsOrderStatus::PartiallyFilled) | None => OrderStatus::PartiallyFilled,","sourceCodeStart":316,"sourceCodeEnd":352,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/kraken/src/websocket/spot_v2/parse.rs#L316-L352","documentation":"Kraken's OHLC WebSocket channel emits candles at fixed minute intervals (1, 5, 15, 30, 60, 240, 1440, 10080, 21600 minutes). interval_to_bar_spec maps each supported interval to a Nautilus BarSpecification; any interval outside this table cannot be expressed and the parser fails.","triggerScenarios":"Subscribing to or parsing an OHLC WS message with interval value not in {1,5,15,30,60,240,1440,10080,21600} — raised inside interval_to_bar_spec, reached via parse_ws_bar when Kraken sends or the user requests an unmapped interval.","commonSituations":"Configuring a bar subscription with an interval Kraken doesn't publish (e.g. 2-minute or 12-hour bars); Kraken adding a new interval that an older adapter version doesn't map; passing seconds instead of minutes as the interval value.","solutions":["Use only Kraken-supported intervals: 1, 5, 15, 30 min; 1 h (60); 4 h (240); 1 day (1440); 1 week (10080); 15 days (21600).","Derive unsupported intervals client-side by aggregating from a supported finer interval (e.g. build 2-min bars from 1-min).","Upgrade the adapter if Kraken introduced a new interval you need.","Double-check the unit: interval is in minutes, not seconds."],"exampleFix":"// before\ninterval = 720  // 12h, unsupported\n// after\ninterval = 240  // 4h, supported (or aggregate 720-min bars locally from finer data)","handlingStrategy":"validation","validationCode":"const SUPPORTED_INTERVALS: &[u64] = &[1, 5, 15, 30, 60, 240, 1440, 10080, 21600];\nif !SUPPORTED_INTERVALS.contains(&interval) {\n    return Err(format!(\"interval {interval} not supported by Kraken OHLC\"));\n}","typeGuard":null,"tryCatchPattern":"match parse_ws_bar(msg) {\n    Err(e) if e.to_string().contains(\"Unsupported Kraken OHLC interval\") => {\n        // skip the message or resubscribe with a supported interval\n    }\n    r => r?,\n}","preventionTips":["Subscribe only to Kraken-published intervals (1/5/15/30 min, 1 h, 4 h, 1 day, 1 week, 15 days).","Aggregate exotic intervals locally from a supported base interval.","Remember the interval unit is minutes.","Update the mapping table when Kraken adds intervals."],"tags":["kraken","websocket","ohlc","bars","parsing"],"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-14T00:17:10.932Z"}