Yahoo Finance Stock Price Scraper - Quotes, History & Dividends
Pricing
from $1.46 / 1,000 symbol row returneds
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
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
- 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. - 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 was331.34). The change is computed from that close and the latest price, and Yahoo's own percent is passed through separately asyahooChangePercent. - 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).
- 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. - 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
| Field | Default | What it does |
|---|---|---|
symbols | example symbols | Yahoo 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. |
outputFormat | symbol | symbol = one row per symbol with the history in a list; bar = one row per price bar, dividend or split. |
includeHistory | true | Symbol format: include the price bars, dividends and splits. Off = latest quote only (one request per symbol). |
range | 1mo | How 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. |
interval | 1d | Bar length: 1m, 2m, 5m, 15m, 30m, 60m, 90m, 1h, 4h, 1d, 5d, 1wk, 1mo, 3mo. |
includeEvents | true | Include dividends and splits inside the history period. |
maxResults | 1,000 symbol rows / 10,000 bar rows | The most charged rows per run. |
monitoringMode | false | Return a symbol only when its price moved by at least thresholdPercent since the row last returned for it. |
thresholdPercent | 1 | Monitoring mode: the smallest move, in percent up or down, that returns a symbol. |
resetMonitoringState | false | Forget every remembered price and start a fresh baseline. Turn it off again after one run. |
useProxy | true | Retry 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):
| Interval | Yahoo keeps | range values accepted | Oldest startDate accepted |
|---|---|---|---|
1m | last 30 days, at most 8 days per request | 1d, 5d | 28 days back |
2m, 5m, 15m, 30m, 90m | last 60 days | 1d, 5d, 1mo (ytd in the first 60 days of a year) | 58 days back |
60m, 1h, 4h | last 730 days | 1d to 2y, and ytd | 728 days back |
1d, 5d, 1wk, 1mo, 3mo | full history | all | any |
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-marketorclosed, from Yahoo's trading periods at the time of the run. For 24-hour markets (crypto) the whole day counts asregular-session.previousClose,change,changePercent: computed from the previous day's close.dayChangeStatusisok,no-previous-close,previous-close-not-confirmed, ornot-provided-for-this-instrument-typefor 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 isprevious-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: forBTC-USDon 2026-09-16 Yahoo's one-day "previous close" (75586.51) did not match Yahoo's own daily change (-845from75619.95), so no previous close is sold for them.yahooChangePercentis Yahoo's own number, passed through unchanged.bars[]: oldest first.open,high,lowandcloseare adjusted for splits by Yahoo (NVIDIA's close on 2024-06-03, before its 10-for-1 split on 2024-06-10, comes back as115);adjCloseis also adjusted for dividends (daily and longer bars only).dateandlocalTimeare in the exchange's time zone,timeis UTC.isIncomplete:truefor 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 Toyota7203.Ton 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 andcloseFromQuoteistrue.- 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, ornot-requestedwhen price history is off or in monitoring mode (thenbars,dividends,splitsand the other history columns arenull).
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:
monitorStatus | When |
|---|---|
"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
status | Meaning |
|---|---|
symbol-not-found | Yahoo 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-returned | Yahoo answered for another symbol than the one asked for. |
refused-by-yahoo | Yahoo refused the request (HTTP 400 or 422); its message is in note. |
no-bars-returned | Yahoo 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-yahoo | Yahoo sent bars of a different interval than requested. |
no-search-match | Yahoo 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). |
blocked | Yahoo answered with a rate limit, an error page or nothing, even after retries. |
unreadable | Yahoo's answer could not be read. |
invalid-input | The entry is not a symbol, or the settings are not allowed; nothing was requested. |
row-too-large | The 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. |
duplicate | The same symbol appeared earlier in the list. |
no-change | Monitoring mode: no symbol moved by the threshold. |
not-checked | Entries or bars left out because of maxResults or the 1,000-entry limit. |
budget-reached | Entries 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 withstatus: "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 (freerow-too-largerow). - $0.50 per 1,000 bar rows (
outputFormat: "bar"), charged for each price bar, dividend and split row withstatus: "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
useProxyis 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).