L logiover
data · Jul 9, 2026 · 7 min read

How to Scrape Yahoo Finance: OHLCV, Quotes & Crypto 2026

Extract historical OHLCV prices, live quotes and symbol search from Yahoo Finance for stocks, ETFs, indices, forex and crypto — via public JSON endpoints, no API key.

Yahoo Finance is the default free source for market data — stocks, ETFs, indices, forex and crypto, all in one place, going back decades. But Yahoo shut down its official API years ago, and what remains are undocumented JSON endpoints that quant developers reverse-engineer and libraries like yfinance wrap. Hit those endpoints too hard from one IP and you get rate-limited; the batch quote endpoint gets blocked periodically; and bulk-downloading years of daily bars across dozens of tickers means orchestrating a lot of concurrent requests. This guide covers how Yahoo Finance’s endpoints actually work and how to pull clean OHLCV, live quotes and symbol lookups in bulk.

What’s worth extracting

The output shape depends on the mode, but every row shares a common core. In historical mode you get one row per bar per symbol:

  • symbol and name — the ticker (AAPL) and full asset name.
  • date — the ISO date of the bar (YYYY-MM-DD).
  • open, high, low, close — the OHLC prices for that bar.
  • adjClose — the closing price adjusted for splits and dividends (use this for return calculations).
  • volume — shares or units traded.
  • currency, exchange, quoteType — the pricing currency (USD, EUR…), exchange name (NasdaqGS, NYSEArca…) and asset class (EQUITY, ETF, INDEX, CRYPTOCURRENCY, CURRENCY).

In quote mode you get the same core plus live-market fields: price (current market price), change and changePercent, dayHigh and dayLow, fiftyTwoWeekHigh and fiftyTwoWeekLow, and marketCap. That’s up to 21 fields per row, enough to drive a backtest, a portfolio dashboard or an ML feature set without a paid data vendor.

How the Yahoo Finance endpoints actually work

The actor connects directly to Yahoo Finance’s undocumented JSON endpoints on query1.finance.yahoo.com and query2.finance.yahoo.com — the same endpoints your browser hits when you load a chart on finance.yahoo.com. There’s no API key and no authentication. Three modes map to three endpoints:

  • Historical mode calls /v8/finance/chart/{symbol} to retrieve the full OHLCV time series for each ticker.
  • Quote mode calls /v7/finance/quote for live market data, with an automatic fallback to the chart-meta endpoint if the batch quote endpoint is blocked.
  • Search mode calls /v1/finance/search to look up symbols by keyword.

A historical run is the most common. You give it a list of symbols, a range and a bar interval:

{
  "mode": "historical",
  "symbols": ["AAPL", "MSFT", "TSLA", "BTC-USD", "ETH-USD"],
  "range": "6mo",
  "interval": "1d",
  "proxy": { "useApifyProxy": true }
}

Ranges run 1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y, 10y, ytd, max; intervals run 1m, 2m, 5m, 15m, 30m, 60m, 90m, 1h, 1d, 5d, 1wk, 1mo, 3mo. A worker-pool design processes symbols concurrently, so a big symbol list resolves quickly. Quote mode drops the range/interval and just takes symbols:

{
  "mode": "quote",
  "symbols": ["AAPL", "MSFT", "GOOGL", "NVDA", "EURUSD=X", "^GSPC"],
  "proxy": { "useApifyProxy": true }
}

And search mode takes a keyword to resolve an unfamiliar ticker:

{
  "mode": "search",
  "query": "Nvidia",
  "proxy": { "useApifyProxy": true }
}

The symbol conventions are the thing to internalize: crypto pairs use a -USD suffix (BTC-USD, ETH-USD), forex appends =X (EURUSD=X, GBPJPY=X), indices prefix with a caret (^GSPC for the S&P 500, ^DJI for the Dow), and non-US equities carry an exchange suffix (ASML.AS for Amsterdam, 7203.T for Tokyo).

Open the Yahoo Finance Scraper on Apify — one historical run pulls thousands of OHLCV bars across stocks, ETFs, forex, indices and crypto. Keyless, no login, no data subscription. Export to CSV, JSON, Excel or XML.

The access reality

The endpoints are public, but they’re not a supported product, so a few realities shape how you use them.

  • Rate limits are per-IP and real. Hammering the endpoints from a single address gets you throttled — the classic failure mode for local yfinance scripts. Running in the cloud behind Apify Proxy (on by default) spreads requests and processes symbols concurrently without tripping the local rate-limit wall.
  • The batch quote endpoint gets blocked periodically. Yahoo occasionally restricts /v7/finance/quote; the actor falls back to the chart-meta endpoint automatically so quote mode keeps working.
  • Intraday history is short. Short intervals (1m90m) are only available for recent data — roughly the past 7–60 days depending on the interval. Use daily or weekly bars for multi-year history; range: "max" on a large-cap US stock can reach back to the 1980s.
  • Data is delayed. Quotes are delayed ~15 minutes for most equity markets (real-time for some), and historical OHLCV is typically finalized by the next trading day. This is fine for backtesting and research — do not use it for live order execution; use a brokerage API for that.

