Trading APIs
Historical data API India: what each archive actually contains
A historical data API in India can provide daily candles, intraday candles or expired derivatives, but those are different datasets. The six broker services checked on 14 October 2026 document different intervals and access conditions. Official NSE and BSE bhavcopies, daily exchange files, provide another starting point. Request limits, retention and permission to reuse data must be checked separately.
Facts checked 14 Oct 2026 against 21 sources. No affiliate links. Not investment advice.
Match the archive to the question before choosing an API
For an end-of-day price study, an exchange bhavcopy or daily-candle endpoint may supply the observations you need. For an intraday options study, you also need the right expired contract, interval and price fields. A long equity archive does not establish expired-option coverage, and an endpoint accepting a date does not prove that data exists for that date.
This comparison covers published documentation at Zerodha, Dhan, Upstox, ICICI Direct, FYERS and Shoonya. It does not rank accuracy or speed: no broker account was used to test downloads. We did download and inspect the two named official exchange files later in the page. Those file checks establish their dates and structure, rather than the completeness of an entire exchange archive.
The dataset specification to write down
Identity
Name the exchange, segment and instrument. For options, retain the expiry, strike and call/put side, rather than just the underlying index name.
Observation
Specify daily, minute or second candles and the required opening, high, low and closing prices (OHLC), volume or open-interest fields. A candle summary is different from a sequence of individual trades.
Time coverage
Record the earliest required date separately from the maximum period allowed in one request. A short request window may still sit inside a long archive.
Entitlement
Check the account, subscription and endpoint permissions. A general free-API headline may have a specific paid endpoint exception.
Six broker historical services, with their documented boundaries
Official documentation and company-owned references opened 14 October 2026. Selected services, not an exhaustive list. Unverified fields remain unverified; no download-quality test was performed.
| Service | Intervals documented | Published lookback | One-request boundary | Access or cost condition |
|---|---|---|---|---|
| Zerodha Kite Connect | 1, 3, 5, 10, 15, 30, 60 minutes; daily | Several years; no universal first date in endpoint docs | Staff table edited May 2020: 1 min 60 days; 3/5/10 min 100; 15/30 min 200; 60 min 400; daily 2,000 | Connect ₹500 per app/month; Personal excludes history. GST treatment unstated; eligible renewal credits separate |
| DhanHQ | 1, 5, 15, 25, 60 minutes; daily | Intraday last 5 years for active instruments; daily back to inception | Intraday 90 days | Data API subscription ₹499 + applicable taxes, renewed every 30 days |
| Upstox historical v3 | Minutes 1–300; hours 1–5; daily, weekly, monthly | Minute/hour from January 2022; daily/week/month from January 2000 | 1–15 min: 1 month; longer minute/hour: 1 quarter; daily: 1 decade; week/month: no stated limit | General API page says free; expired endpoint has a separate Plus gate |
| ICICI Direct Breeze | V2 SDK options note: 1 second; 1, 5, 30 minutes; daily | Product page: 3 years of second-level last traded price (LTP); official Python package: 10 years including 1-second OHLC and volume. Conflict unresolved | V2 SDK note: maximum 1,000 candle intervals per request | API access/history free with an ICICI Direct account; brokerage is separate |
| FYERS history | 5/10/15/30/45 seconds; 1/2/3/5/10/15/20/30/60/120/240 minutes; daily/week/month | Developer reference: minute history from 3 July 2017; seconds last 30 trading days | Minute: 100 days; daily/week/month: 366 days | Support FAQ says history, quotes and market data are free |
| Shoonya | Daily EOD; intraday 1/3/5/10/15/30/60/120/240 minutes | Daily spans described as weeks/months/years; intraday short lookback, without a numerical retention promise | Exact archive/request span not established in these docs | Separate API fee not established by the historical endpoint pages |
Kite intervals/continuous scope: endpoint docs; request spans: dated staff reply; entitlement: pricing FAQ. Dhan: historical docs and subscription FAQ. Upstox: v3 docs plus expired endpoint and general API page. Breeze: product page and official Python-package documentation, including their unresolved depth conflict. FYERS: its verified-domain developer organisation's reference plus support fee FAQ. Shoonya: daily and Time/Price Series docs. Starting dates do not guarantee every instrument existed or has complete observations.
Expired options require an extra identity check
There are two questions to ask an options-data provider: can it identify a contract that has expired, and can it return the observations required for that contract? An option-chain screen showing today's contracts answers neither question about an old backtest.
Dhan's rolling endpoint deserves particular attention. Its strike selection is relative to spot, such as at-the-money (ATM) or a position above or below ATM, and the returned fields include the actual strike. A rolling ATM series can refer to changing strikes across timestamps. Preserve that strike column if your research requires a fixed contract; do not relabel the rolling series as one unchanged option.
Kite's documented continuous facility is for daily expired NFO and MCX futures. That is useful scope information, but it should not be expanded into an expired-options intraday promise. Its instrument master contains live contracts, and the docs discuss caching tokens before expiry. Token storage and historical-data availability remain separate requirements.
Expired derivatives: which documentation answers which question?
Checked 14 October 2026. “Not established” is a limit of the sources opened, rather than a claim that a broker has no capability.
| Service | What is established | Boundary to retain |
|---|---|---|
| Dhan rolling options | Index and stock options, up to 5 years; 1/5/15/25/60 min; up to 30 days per call | Near-expiry index options ATM ±10; other contracts ATM ±3. Relative-strike series; end date non-inclusive |
| Upstox expired instruments | Separate expired-instrument key and historical endpoint; Plus subscription required | Parameter/prose lists 1/3/5/15/30 min and daily; error table instead lists 1/30 min, daily/week/month. Universal depth and Plus price not verified here |
| Kite continuous futures | Daily expired NFO and MCX futures through a live contract token | Does not document an equivalent complete expired-options intraday archive |
| Breeze | Historical options requests have expiry, strike and call/put inputs in official SDK examples | Samples and headline lookback do not establish every expired contract's coverage; 3-year/10-year conflict remains |
| FYERS | Reference includes continuous-futures flag | Complete expired-option coverage not established by the reference opened |
| Shoonya | Daily instrument and intraday token-based endpoints | Expired-contract lookup and retention not established by these pages |
Upstox's overlapping interval statements agree on 1 minute, 30 minutes and daily; that agreement is documentation evidence, not an authenticated test. Specific expired access is restricted to Plus despite the general free-API headline. Check the endpoint permission instead of assuming the headline covers it.
An approximate five-year minute archive: requests, not a speed test
Illustrative assumptions: a 1,825-day window, 500 instruments with usable history, one instrument per request and non-overlapping 60-day chunks. The window is an approximation, not a dated five-year calendar period. We use Kite's published staff span and current historical rate limit. No download was timed.
- Requests for one instrumentceil(1,825 ÷ 60) = 31; round upward because the last partial window still needs a call
- 31
- Requests for the assumed universe31 × 500
- 15,500
- Simplified rate budget15,500 ÷ 3 historical requests per second
- 5,166.6667 seconds
- Expressed in minutes5,166.6667 ÷ 60; rounded to 2 decimal places
- 86.11 minutes
- Same simplified budget in hours
- 1.44 hours
What the time estimate leaves undecided
The arithmetic translates a request count into a rate budget. It assumes the requested history exists and ignores response times, network transfer, authentication, errors and retries. It also assumes that the date boundaries can be divided as specified without extra overlap calls. Those assumptions need checking in the actual endpoint and client implementation.
It is therefore unsuitable as a promise that a job will finish in that time. A request that returns no records still consumes effort, and an apparently successful response may contain fewer timestamps than expected. We have not measured file size, compression, memory use or sustained endpoint throughput, so none is inferred from this model.
For a download plan, first calculate calls for the exact interval and permitted window. Keep that plan beside a log of completed date ranges. If the service caps returned candles rather than dates, use its stated candle limit instead of borrowing another provider's day limit. Comparing those units is more useful than calling a vendor fast without a controlled test.
A bhavcopy walkthrough using an official file
- 1
Select the exchange report family
On NSE's All Reports page, choose the capital-market reports for equities or the derivatives reports for F&O. The catalogues point to current UDiFF common bhavcopies. Select the desired report date; do not assume an old-format filename from a tutorial remains the current download.
- 2
Download and preserve the original
Use the exchange's offered file. For this guide, the named NSE CM ZIP for 13 October 2026 was downloaded and extracted successfully. Record the exact URL, trade date and retrieval date before working on a copy. A local filename alone is weak evidence of which day the content represents.
- 3
Read identity and date fields first
The downloaded NSE file has TradDt, BizDt, Sgmt, FinInstrmId, ISIN and TckrSymb fields. Its records carry the stated trade date and CM segment. Check the identifiers before joining files; similarly named securities or different share series should not be silently combined.
- 4
Use the observations the file contains
Its fields include opening, high, low and closing prices and total trading volume. The daily file is not a recovered sequence of minute candles. In derivatives data, preserve contract identity fields rather than treating the underlying name alone as the instrument.
- 5
Keep the unmodified copy and its terms
Analyse a separate working copy and acknowledge the source. The downloaded BSE CM file for the same date also has UDiFF identity and daily price fields. This inspection verifies those files, without establishing permission to republish them commercially or a guarantee that every historical date is available.
“Users may view, print copies and download the Content for personal, non-commercial or educational purpose”
Source: [19]
The two original files actually inspected
- NSE CM bhavcopy, 13 October 2026
- 3,648 records
- Downloaded ZIP, extracted CSV; checked trade date, segment and field names. No price-quality benchmark.
Source: [20]
- BSE CM bhavcopy, 13 October 2026
- 5,033 records
- Downloaded CSV; checked trade date, segment and field names. Different record counts do not compare exchange quality.
Source: [21]
Free access, account access and reuse permission
Start with an official exchange download when its daily observations answer the question. If you need intraday candles or contract-specific history, use the documented broker endpoint and its account entitlement. A broker's inclusion of history in an account service does not automatically make it a public data product for redistribution.
NSE's copyright permission includes acknowledgement, accurate reproduction and conditions on preserving content. The availability of a download link is therefore different from a licence to sell a dataset or operate a public feed. This guide offers no scraping route or workaround for access restrictions. If your intended use goes beyond the stated permission, seek the data owner's appropriate terms.
For subscription billing and brokerage, follow the API-fee comparison; the Kite plan guide explains its pricing timeline and credit uncertainty. If you are preparing a strategy test, backtesting basics can help define the study, while backtest versus live results covers the separate interpretation of the result. Neither a long archive nor a paid subscription demonstrates future profitability.
Before treating the dataset as ready
Record the actual coverage
Keep the first and last returned timestamps, instrument identity, interval and any missing ranges. Preserve a log of unavailable requests instead of filling holes without a stated method.
Resolve source conflicts
Ask ICICI Direct which instruments and intervals have the advertised ten-year coverage. Confirm Upstox expired-endpoint entitlements and the inconsistent interval list before building around them.
Keep the study and trade record distinct
When you later compare model assumptions with your own outcomes, use real recorded trades and the expectancy calculator. A historical price file supplies observations; it does not record your decision or execution.
Sources
Every figure on this page comes from one of these. Each was checked on the date shown.
- [1]Kite historical candles · checked 14 Oct 2026
- [2]Kite staff request-span table, edited May 2020 · checked 14 Oct 2026
- [3]Kite endpoint rate limits · checked 14 Oct 2026
- [4]Kite plan pricing · checked 14 Oct 2026
- [5]Dhan historical data endpoints · checked 14 Oct 2026
- [6]Dhan expired rolling options · checked 14 Oct 2026
- [7]Dhan Data API subscription · checked 14 Oct 2026
- [8]Upstox historical candles v3 · checked 14 Oct 2026
- [9]Upstox expired historical candles · checked 14 Oct 2026
- [10]Upstox API overview · checked 14 Oct 2026
- [11]Breeze product page and FAQs · checked 14 Oct 2026
- [12]Official Breeze Python client documentation · checked 14 Oct 2026
- [13]FYERS developer market-data reference · checked 14 Oct 2026
- [14]FYERS historical-data fee FAQ · checked 14 Oct 2026
- [15]Shoonya daily history · checked 14 Oct 2026
- [16]Shoonya Time/Price Series · checked 14 Oct 2026
- [17]NSE capital-market report catalogue · checked 14 Oct 2026
- [18]NSE derivatives report catalogue · checked 14 Oct 2026
- [19]NSE copyright policy · checked 14 Oct 2026
- [20]NSE original CM bhavcopy, 13 October 2026 · checked 14 Oct 2026
- [21]BSE original CM bhavcopy, 13 October 2026 · checked 14 Oct 2026