Guides

Historical Stock Data API

A historical stock data API should deliver adjusted and unadjusted prices, include delisted securities, and support multiple timeframes. FinzData offers daily bars for NYSE and Nasdaq stocks since January 2000, with delisted names marked by '-DELISTED' suffix, and provides split-only, dividend-adjusted, and fully adjusted series. Access depends on your plan: free for the last 12 months, look-back bundles for longer histories, and institutional for full commercial use.

Updated 2026-10-11. Code on this page was run against live FinzData data before publishing.

Data Coverage and Adjustments

FinzData provides daily bars for every NYSE and Nasdaq stock since January 2000, including delisted names, which carry the '-DELISTED' suffix in their symbol. This covers approximately 16,000 stocks and 231 ETFs. Prices can be retrieved in three forms: unadjusted, split-adjusted only, or split-and-dividend adjusted. The adjustment is controlled via the 'adjust' parameter in the prices() method.

For intraday analysis, 1-minute, 5-minute, and hourly bars are available. However, 1-minute and 5-minute data require a look-back bundle of 25 years or more, or an Institutional plan. Hourly bars are included in all look-back bundles. Free tier access is limited to the last 12 months of daily data only.

Splits and dividends are provided separately via the actions() method, returning a time series of events with date, type ('split' or 'dividend'), and value. This allows users to reconstruct adjusted series manually if needed, though the adjust parameter handles this automatically for most use cases.

import finzdata as yf
c = yf.Client()
# Get split-and-dividend adjusted daily data for AAPL (free: last 12 months)
df = c.prices('AAPL', adjust='all')
print(df.head())
# Get unadjusted data
df_raw = c.prices('AAPL', adjust='none')
print(df_raw.tail())

Accessing Historical Daily Data

The free tier allows access to the last 12 months of daily US stock bars using either the Ticker.history() method or the Client.prices() method. For longer histories, a look-back bundle is required. The first 5 years of history cost $195 one-time, with additional 5-year blocks at $95 each, plus $19.95/month for daily updates. These bundles include point-in-time macro vintages and fundamentals.

To access data beyond 12 months or for delisted securities like Lehman Brothers (LEHMQ-DELISTED), you must have an active look-back bundle or Institutional plan. Without it, the API returns HTTP 403. The Ticker.history() method with period='max' will return all available daily bars for a symbol when access is permitted.

The Client.prices() method offers more control over date ranges and adjustment types. It returns a tidy DataFrame with columns: symbol, date, open, high, low, close, volume. This format is useful for multi-symbol analysis and avoids the multi-index structure of yf.download().

import finzdata as yf
c = yf.Client()
# Get 5 years of adjusted daily data for MSFT (requires look-back bundle)
df = c.prices('MSFT', start='2021-10-01', adjust='all')
print(f'Rows: {len(df)}')
print(df[['date', 'close']].head())
# For delisted stock (requires look-back bundle)
df_delisted = c.prices('LEHMQ-DELISTED', start='2000-01-01', adjust='all')
print(f'Lehman rows: {len(df_delisted)}')

Intraday Data Access

Intraday bars at 1-minute, 5-minute, and hourly intervals are available through the Ticker.history() method with interval parameter, or the Client.minutes() method. The interval options are '1m', '5m', and '1hour'. As with extended daily history, 1-minute and 5-minute bars require a look-back bundle of 25 years or more, or an Institutional plan. Hourly bars are included in all look-back bundles.

The minutes() method returns a DataFrame with columns: symbol, ts, open, high, low, close, volume, where ts is a timestamp. This allows precise intraday analysis. For example, to analyze opening volatility, you can filter the first 30 minutes of trading.

Free tier users cannot access any intraday data. Attempting to call history() with interval='1m' or '5m', or minutes() with those intervals, will result in HTTP 403 without the required look-back bundle or Institutional plan.