On volume: there’s no hard cap and the actor paginates automatically. Ten symbols of daily bars over five years is roughly 12,500 rows; a max-range run across 50+ symbols easily clears 100,000 rows in a single run.

Example output

A single historical bar:

{
  "symbol": "AAPL",
  "name": "Apple Inc.",
  "mode": "historical",
  "date": "2024-01-15",
  "open": 183.920006,
  "high": 185.089996,
  "low": 181.0,
  "close": 182.320007,
  "adjClose": 182.05069,
  "volume": 65421000,
  "currency": "USD",
  "exchange": "NasdaqGS",
  "quoteType": "EQUITY"
}

In historical mode the live-quote fields (price, change, marketCap…) are null; in quote mode those populate and the per-bar OHLC fields are null instead. Export the whole dataset to CSV, JSON, Excel or XML.

Typical use cases

  • Strategy backtesting — pull five years of daily OHLCV across 50 stocks in one run to backtest a moving-average crossover without a paid data feed.
  • Portfolio dashboards — schedule a morning quote-mode run and auto-refresh live prices for a personal portfolio into Google Sheets.
  • ML feature pipelines — download 1-minute intraday bars for BTC-USD and ETH-USD to feed a volatility model.
  • Breakout monitoring — track 52-week high/low breakouts across a list of ETFs with a daily scheduled run and a Slack webhook alert.
  • Ticker resolution — look up the correct symbol for an obscure foreign equity or index via search mode before adding it to a watchlist.
  • Cross-asset research — academics studying volatility or cross-asset correlation using free, multi-class public data.

Build-it-yourself vs. managed

You can hit these endpoints yourself — yfinance and a dozen other wrappers exist. What you take on:

  • Rate-limit engineering. A single-IP script gets throttled on any serious bulk pull. Solving it means a proxy pool and concurrency control — the exact thing that turns a weekend script into an ops burden.
  • Endpoint fragility. These are undocumented and change without notice; the batch quote block is a recurring example. You own the fallback logic and the fixes when Yahoo shifts something.
  • Bar cleaning. Null bars for holidays and halts need skipping so your series contains only tradeable points, and you have to reconcile the three endpoints’ differing response shapes into one row schema.
  • Symbol conventions. Getting the suffix rules right (-USD, =X, ^, exchange suffixes) across asset classes.

The managed actor already handles the proxying, the concurrency, the quote-endpoint fallback and the null-bar skipping, and runs on pay-per-result pricing — a fraction of a cent per row. A 12,500-row multi-year pull costs a few dollars, runs in the cloud with no local setup, and doesn’t fall over when Yahoo tweaks an endpoint.

Common pitfalls

Specifics that will bite a Yahoo Finance pipeline:

  • Use adjClose, not close, for returns. adjClose is adjusted for splits and dividends; close is the raw print. Mixing them corrupts return calculations.
  • Intraday ranges are capped by recency. Requesting a 1m interval over a 1y range won’t work — short intervals only cover recent days. Match interval to range.
  • Wrong suffix = zero rows. A non-US ticker without its exchange suffix (ASML instead of ASML.AS) returns nothing. If a symbol comes back empty, resolve it via search mode first.
  • Null bars exist. Market holidays, halts and thin liquidity produce empty bars; the actor skips them, so don’t expect a row for every calendar day.
  • Delayed data is not live data. The ~15-minute quote delay makes this unsuitable for automated order execution — it’s a research and backtesting feed.
  • Mode determines which fields are populated. Historical rows have OHLC and null quote fields; quote rows have live fields and null OHLC. Filter on mode before assuming a column is present.

Wrapping up

Yahoo Finance is the best free market-data source on the web, but the endpoints are undocumented, rate-limited and occasionally moody. If you need a few tickers once, a local yfinance script is fine. If you need bulk OHLCV across dozens of symbols and asset classes, refreshed on a schedule, without fighting rate limits or endpoint changes, the managed actor does that in the cloud today.

Run the Yahoo Finance Scraper on Apify — one historical run yields thousands of OHLCV bars, or a quote run returns live prices and 52-week ranges, across stocks, ETFs, indices, forex and crypto. Keyless, no login. Export to CSV, JSON, Excel or XML. Start on Apify’s free monthly credit.

Related guides