Yahoo Finance Stock Price Scraper - Quotes, History & Dividends avatar

Yahoo Finance Stock Price Scraper - Quotes, History & Dividends

Pricing

from $1.46 / 1,000 symbol row returneds

Go to Apify Store
Yahoo Finance Stock Price Scraper - Quotes, History & Dividends

Yahoo Finance Stock Price Scraper - Quotes, History & Dividends

Get Yahoo Finance stock prices by ticker or company name: latest quote, change vs previous close, OHLCV history from 1-minute to monthly bars, dividends and splits. One row per symbol or one row per bar. Monitoring mode returns a symbol only when its price moves past your threshold.

Pricing

from $1.46 / 1,000 symbol row returneds

Rating

0.0

(0)

Developer

NeverEmpty

NeverEmpty

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Get stock prices from Yahoo Finance for a list of tickers or company names: the latest price, the change from the previous close, the day's open, high, low and volume, the 52-week range, and price history (OHLCV) from 1-minute to quarterly bars, with dividends and stock splits. Works for US and international stocks (7203.T, VOD.L), ETFs, mutual funds, indices (^GSPC), futures, currencies and crypto.

Choose one row per symbol (the quote plus the whole history in a list) or one row per price bar, ready for a spreadsheet. Turn on monitoring mode, schedule the Actor, and a run returns a symbol only when its price moved by your threshold.

No API key and no Yahoo account are needed.

What you can use it for

  • Portfolio and watchlist tracking: the latest price and daily change for all your tickers in one table, on a schedule.
  • Backtesting and research: daily, weekly or monthly OHLCV history back to a stock's first trading day, with adjusted closes, dividends and splits.
  • Intraday analysis: 1-minute to 4-hour bars for recent days.
  • Price alerts: monitoring mode returns only the symbols that moved by at least your threshold since the row last returned for them.
  • Dividend research: every dividend and split in a period, with its date and amount or ratio.