import finzdata as yf
c = yf.Client()
# Get 5-minute bars for AAPL (requires 25+ year bundle or Institutional)
df_5m = c.minutes('AAPL', start='2026-10-01', interval='5min', adjust='all')
print(df_5m.head())
# Get hourly bars (available in all bundles)
df_hourly = c.minutes('AAPL', start='2026-10-01', interval='1hour', adjust='all')
print(f'Hourly rows: {len(df_hourly)}')

Using Ticker vs Client Methods

The yf.Ticker() class provides a familiar interface similar to yfinance, with history() returning a DataFrame indexed by Date with columns Open, High, Low, Close, Volume. This is useful for quick analysis and interactive work. The free tier limits Ticker.history() to the last 12 months, regardless of period setting.

For more control, especially in production or batch workflows, the yf.Client() class is preferred. Its prices() and minutes() methods return tidy DataFrames with explicit symbol and date/ts columns, making them easier to combine with other data. The Client also provides direct access to actions, fundamentals, macro, and 13F data.

The yf.download() method works for multiple tickers and returns a multi-index DataFrame similar to yfinance, with fields like 'Close' and 'Volume' as top-level columns and tickers as the second level. This is convenient for backtesting but less ideal for merging with external datasets.

import finzdata as yf
# Ticker interface (free: last 12 months only)
df_ticker = yf.Ticker('AAPL').history(period='1y')
print(df_ticker.head())
# Client interface (more flexible)
c = yf.Client()
df_client = c.prices('AAPL', start='2025-10-01', adjust='all')
print(df_client.head())
# Multi-ticker download
df_multi = yf.download(['SPY', 'QQQ'], period='6mo')
print(df_multi['Close'].head())

Plan Selection Guide

The free tier is suitable for users who need only the last 12 months of daily data, such as for recent strategy testing or educational purposes. It includes the last 12 months of COT positioning, SEC fundamentals and macro values, and the latest 13F ownership by stock. No credit card is required.

Look-back bundles are ideal for independent researchers, small teams, or quants who need multi-year history but do not require commercial redistribution rights. The $195 first 5 years, $95 per additional 5 years, plus $19.95/month model allows scaling cost with history depth. These bundles add point-in-time macro vintages, fundamentals, liquidity data, and 13F history for the purchased years.

The Institutional plan at $975 one-time + $59.95/month is designed for commercial use, funds, and enterprises. It includes all data types with full history, commercial license, and access to 1-minute and 5-minute bars without requiring 25 years of look-back. This plan covers all data mentioned in the facts, including delisted securities and full 13F history.

import finzdata as yf
# Example: Check if you have access to long history
try:
    c = yf.Client()
    df = c.prices('IBM', start='2000-01-01', adjust='all')
    print(f'Success: {len(df)} rows of IBM data')
except Exception as e:
    print(f'Access denied: {str(e)} - likely need look-back bundle or Institutional plan')

Questions

Does FinzData include delisted stocks in its historical data?

Yes, FinzData includes delisted NYSE and Nasdaq stocks with approximately 16,000 securities total. Delisted symbols carry the '-DELISTED' suffix (e.g., LEHMQ-DELISTED for Lehman Brothers), and their full price history is available with the appropriate look-back bundle or Institutional plan.

What adjustments are available for stock prices, and how are they applied?

Prices can be retrieved unadjusted, split-adjusted only, or split-and-dividend adjusted using the adjust parameter: c.prices() takes 'none', 'splits' or 'all', and c.minutes() takes 'none' or 'all'. The 'all' setting applies both split and dividend adjustments to provide total return price series.

Can I get 1-minute intraday data on the free plan?

No, 1-minute and 5-minute intraday bars require a look-back bundle of 25 years or more, or an Institutional plan. Hourly bars are included in all look-back bundles. The free tier only provides the last 12 months of daily data.

How does FinzData's pricing model work for historical data access?

The free tier offers last 12 months of daily bars. Look-back bundles cost $195 for the first 5 years, $95 per additional 5 years, plus $19.95/month for updates. The Institutional plan is $975 one-time + $59.95/month for full history and commercial rights. All bundles include daily and hourly bars; 1-minute/5-minute require 25+ years of history or Institutional.