Fetch historical intraday candles

Same endpoint as chapter 27, different interval.

from datetime import datetime

candles = kite.historical_data(
    instrument_token=408065,
    from_date=datetime(2024, 9, 1, 9, 15),
    to_date=datetime(2024, 9, 1, 15, 30),
    interval="5minute",
)

Supported intervals: minute, 3minute, 5minute, 10minute, 15minute, 30minute, 60minute, day.

continuous flag for F&O — stitching contracts across expiries

candles = kite.historical_data(
    instrument_token=fut_token,
    from_date=datetime(2024, 1, 1),
    to_date=datetime(2024, 12, 31),
    interval="day",
    continuous=True,   # stitches consecutive expiry contracts into one series
)

Without continuous=True, a single instrument_token only has data for the period that specific contract existed (chapter 23 — F&O tokens change every expiry) — you'd get gaps whenever a contract expired.

Intraday data has a shorter lookback window

Unlike daily candles (years of history), Zerodha limits intraday interval lookback (roughly: minute ≈ 60 days, day ≈ years — exact limits vary and change over time, check current docs). For anything requiring long intraday history, you must fetch and store incrementally over time (chapter 30) — you cannot retroactively pull 2 years of 1-minute candles in one call.

def fetch_intraday_chunked(kite, token, interval, start, end, chunk_days=59):
    """Splits a long intraday request into API-limit-respecting chunks."""
    import pandas as pd
    all_candles = []
    cursor = start
    while cursor < end:
        chunk_end = min(cursor + pd.Timedelta(days=chunk_days), end)
        all_candles += kite.historical_data(token, cursor, chunk_end, interval)
        cursor = chunk_end
    return all_candles

Next: 029 — Historical data limits and pagination