How it works

  1. For each symbol the Actor reads Yahoo Finance's public chart data (https://query1.finance.yahoo.com/v8/finance/chart/<symbol>), the data source the Yahoo Finance website uses for its charts. It checks that Yahoo answered for the same symbol you asked for.
  2. The quote is read with a one-day request, because only that request gives the previous day's close: in a longer request Yahoo's "previous close" is the close before the start of the range (for Apple on 2026-09-16 a one-month request gave 305.93, the close a month earlier, while the previous day's close was 331.34). The change is computed from that close and the latest price, and Yahoo's own percent is passed through separately as yahooChangePercent.
  3. If price history is on, a second request reads the bars for your range and interval (1-minute bars are read in 7-day pieces, because Yahoo returns at most 8 days of them per request).
  4. Company names are looked up with Yahoo Finance search (/v1/finance/search); the first stock, ETF, fund or index in Yahoo's answer is used and every row shows what was matched.
  5. Unknown symbols, unmatched names, settings Yahoo does not allow and rate limits come back as free rows that say why.

Company financials (income statements, balance sheets) are not included: Yahoo's endpoint for them needs a session token and answered HTTP 401 when tried from Apify on 2026-09-16 (UTC).

Input

FieldDefaultWhat it does
symbolsexample symbolsYahoo Finance symbols, one per line (commas also separate entries). Lower case is accepted. A repeated symbol is read and charged once; the repeat gets a free duplicate row.
companyNames-Company names to look up with Yahoo search, one per line.
outputFormatsymbolsymbol = one row per symbol with the history in a list; bar = one row per price bar, dividend or split.
includeHistorytrueSymbol format: include the price bars, dividends and splits. Off = latest quote only (one request per symbol).
range1moHow far back the history goes: 1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y, 10y, ytd or max. Ignored when startDate is set.
startDate-YYYY-MM-DD: history from this date (the exchange's local date) instead of range.
endDate-YYYY-MM-DD, included. Needs startDate.
interval1dBar length: 1m, 2m, 5m, 15m, 30m, 60m, 90m, 1h, 4h, 1d, 5d, 1wk, 1mo, 3mo.
includeEventstrueInclude dividends and splits inside the history period.
maxResults1,000 symbol rows / 10,000 bar rowsThe most charged rows per run.
monitoringModefalseReturn a symbol only when its price moved by at least thresholdPercent since the row last returned for it.
thresholdPercent1Monitoring mode: the smallest move, in percent up or down, that returns a symbol.
resetMonitoringStatefalseForget every remembered price and start a fresh baseline. Turn it off again after one run.
useProxytrueRetry a request through an Apify proxy only if Yahoo rate-limits it.
{
"symbols": ["AAPL", "MSFT", "7203.T", "^GSPC"],
"companyNames": ["Nvidia"],
"range": "1y",
"interval": "1d"
}

If you leave out both symbols and companyNames with monitoring off, the example symbols AAPL, MSFT and 7203.T are read (the run log says so and every row shows them in input). In monitoring mode one of the two fields is required, so a schedule never pays to watch the examples. An empty list is rejected with a free invalid-input row.

Symbols

Use the symbol exactly as Yahoo Finance writes it: AAPL, BRK-B (share classes take a dash; BRK.B is not found), 7203.T (Tokyo), VOD.L (London), ^GSPC (S&P 500), ES=F (futures), EURUSD=X (currency), BTC-USD (crypto). Entries with a space are not split into symbols: put company names in companyNames.

Company names

Yahoo search usually lists the main US listing first: on 2026-09-16 (UTC) Toyota Motor gave TM (NYSE) and Sony Group gave SONY (NYSE), not 7203.T or 6758.T in Tokyo. Futures on the same company (for example SAAPL=F) are skipped. Check searchMatchName and searchMatchExchange, and use the symbol when you need a specific listing.

Allowed intervals and ranges

Yahoo keeps intraday bars only for a limited time (from Yahoo's own error messages, 2026-09-16 UTC):

IntervalYahoo keepsrange values acceptedOldest startDate accepted
1mlast 30 days, at most 8 days per request1d, 5d28 days back
2m, 5m, 15m, 30m, 90mlast 60 days1d, 5d, 1mo (ytd in the first 60 days of a year)58 days back
60m, 1h, 4hlast 730 days1d to 2y, and ytd728 days back
1d, 5d, 1wk, 1mo, 3mofull historyallany

Other combinations are rejected before anything is requested, with a free invalid-input row that says why. With range: "max", Yahoo silently returns 3-month bars when asked for weekly or monthly ones, so this Actor asks for the full period by dates instead, and it never sells bars of a different interval than the one you chose (they get a free interval-changed-by-yahoo row).

Weekly, 5-day, monthly and quarterly bars are cut at the edges of what you ask for: with range: "1mo" or a From date in the middle of a week, the first weekly bar covers only the days inside the range, so its open and volume differ from the full week on Yahoo's chart.

Output

Symbol format (default)

One row per symbol. Shortened (2 of 22 bars shown); read from Apify's servers on 2026-09-16 at 15:28 UTC, during the US trading session:

{
"status": "ok",
"rowType": "symbol",
"input": "AAPL",
"inputKind": "symbol",
"symbol": "AAPL",
"name": "Apple Inc.",
"shortName": "Apple Inc.",
"instrumentType": "EQUITY",
"currency": "USD",
"exchange": "NMS",
"exchangeName": "NasdaqGS",
"exchangeTimezone": "America/New_York",
"yahooUrl": "https://finance.yahoo.com/quote/AAPL",
"price": 332.51,
"priceTime": "2026-09-16T15:28:48.000Z",
"priceLocalTime": "2026-09-16T11:28:48",
"marketState": "regular-session",
"previousClose": 331.34,
"change": 1.17,
"changePercent": 0.3531116074,
"dayChangeStatus": "ok",
"yahooChangePercent": 0.353,
"dayOpen": 332.42,
"dayHigh": 335.48,
"dayLow": 331.87,
"dayVolume": 10570989,
"fiftyTwoWeekHigh": 344.57,
"fiftyTwoWeekLow": 236.65,
"firstTradeDate": "1980-12-12T14:30:00.000Z",
"historyInterval": "1d",
"historyRange": "1mo",
"barCount": 22,
"barsWithoutClose": 0,
"bars": [
{
"date": "2026-09-15",
"time": "2026-09-15T13:30:00.000Z",
"localTime": "2026-09-15T09:30:00",
"open": 330.14,
"high": 331.78,
"low": 328.35,
"close": 331.34,
"adjClose": 331.34,
"volume": 31694100,
"isIncomplete": false,
"closeFromQuote": false
},
{
"date": "2026-09-16",
"time": "2026-09-16T13:30:00.000Z",
"localTime": "2026-09-16T09:30:00",
"open": 332.42,
"high": 335.48,
"low": 331.87,
"close": 332.53,
"adjClose": 332.53,
"volume": 10571255,
"isIncomplete": true,
"closeFromQuote": false
}
],
"dividends": [],
"splits": [],
"historyStatus": "ok",
"searchMatchName": null,
"searchMatchExchange": null,
"monitorStatus": null,
"thresholdPercent": null,
"isFirstCheck": null,
"previousReturnedPrice": null,
"previousReturnedPriceTime": null,
"previousReturnedAt": null,
"previousCurrency": null,
"priceMove": null,
"priceMovePercent": null,
"source": "yahoo-finance",
"scrapedAt": "2026-09-16T15:28:48.000Z"
}
  • price, priceTime: Yahoo's latest regular-market price and the time of that trade. Yahoo does not say whether a quote is real-time or delayed; for many exchanges Yahoo's own site shows delayed quotes.
  • marketState: regular-session, pre-market, post-market or closed, from Yahoo's trading periods at the time of the run. For 24-hour markets (crypto) the whole day counts as regular-session.
  • previousClose, change, changePercent: computed from the previous day's close. dayChangeStatus is ok, no-previous-close, previous-close-not-confirmed, or not-provided-for-this-instrument-type for crypto, currencies and other 24-hour instruments. The computed percent is checked against Yahoo's own percent; if they differ by more than 0.01 percentage points (or Yahoo gives none), no previous close is sold and the status is previous-close-not-confirmed: on 2026-09-16 UTC Yahoo's one-day "previous close" for the Hang Seng index (^HSI) was the close of 2026-09-14, two trading days back (24917.6), which would have turned Yahoo's +0.189% into -0.818%. For crypto and currencies: for BTC-USD on 2026-09-16 Yahoo's one-day "previous close" (75586.51) did not match Yahoo's own daily change (-845 from 75619.95), so no previous close is sold for them. yahooChangePercent is Yahoo's own number, passed through unchanged.
  • bars[]: oldest first. open, high, low and close are adjusted for splits by Yahoo (NVIDIA's close on 2024-06-03, before its 10-for-1 split on 2024-06-10, comes back as 115); adjClose is also adjusted for dividends (daily and longer bars only). date and localTime are in the exchange's time zone, time is UTC.
  • isIncomplete: true for the last bar while its period is still running (today's daily bar during the session, the current week or month, the latest intraday bar during the session). During trading Yahoo sends the latest price as a separate piece at the end of the chart; the Actor merges it into the bar of the same period (high and low combined, close from the latest price, volumes added), so the current week or month is one bar, not two.
  • barsWithoutClose: Yahoo sometimes sends bars with no closing price (for Toyota 7203.T on 2026-09-16 the finished day's bar had no close; 1-minute bars also contain some). Those bars are left out and counted here. The one exception: if the last daily bar has no close and is the same trading day as the quote, its close is filled with Yahoo's quote price and closeFromQuote is true.
  • Prices in bars are sent by Yahoo with float rounding noise (333.1050109863281); they are returned as the shortest decimal that is the same number (333.105).
  • dividends[]: date, time, amount (per share, in the symbol's currency). splits[]: date, time, numerator, denominator, ratio (for example "10:1").
  • historyStatus: ok, or not-requested when price history is off or in monitoring mode (then bars, dividends, splits and the other history columns are null).

Bar format (outputFormat: "bar")

One row per price bar, plus one row per dividend and per split (rowType is bar, dividend or split), newest first:

{
"source": "yahoo-finance",
"status": "ok",
"scrapedAt": "2026-09-16T15:28:48.000Z",
"input": "MSFT",
"symbol": "MSFT",
"name": "Microsoft Corporation",
"currency": "USD",
"exchange": "NMS",
"exchangeTimezone": "America/New_York",
"interval": "1d",
"rowType": "dividend",
"date": "2026-08-20",
"time": "2026-08-20T13:30:00.000Z",
"localTime": null,
"open": null,
"high": null,
"low": null,
"close": null,
"adjClose": null,
"volume": null,
"isIncomplete": null,
"closeFromQuote": null,
"dividendAmount": 0.91,
"splitRatio": null,
"splitNumerator": null,
"splitDenominator": null
}

Bar rows fill open, high, low, close, adjClose, volume, isIncomplete, closeFromQuote and localTime; split rows fill splitRatio, splitNumerator and splitDenominator. When maxResults or your maximum total charge stops a symbol's rows, the oldest ones are left out and a free row says how many.

Monitoring mode

With monitoringMode on, a symbol row is returned only when:

monitorStatusWhen
"first-check"The symbol (with this threshold) has not been returned before.
"price-moved"price moved by at least thresholdPercent percent, up or down, from the price in the row last returned for it.
"currency-changed"Yahoo now quotes the symbol in a different currency than in that row (prices are not compared).
"previous-price-missing"The remembered row has no usable price, so this row starts a new baseline.

The move is measured from the last returned price, not from the last check, so a slow drift is returned once it adds up to the threshold. previousReturnedPrice, previousReturnedPriceTime, previousReturnedAt, priceMove and priceMovePercent show the comparison. Prices are remembered per symbol and threshold in a store named yahoo-finance-monitoring; two schedules that can run at the same time should not watch the same symbol with the same threshold (Apify's key-value store has no atomic update, so their records can overwrite each other).

Rows that are not charged

statusMeaning
symbol-not-foundYahoo answered HTTP 404 ("No data found, symbol may be delisted"). Yahoo gives this for symbols that never existed and for delisted ones alike (TWTR on 2026-09-16 UTC), so the row does not say which.
different-symbol-returnedYahoo answered for another symbol than the one asked for.
refused-by-yahooYahoo refused the request (HTTP 400 or 422); its message is in note.
no-bars-returnedYahoo answered but sent no bars with a closing price for the range and interval (on 2026-09-16 UTC it did so for 2-minute bars 52 to 59 days back, inside its 60-day window). This does not claim there was no trading.
interval-changed-by-yahooYahoo sent bars of a different interval than requested.
no-search-matchYahoo search returned no stock, ETF, fund or index for a company name, even when asked twice (on 2026-09-16 UTC it once answered "Apple" with nothing and gave AAPL on the next request).
blockedYahoo answered with a rate limit, an error page or nothing, even after retries.
unreadableYahoo's answer could not be read.
invalid-inputThe entry is not a symbol, or the settings are not allowed; nothing was requested.
row-too-largeThe symbol row with its history is larger than one Apify dataset item can hold (about 9.4 MB, for example 1-minute bars of a crypto pair for four weeks). Use outputFormat: "bar" or a shorter range.
duplicateThe same symbol appeared earlier in the list.
no-changeMonitoring mode: no symbol moved by the threshold.
not-checkedEntries or bars left out because of maxResults or the 1,000-entry limit.
budget-reachedEntries or bars left out because the run's maximum total charge was reached.

Pricing

Pay per event:

  • $2.00 per 1,000 symbol rows (outputFormat: "symbol"), charged only for rows with status: "ok". One symbol row carries the whole history for your range at the same price: Apple with every daily bar since 1980 (about 11,500 bars) is one row. A row that would be larger than an Apify dataset item allows is not returned (free row-too-large row).
  • $0.50 per 1,000 bar rows (outputFormat: "bar"), charged for each price bar, dividend and split row with status: "ok". One year of daily bars for one stock is about 250 rows ($0.125).
  • $0.30 per 1,000 symbol checks in monitoring mode: every symbol whose quote is read costs a check, moved or not, plus the symbol row price for the rows returned. 50 symbols every 15 minutes during a 6.5-hour US trading day, 22 days a month, is 28,600 checks, which is $8.58.

Free rows (the table above) are never charged. Set a maximum total charge on the run to cap the cost: the Actor stops reading before it would go over and says so in a free row.

Good to know

  • This is not an official Yahoo API. The Actor reads the public data endpoints the Yahoo Finance website uses. Yahoo can change or limit them at any time, and Yahoo's terms restrict how its data may be used and redistributed: check that your use is allowed.
  • Not investment advice. Prices are returned as Yahoo publishes them, without any guarantee of accuracy or timeliness.
  • The numbers in this README were measured from Apify's servers on 2026-09-16 (UTC) and can change.
  • Requests are sent one at a time with a pause between them. If Yahoo rate-limits a request (HTTP 429), the Actor waits and retries, through a proxy if useProxy is on.
  • If Apify restarts or moves a run, it continues where it stopped and does not charge again for rows already in the dataset.

FAQ

Does it return real-time prices? It returns the latest price Yahoo's chart data has at the moment of the run, with its trade time in priceTime. Yahoo does not mark whether that price is delayed.

Can I get the full history of a stock? Yes: range: "max" with a daily, weekly, monthly or quarterly interval.

Why is change empty for Bitcoin? 24-hour markets have no single previous close; see dayChangeStatus. yahooChangePercent still carries Yahoo's own number.

Why is a symbol from another exchange not found? Add Yahoo's exchange suffix (.T Tokyo, .L London, .DE XETRA, .TO Toronto, .HK Hong Kong).