Yahoo Finance Scraper - Quotes, History, Options, Financials
Pricing
from $0.60 / 1,000 data rows
Yahoo Finance Scraper - Quotes, History, Options, Financials
Yahoo Finance quotes, price history with dividends and splits, financial statements, key stats, analyst targets, options chains, news and ticker search. Stocks, ETFs, indices, crypto, FX, futures, Saudi and Gulf markets. Status per symbol; failed symbols are free.
Pricing
from $0.60 / 1,000 data rows
Rating
0.0
(0)
Developer
Dottti
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Yahoo Finance Scraper: Quotes, History, Options, Financials
Get Yahoo Finance data for any symbol in one run. You get quotes, price history, financial statements, key statistics, analyst targets, options chains, news headlines and ticker search. A watchlist mode tells you which prices moved since the last run.
It works for every kind of Yahoo symbol:
- US stocks and ETFs:
AAPL,MSFT,SPY,QQQ - Indices:
^GSPC(S&P 500),^DJI,^IXIC,^TASI.SR(Tadawul All Share) - Crypto:
BTC-USD,ETH-USD - Currencies:
EURUSD=X,USDSAR=X - Futures:
GC=F(gold),CL=F(crude oil) - Saudi Exchange:
2222.SR(Aramco),1120.SR(Al Rajhi),2010.SR(SABIC) - UAE:
EMAAR.AE,DIB.AE,EMIRATESNBD.AE - Qatar:
QNBK.QA,IQCD.QA - Any other exchange Yahoo covers, with its own suffix
You can also paste a Yahoo quote page URL, such as https://finance.yahoo.com/quote/2222.SR.
Who uses it
- Analysts who need statements and ratios for a list of companies in a spreadsheet.
- Traders doing research who want daily history, dividends and option chains for backtests.
- Fintech builders who need a daily price feed for an app or a dashboard.
- AI agents that look up a ticker, then read its price, fundamentals and latest headlines.
What you get
Every row has a type field. Every row with a price or an amount also has currency. Every row has exchangeTimezone, except search results and news.
| Mode | Row types | One row is |
|---|---|---|
| quotes | quote | One symbol: price, change, volume, market cap, 52-week range, P/E, EPS, dividend, bid/ask |
| history | bar, dividend, split | One bar (open, high, low, close, adjusted close, volume), one dividend, or one split |
| fundamentals | statement | One statement period: income, balance sheet or cash flow; annual, quarterly or trailing 12 months |
| fundamentals | keyStatistics | Valuation, margins, growth, debt, share counts, short interest, dividend dates |
| fundamentals | analyst, recommendationTrend | Price targets, consensus, buy/hold/sell counts for the last 4 months |
| fundamentals | earningsCalendar, earningsHistory | Next earnings date with estimates; last 4 quarters of EPS actual versus estimate |
| fundamentals | ratingChange | Optional: recent upgrades and downgrades by firm |
| options | option | One call or put contract: strike, expiry, bid/ask, volume, open interest, implied volatility |
| news | news | One headline with publisher, link, time and related tickers |
| search | searchResult | One matching symbol with exchange, type, sector and industry |
| watchlist | watch | A quote, plus the saved price, the move in percent and an alert flag |
Status per symbol
A bad symbol never stops the run. When a symbol returns nothing for a mode, you get one free status row:
{"type": "status", "symbol": "NOPE123XYZ", "mode": "quotes", "status": "not_found", "error": "Yahoo returned no quote for this symbol", "charged": false}
Status values:
not_found: Yahoo does not know the symbol.no_data: the symbol exists, but Yahoo has nothing for this mode. Example: options for2222.SR.blocked: Yahoo refused every retry and every proxy tier.bad_request: Yahoo rejected the request and says why. Example: 1-minute bars for a full year.skipped_cost_limitorcut_by_cost_limit: your maximum cost for the run was reached.
The RUN_SUMMARY record in the key-value store lists the status of every symbol and mode. It also lists the requests made, the bytes moved, the retries and the proxy tier used.
Examples from real runs (21 October 2026)
Quote for Saudi Aramco (fields shortened):
{"type": "quote", "symbol": "2222.SR", "name": "Saudi Arabian Oil Company","quoteType": "EQUITY", "exchange": "SAU", "exchangeName": "Saudi","currency": "SAR", "exchangeTimezone": "Asia/Riyadh", "marketState": "POSTPOST","price": 25.58, "change": 0.10000038, "changePercent": 0.3924662,"volume": 7499149, "marketCap": 6187991433216,"fiftyTwoWeekLow": 23.29, "fiftyTwoWeekHigh": 27.96,"trailingPE": 15.136094, "forwardPE": 15.317366,"dividendRate": 1.36, "dividendYieldPercent": 5.33,"earningsDate": "2026-11-03T12:00:00.000Z","quoteTime": "2026-10-21T12:19:48.000Z", "dataDelayMinutes": 15, "quoteSource": "Delayed Quote"}
Daily bar. date is the trading day at the exchange. timestamp is UTC:
{"type": "bar", "symbol": "2222.SR", "currency": "SAR", "exchange": "SAU", "exchangeTimezone": "Asia/Riyadh", "interval": "1d", "timestamp": "2025-10-21T07:00:00.000Z", "date": "2025-10-21", "open": 25.06, "high": 25.08, "low": 24.95, "close": 25.04, "adjClose": 23.79937, "volume": 7062839}
Dividend:
{"type": "dividend", "symbol": "AAPL", "currency": "USD", "exchangeTimezone": "America/New_York", "timestamp": "2025-11-10T14:30:00.000Z", "date": "2025-11-10", "amount": 0.26}
Income statement period (line items shortened). Values are in the reporting currency:
{"type": "statement", "symbol": "2222.SR", "statement": "income", "frequency": "annual", "periodEnd": "2025-12-31", "periodType": "12M", "currency": "SAR", "operatingRevenue": 1671204000000, "ebit": 713951000000, "netIncome": 348042000000, "dilutedEPS": 1.44}
Analyst targets:
{"type": "analyst", "symbol": "AAPL", "currency": "USD", "currentPrice": 339.5, "targetHighPrice": 405, "targetLowPrice": 215, "targetMeanPrice": 328.35025, "targetMedianPrice": 335, "recommendationMean": 2.25, "recommendationKey": "buy", "numberOfAnalystOpinions": 39, "strongBuy": 6, "buy": 18, "hold": 14, "sell": 3, "strongSell": 3}
Earnings calendar:
{"type": "earningsCalendar", "symbol": "2222.SR", "currency": "SAR", "earningsDate": ["2026-11-03"], "isEarningsDateEstimate": false, "epsEstimateAverage": 0.392, "epsEstimateLow": 0.35, "epsEstimateHigh": 0.434, "exDividendDate": "2026-08-20"}
Option contract:
{"type": "option", "symbol": "AAPL", "contractSymbol": "AAPL261021C00250000", "optionType": "call", "expiration": "2026-10-21", "strike": 250, "currency": "USD", "lastPrice": 90.22, "bid": 85.9, "ask": 90.85, "volume": 34, "openInterest": 23, "impliedVolatility": 3.68847734131, "inTheMoney": true, "underlyingPrice": 339.5, "exchangeTimezone": "America/New_York"}
News headline:
{"type": "news", "symbol": "AAPL", "title": "Apple vs. Broadcom: Which Tech Stock Is a Better Buy in 2026?", "publisher": "Motley Fool", "link": "https://finance.yahoo.com/markets/stocks/articles/apple-vs-broadcom-tech-stock-125202039.html", "publishedAt": "2026-10-21T12:52:02.000Z", "relatedTickers": ["AAPL", "AVGO"], "mentionsSymbol": true}
Search result for "aramco":
{"type": "searchResult", "query": "aramco", "rank": 1, "symbol": "2222.SR", "name": "Saudi Arabian Oil Company", "quoteType": "EQUITY", "exchange": "SAU", "exchangeDisplay": "Saudi Stock Exchange", "sector": "Energy", "industry": "Oil & Gas Integrated"}
How to read the numbers
- Values are copied from Yahoo. A value Yahoo does not have is
nullor left out. The actor never fills a gap. dividendYieldPercentin quote rows is a percent (5.33 means 5.33%).- Ratios in
keyStatisticsare fractions, as Yahoo sends them (0.0533 means 5.33%). currencyis the trading currency.financialCurrencyis the currency of the financial statements. They can differ for companies listed abroad.- History prices keep 7 significant digits. Yahoo stores them as 32-bit numbers, which hold about that much.
- Statements come from the same data as the Financials tab on Yahoo Finance. Line items a company does not report are left out.
- Yahoo does not publish option greeks. Implied volatility is included.
Input examples
Daily snapshot of quotes and one month of history (the default example):
{ "symbols": ["AAPL", "2222.SR", "BTC-USD"], "modes": ["quotes", "history"], "historyRange": "1mo", "historyInterval": "1d" }
Fundamentals for Gulf banks:
{ "symbols": ["1120.SR", "EMIRATESNBD.AE", "QNBK.QA"], "modes": ["fundamentals"], "statements": ["income", "balance"], "statementFrequencies": ["annual"] }
Weekly history for a fixed period:
{ "symbols": ["^GSPC", "^TASI.SR"], "modes": ["history"], "historyStartDate": "2020-01-01", "historyEndDate": "2020-12-31", "historyInterval": "1wk" }
Option chain, next 3 expiries, puts only, at most 500 contracts:
{ "symbols": ["SPY"], "modes": ["options"], "optionsExpirations": 3, "optionsType": "puts", "maxOptionContractsPerSymbol": 500 }
Find symbols first:
{ "modes": ["search"], "searchQueries": ["emaar", "qatar national bank"] }
Daily snapshots with a schedule
- Save your input as a task in Apify Console.
- Open Schedules and create a schedule for the task. Example: every weekday at 17:00 Asia/Riyadh, after the Saudi market closes.
- Connect the dataset to Google Sheets, a webhook or the API. Each run is a dated snapshot.
For price alerts, use the watchlist mode on a schedule:
{ "symbols": ["2222.SR", "1120.SR", "BTC-USD", "GC=F"], "modes": ["watchlist"], "watchlistThresholdPercent": 3, "watchlistOnlyChanged": true, "watchlistName": "my-alerts" }
- The first run outputs every symbol with
alert: "baseline"and saves its price. - Later runs output only symbols whose price moved more than the threshold. These rows have
alert: "moved_up"oralert: "moved_down". - The saved price updates only when an alert fires. Slow moves add up across runs until they cross the threshold.
- Prices are saved in the named key-value store
yahoo-finance-watchlist. Use a differentwatchlistNamefor each list.
Pricing
You pay per data row: $0.60 per 1,000 rows ($0.0006 per row).
- One quote, one bar, one statement period, one option contract or one headline is one row.
statusrows are free. Symbols that fail are never charged.- Set a maximum cost per run in Apify. The actor stops cleanly at that limit and marks the rest as
skipped_cost_limit.
Typical costs:
| Job | Rows | Cost |
|---|---|---|
| Quotes for 50 symbols | 50 | $0.03 |
| 1 year of daily bars for one symbol | about 250 | $0.15 |
| Full fundamentals for one company | about 40-55 | $0.024-0.033 |
| Nearest option expiry for AAPL | about 90 | $0.054 |
| 10 headlines | 10 | $0.006 |
To keep costs low, choose only the modes you need. Use maxBarsPerSymbol, maxOptionContractsPerSymbol and the statement filters.
Speed
Measured on a local machine, without a proxy, on 21 October 2026:
- The default example (3 symbols, quotes and 1 month of history) finished in 4-6 seconds.
- 52 symbols with quotes, 1 year of daily history and news: 13,505 rows in 28 seconds.
- 20 companies with full fundamentals: 1,063 rows in 23 seconds.
Reliability
- The actor calls the same JSON endpoints the Yahoo Finance website uses. It sets up the cookie and crumb the site needs.
- A stale crumb (HTTP 401) gets a new crumb, then a new session.
- Rate limits (HTTP 429 or 403) get growing waits and a fresh session.
- If Yahoo keeps refusing, the actor moves to Apify datacenter proxy, then residential proxy. You can turn residential off, or set your own proxy.
- Requests are spaced out. By default 3 symbols run in parallel.
Limits
- Data is delayed. Most exchanges are 15-20 minutes behind. Each quote row shows
dataDelayMinutesandquoteSource. - This data is for research. Do not use it for live trading or order decisions.
- Yahoo keeps 1-minute bars for about 8 days, 2-90 minute bars for about 60 days and hourly bars for about 2 years. Older requests return a
bad_requeststatus with Yahoo's message. - Yahoo has few or no English headlines for many Gulf symbols. Those return
no_datafor news. - Statements exist for companies only. Indices, currencies, crypto, futures and funds return key statistics only.
- Yahoo can change its endpoints at any time. A change can break a mode until the actor is updated.
- Respect Yahoo's terms of service. You are responsible for how you use and share the data.
Input reference
| Field | Default | What it does |
|---|---|---|
symbols | Yahoo symbols or quote URLs | |
modes | ["quotes"] | quotes, history, fundamentals, options, news, search, watchlist |
searchQueries | Words to search, for the search mode | |
historyRange | 1mo | 1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y, 10y, ytd, max |
historyInterval | 1d | 1m to 3mo |
historyStartDate, historyEndDate | YYYY-MM-DD, overrides the range | |
includeDividendsSplits | true | Adds dividend and split rows |
includePrePost | false | Pre- and after-market bars, intraday only |
maxBarsPerSymbol | 0 | 0 means no limit; keeps the latest bars |
statements | all three | income, balance, cashflow |
statementFrequencies | all three | annual, quarterly, trailing |
includeKeyStatistics, includeAnalyst, includeEarnings | true | Parts of the fundamentals mode |
maxRatingChanges | 0 | Recent upgrades and downgrades per symbol |
optionsExpirations | 1 | Expiries per symbol, nearest first; 0 means all |
optionsDates | Exact expiry dates, YYYY-MM-DD | |
optionsType | both | both, calls, puts |
maxOptionContractsPerSymbol | 0 | 0 means no limit |
newsPerSymbol | 10 | Up to 100 |
searchResultsPerQuery | 10 | Up to 25 |
watchlistThresholdPercent | 2 | Alert threshold |
watchlistOnlyChanged | true | Output only alerts |
watchlistName | default | Keeps separate saved prices per list |
proxyConfiguration | Your own proxy; turns off the automatic fallback | |
autoProxyFallback | true | No proxy first, then datacenter, then residential |
allowResidentialFallback | true | Allow the residential step |
maxConcurrency | 3 | Symbols in parallel, 1-8 |
maxRetries | 5 | Retries per request |