# Yahoo Finance Scraper & API – History, Options, Financials (`akhil_rajesh/yahoo-finance-scraper`) Actor

Yahoo Finance API alternative: stock quotes, historical prices, options chains with Greeks, financial statements, holders, insider trades, analyst ratings, earnings, SEC filings, news, screeners and symbol search, for stocks on 45 exchanges, ETFs, funds, indices, crypto, forex and futures.

- **URL**: https://apify.com/akhil_rajesh/yahoo-finance-scraper.md
- **Developed by:** [Akhil rajesh](https://apify.com/akhil_rajesh) (community)
- **Categories:** Business, Developer tools, MCP servers
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Yahoo Finance Scraper & API – History, Options, Financials

Get Yahoo Finance data for any list of tickers, company names or ISINs, as clean rows: live quotes and fundamentals, **historical stock prices** (any period and interval, back to the first trade), **options chains with Greeks**, **financial statements** (income statement, balance sheet, cash flow), **holders and insider trades**, **analyst ratings, earnings surprises and estimates**, **SEC filings**, news, Yahoo's screeners (day gainers and losers for the US, India, the UK, Japan and 17 more markets, trending tickers, crypto, ETFs) and a symbol search. It works like a **Yahoo Finance API**: send a list of tickers, get structured JSON, CSV or Excel back.

- **Any ticker, name or ISIN.** `AAPL`, `BRK.B`, `VOD.L`, `RELIANCE.NS`, `7203.T`, `BTC-USD`, `^GSPC`, `EURUSD=X`, `GC=F`, a name (`Reliance Industries`, `nestle`, `bmw`), an ISIN (`US0378331005`), or an Indian ticker without its suffix (`JIOFIN`, `TCS`). Each row says how its input was matched; an input Yahoo doesn't know gets a free "not found" row with Yahoo's suggestions, never an empty charged one.
- **Cheap long history.** Ten years of daily prices for 100 tickers costs about **$0.10** with one row per ticker (the whole series as lists), or one row per bar for spreadsheets.
- **Everything in one run**: price history, statements, options, holders, analysts, SEC filings and news per ticker, plus screeners and searches. Fundamentals, holders, analysts and filings come from one request per ticker.
- **Numbers you can trust**: real daily bars for "all available" history (Yahoo's own "max" gives quarterly bars), London prices in pence with per-share figures to match, ratios in one currency when a company reports in another, market caps for Indian listings Yahoo leaves without one. See [Why the numbers are right](#why-the-numbers-are-right).
- **Nothing dropped silently**: a request Yahoo throttles or doesn't answer is asked again, and anything still missing is named in the run's status message. A restarted run stores nothing twice.

#### What you get

Every row goes to one dataset with a `rowType`: filter on it (Apify's dataset views can't filter rows, so every view lists every row, with `rowType` first). Fields named `...Percent` are in percent (27.62 means 27.62%).

**`quote`**: one row per ticker. With *Include fundamentals* (on by default) it also carries the company profile and financial figures. A real row, shortened:

```json
{
  "rowType": "quote",
  "input": "AAPL",
  "matchedBy": "ticker",
  "symbol": "AAPL",
  "name": "Apple Inc.",
  "exchangeName": "NasdaqGS",
  "currency": "USD",
  "price": 345.8725,
  "changePercent": 1.1323,
  "marketCap": 5047725326336,
  "trailingPE": 39.664276,
  "dividendYieldPercent": 0.32,
  "sector": "Technology",
  "revenue": 466822987776,
  "profitMarginPercent": 27.619,
  "targetMeanPrice": 329.3759,
  "recommendation": "buy",
  "nextEarningsDate": "2026-11-02",
  "url": "https://finance.yahoo.com/quote/AAPL"
}
```

| Group | Fields |
|---|---|
| Quote | `price`, `change`, `changePercent`, `previousClose`, `open`, `dayLow`, `dayHigh`, `volume`, `averageVolume`, `marketCap`, `marketCapCurrency`, `fiftyTwoWeekLow/High`, `fiftyDayAverage`, `twoHundredDayAverage`, `bid`, `ask`, `preMarketPrice`, `postMarketPrice`, `marketState`, `quoteTime`, `delayMinutes` |
| Valuation and dividends | `trailingPE`, `forwardPE`, `epsTrailing`, `epsForward`, `bookValue`, `priceToBook`, `pegRatio`, `priceToSales`, `enterpriseValue`, `enterpriseToRevenue`, `enterpriseToEbitda`, `dividendRate`, `dividendYieldPercent`, `exDividendDate`, `payoutRatioPercent` |
| Company | `sector`, `industry`, `country`, `website`, `employees`, `description`, `officers` |
| Financials (TTM) | `revenue`, `revenueGrowthPercent`, `grossMarginPercent`, `operatingMarginPercent`, `profitMarginPercent`, `ebitda`, `netIncome`, `totalCash`, `totalDebt`, `debtToEquityPercent`, `freeCashflow`, `returnOnEquityPercent`, `financialCurrency` |
| Analysts | `targetMeanPrice` (and median, high, low), `recommendation`, `recommendationMean`, `analystCount`, `analystStrongBuy` ... `analystStrongSell`, `nextEarningsDate`, `epsEstimate`, `revenueEstimate` |
| Ownership | `insidersPercent`, `institutionsPercent`, `sharesShort`, `shortPercentOfFloat`, `floatShares`, `beta`; with holders on, insiders' 6 months: `insiderBuys6m`, `insiderSells6m`, `insiderSharesBought6m`, `insiderSharesSold6m`, `insiderNetShares6m`, and the shares insiders hold, `insiderSharesHeld` (empty when Yahoo sends its placeholder of zeros) |
| ETFs and funds | `fundFamily`, `fundCategory`, `expenseRatioPercent`, `fundTotalAssets`, `ytdReturnPercent`, `threeYearReturnPercent`, `topHoldings`, `sectorWeightsPercent` |
| Crypto | `circulatingSupply`, `maxSupply`, `volume24h` |

**`history`** (*Include price history*, one row per bar): newest first, with the dividend or split in that bar, and with pre-market and after-hours bars the `session` (pre, regular, post).

```json
{"rowType": "history", "symbol": "AAPL", "date": "2025-11-10", "interval": "1d", "open": 268.959991, "high": 273.730011,
 "low": 267.459991, "close": 269.429993, "adjClose": 268.698608, "volume": 41312400, "dividend": 0.26, "splitRatio": null}
```

**`historySeries`** (*Price history output: one row per ticker*): the whole series in one row, each column a list, oldest first, with the dividends and splits by date. Charged as one result, however many bars.

```json
{"rowType": "historySeries", "symbol": "AAPL", "interval": "1d", "currency": "USD", "firstDate": "2025-10-16",
 "lastDate": "2026-10-16", "barCount": 252, "dates": ["2025-10-16", "2025-10-17", "..."],
 "opens": [248.25, 248.020004], "highs": [249.039993, 253.380005], "lows": [245.130005, 247.270004],
 "closes": [247.449997, 252.289993], "adjCloses": [246.539291, 251.361481], "volumes": [39777000, 49147000],
 "dividends": [{"date": "2025-11-10", "amount": 0.26}, {"date": "2026-02-09", "amount": 0.26}], "splits": null}
```

Periods from 1 day to *All available* (every daily bar: Apple since December 1980), or your own start and end dates (only bars inside them are stored; the weekly, monthly or quarterly bar holding the start date is kept); intervals from 1 minute to 3 months. 1 day and 5 days are trading sessions: run on a Saturday, "1 day" is Friday's session. An end date alone ends the period, which counts back from it. Daily and longer bars are dated in the exchange's calendar, intraday bars in its local time with offset. Prices before a split are split-adjusted, as Yahoo gives them; `adjClose` is also adjusted for dividends. A series too big for one dataset item (9 MB) comes in parts (`part`, `parts`).

Series rows (and option chain rows, below) are made for JSON and the API. Apify's CSV and Excel exports hold at most 2,000 columns and spread each list over one column per item, so for spreadsheets choose one row per bar (or per contract).

**`financials`** (*Include financial statements*): one row per reported period, annual and/or quarterly (about 4 years and 5 quarters), with 61 lines of the income statement, balance sheet and cash flow, including the lines banks and insurers report.

```json
{"rowType": "financials", "symbol": "AAPL", "period": "annual", "periodEnd": "2025-09-30", "currency": "USD",
 "totalRevenue": 416161000000, "grossProfit": 195201000000, "operatingIncome": 133050000000, "netIncome": 112010000000,
 "dilutedEps": 7.46, "totalAssets": 359241000000, "totalDebt": 98657000000, "freeCashFlow": 98767000000}
```

**`option`** (*Include options chains*): one row per contract, with days to expiration and the Greeks.

```json
{"rowType": "option", "symbol": "SPY", "contractSymbol": "SPY261019C00763000", "optionType": "call",
 "expiration": "2026-10-19", "strike": 763.0, "lastPrice": 3.07, "bid": 3.05, "ask": 3.07, "volume": 39814,
 "openInterest": 199, "impliedVolatilityPercent": 10.6637, "inTheMoney": true, "underlyingPrice": 763.25,
 "daysToExpiration": 3, "greeksImpliedVolatilityPercent": 10.2563, "greeksVolatilitySource": "market",
 "delta": 0.527, "gamma": 0.056079, "theta": -0.5053, "vega": 0.2754, "rho": 0.0328, "greeksRatePercent": 4.07,
 "greeksDividendYieldPercent": 0.99}
```

- **Which contracts**: the nearest expiration, as many as you ask for, all of them (`optionExpirations: 0`), or the dates you list (a date with no expiration is named, with the nearest one). Filter by calls or puts, a strike range around the price (`optionStrikeRangePercent: 10` keeps 90% to 110%; decimals such as 2.5 work), a minimum volume (the latest session's, as Yahoo gives it) and open interest: filters apply before anything is stored or charged. With all expirations asked and a strike range, volume or open-interest filter, a ticker stops after 3 expirations in a row with nothing through, and the run says so; expirations you count or list are all read.
- **Greeks**: Black-Scholes-Merton with the 13-week US T-bill rate (`^IRX`, a discount rate, converted to a continuous one) and a carry, both on each row. For an expiration a week or more away the carry is what its own prices imply by put-call parity at the strikes nearest the price, so a strike's call and put solve to one volatility (SPY's December 2027 contracts imply 0.35% where its quoted yield is 0.99%, and an index has no yield on Yahoo); otherwise it is the underlying's dividend yield. The volatility is solved from the contract's bid-ask mid (or its last price, if it traded in the last 5 days) with that same rate and yield, and given as `greeksImpliedVolatilityPercent`; Yahoo's own `impliedVolatilityPercent` is solved without either, so the two differ, most for long-dated contracts. Theta is per calendar day, vega and rho per percentage point, time runs to 4 p.m. New York on the expiration day (9:30 for index contracts settled at the open, such as SPX, not SPXW). US stock options are American, so for deep in-the-money puts, or calls just before a dividend, they are approximations. An in-the-money contract quoted at its intrinsic value has no volatility of its own to solve: its Greeks use Yahoo's, and `greeksVolatilitySource` says which was used (`market` or `yahoo`). Empty for a contract with no price at all; if the T-bill rate doesn't load, every contract's Greeks are empty and the run names it.
- **`optionChain`** (*Options output: one row per expiration*): an expiration's calls and puts as lists, by strike, each with its Greeks, charged as one result. SPY's 31 expirations are 31 results.

**`holder`** and **`insiderTrade`** (*Include holders and insider trades*): Yahoo's 10 largest institutions, 10 largest funds and the insiders, and every insider transaction Yahoo lists.

```json
{"rowType": "holder", "symbol": "AAPL", "holderType": "institution", "holder": "Blackrock Inc.", "shares": 1162996939,
 "value": 399442918731, "valueCurrency": "USD", "percentHeld": 7.97, "percentChange": 1.6, "reportDate": "2026-06-30"}
{"rowType": "insiderTrade", "symbol": "AAPL", "insider": "NEWSTEAD JENNIFER", "relation": "General Counsel",
 "date": "2026-10-06", "transaction": "Sale at price 332.01 per share.", "transactionType": "Sale", "shares": 2399,
 "value": 796492, "pricePerShare": 332.01, "valueCurrency": "USD", "ownership": "direct"}
```

**`ratingChange`**, **`earnings`** and **`estimate`** (*Include analyst ratings, earnings and estimates*): the newest rating changes (25 by default; Yahoo has hundreds for large US companies), the last 4 reported quarters with their surprise, and the analysts' estimates for this and next quarter and year.

```json
{"rowType": "ratingChange", "symbol": "AAPL", "date": "2026-10-12", "firm": "JP Morgan", "action": "maintain",
 "fromGrade": "Overweight", "toGrade": "Overweight", "priceTargetAction": "Raises", "priceTarget": 360.0,
 "priorPriceTarget": 340.0, "priceTargetCurrency": "USD"}
{"rowType": "earnings", "symbol": "AAPL", "periodEnd": "2026-06-30", "fiscalQuarter": "3Q2026",
 "reportedDate": "2026-07-30", "epsActual": 2.02, "epsEstimate": 1.89243, "surprisePercent": 6.74, "currency": "USD"}
{"rowType": "estimate", "symbol": "AAPL", "period": "currentQuarter", "periodEnd": "2026-09-30", "epsEstimate": 1.97842,
 "epsLow": 1.93, "epsHigh": 2.07, "epsAnalysts": 27, "revenueEstimate": 113626875100, "revenueGrowthPercent": 10.89,
 "eps90DaysAgo": 2.01755, "revisionsUp30Days": 1, "revisionsDown30Days": 1, "epsCurrency": "USD",
 "revenueCurrency": "USD"}
```

- **Price targets' currency** (`priceTargetCurrency`): Yahoo keeps rating changes for US listings, and a listing that shares a company with one gets that list: Shopify's Toronto listing has Shopify's US list, with targets in dollars. A dollar listing's targets are in USD. Another listing's are in its own currency or in dollars, whichever its analysts' mean target says they are (converted at Yahoo's exchange rate); when that can't be told (currencies close to the dollar's value, such as the euro or the Swiss franc), the currency is left empty. Either case is named in the run's notes. Listings with no US twin (SAP.DE, 7203.T, VOD.L) have no rating changes on Yahoo.
- **Estimates' currencies** (`epsCurrency`, `revenueCurrency`): an ADR's EPS estimate is in dollars and its revenue estimate in the home currency (TSM: USD and TWD). A period no analyst covers isn't a row (nothing to charge).

**`filing`** (*Include SEC filings*): the newest filings of US-listed companies and ADRs, with Yahoo's page and the documents filed.

```json
{"rowType": "filing", "symbol": "AAPL", "date": "2026-07-31", "filingType": "10-Q", "title": "Periodic Financial Reports",
 "url": "https://finance.yahoo.com/sec-filing/AAPL/0000320193-26-000020_320193",
 "exhibits": [{"type": "10-Q", "url": "https://cdn.yahoofinance.com/prod/sec-filings/0000320193/000032019326000020/aapl-20260627.htm"}]}
```

**`news`** (*Include news*): the latest headlines tagged with each ticker: `title`, `publisher`, `link`, `publishedAt`, `relatedTickers`.

**`screener`** (*Screeners*): Yahoo's ranked lists, each row a quote with its `rank`:

- **Day gainers, day losers, most actives** for the US or another market (*Screener market*): India, UK, Canada, Australia, Germany, France, Italy, Spain, Netherlands, Switzerland, Sweden, Hong Kong, Japan, South Korea, Taiwan, Singapore, Brazil, Mexico, South Africa, Saudi Arabia. They use Yahoo's own criteria for its US lists: gainers up over 3%, losers down over 2.5%, a market cap from $2 billion (and in the US a price from $5). Outside the US the market cap floor is converted at Yahoo's exchange rate (into pence and cents for London and Johannesburg, as Yahoo compares them); the $5 price floor and the most actives' 5-million-share minimum are US figures and are left out (in rupees or yen the price floor dropped large companies with low share prices, such as Wipro). Each list holds the market's own companies: India's are the NSE's; London's leave out Cboe UK lines (`.XC`) and the International Order Book's foreign shares; Germany's leave out Frankfurt's and Xetra's lines of foreign companies (Netflix, Moderna). Rows are ranked by the change or volume they show. A stock whose latest quote is over 36 hours older than the list's newest (a price that hasn't caught up with a split or consolidation) is left out and named in the status message.
- **Trending tickers** (US), **most watched**, **52-week gainers and losers**, **most active ETFs**, **top ETFs**, **top performing ETFs**, **cryptocurrencies by market cap**, **crypto gainers, losers and most active**, plus undervalued growth stocks, growth technology stocks, undervalued large caps, aggressive small caps, small cap gainers, most shorted stocks and Yahoo's fund lists.

```json
{"rowType": "screener", "screener": "day_gainers", "screenerTitle": "Day gainers (India)", "screenerRegion": "IN",
 "rank": 1, "symbol": "HBLENGINE.NS", "name": "HBL Engineering Limited", "price": 833.15, "changePercent": 17.2707,
 "currency": "INR", "marketCap": 230944980992, "exchangeName": "NSE"}
```

**`searchResult`** (*Symbol search*): tickers found by a word, such as `lithium`, `semiconductor` or `vanguard`, optionally only stocks, ETFs, funds, indices, futures, currencies or crypto, in Yahoo's order. The price, its currency and the day's change come from each symbol's quote (Yahoo's lookup gives a price without its currency: 16.11 for VOD in dollars, 122.05 for VOD.L in pence).

```json
{"rowType": "searchResult", "query": "lithium", "searchType": "equity", "rank": 1, "symbol": "LAC",
 "name": "Lithium Americas Corp.", "exchange": "NYQ", "quoteType": "EQUITY", "sector": "Basic Materials",
 "price": 2.18, "currency": "USD", "changePercent": -2.6786}
```

**`notFound`**: an input with no data, never charged: `input`, `reason` (with what to try) and `suggestions` (Yahoo's first results for it).

#### Markets

Yahoo writes non-US listings with a suffix. Some examples:

| Market | Suffix | Example |
|---|---|---|
| United States (Nasdaq, NYSE, OTC) | none | `AAPL`, `BRK.B` |
| Canada (TSX, TSX Venture) | `.TO`, `.V` | `RY.TO`, `FWZ.V` |
| United Kingdom | `.L` | `VOD.L` (prices in pence: currency `GBp`) |
| Germany, France, Netherlands | `.DE`, `.PA`, `.AS` | `SAP.DE`, `MC.PA`, `ASML.AS` |
| Spain, Italy, Switzerland | `.MC`, `.MI`, `.SW` | `SAN.MC`, `ENI.MI`, `NESN.SW` |
| Nordics | `.ST`, `.OL`, `.CO`, `.HE` | `VOLV-B.ST`, `EQNR.OL`, `NOVO-B.CO` |
| India (NSE, BSE) | `.NS`, `.BO` | `RELIANCE.NS`, `RELIANCE.BO`, or just `RELIANCE`, `JIOFIN`, `TCS` |
| Japan, Hong Kong | `.T`, `.HK` | `7203.T`, `0700.HK` |
| China (Shanghai, Shenzhen) | `.SS`, `.SZ` | `600519.SS`, `000001.SZ` |
| Korea, Taiwan, Singapore | `.KS`/`.KQ`, `.TW`, `.SI` | `005930.KS`, `2330.TW`, `D05.SI` |
| Australia, New Zealand | `.AX`, `.NZ` | `BHP.AX`, `FPH.NZ` |
| Brazil, Mexico | `.SA`, `.MX` | `PETR4.SA`, `WALMEX.MX` |
| South Africa, Israel, Saudi Arabia, Kuwait | `.JO`, `.TA`, `.SR`, `.KW` | `NPN.JO`, `TEVA.TA`, `2222.SR`, `NBK.KW` |
| Indices | `^` | `^GSPC`, `^DJI`, `^FTSE`, `^N225`, `^NSEI` |
| Crypto, currencies, futures | `-USD`, `=X`, `=F` | `BTC-USD`, `EURUSD=X`, `GC=F` |

Also Austria, Belgium, Ireland, Poland, Portugal, Turkey, Indonesia, Malaysia, Thailand, Argentina, Chile, Qatar and more. Not sure of a symbol? Type the company's name or its ISIN, use *Symbol search*, or type an exchange code alone (`7203` is read as Yahoo's first listing under it, Toyota's `7203.T`).

#### How to use it

1. Enter tickers, company names or ISINs, one per line, or pick screeners or search words.
2. Switch on what you need: fundamentals (on by default), holders and insider trades, analysts, SEC filings, price history, financial statements, news, options.
3. Run it and download the rows as JSON, CSV or Excel, or read them through the API.

Ten years of daily prices for three indices, one row each, with their quotes:

```json
{"tickers": ["^GSPC", "^IXIC", "^DJI"], "includeHistory": true, "historyRange": "10y", "historyFormat": "series"}
```

SPY's calls within 5% of the price for the next 3 expirations, liquid ones only, with Greeks:

```json
{"tickers": ["SPY"], "includeFundamentals": false, "includeOptions": true, "optionExpirations": 3,
 "optionType": "calls", "optionStrikeRangePercent": 5, "optionMinOpenInterest": 100}
```

Who owns Nvidia, what insiders did, what analysts say:

```json
{"tickers": ["NVDA"], "includeOwnership": true, "includeAnalysis": true, "ratingChangesPerTicker": 50}
```

India's top 50 gainers today, and tickers to do with lithium:

```json
{"screeners": ["day_gainers"], "screenerRegion": "IN", "screenerResults": 50, "searchQueries": ["lithium"]}
```

From Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("akhil_rajesh/yahoo-finance-scraper").call(run_input={"tickers": ["AAPL", "NVDA"]})
for row in client.dataset(run.default_dataset_id).iterate_items():  # apify-client 3.x
    if row["rowType"] == "quote":
        print(row["symbol"], row.get("price"), row.get("marketCap"))
```

The run's status message says what was stored, what wasn't found and what Yahoo didn't answer, with its first notes (how names were matched, tickers with no options or filings...). The `RUN_SUMMARY` record has all of it, every note in full.

#### For AI agents: MCP server and real-time API

The Actor also runs as a **live endpoint** (Apify Standby): an **MCP server** that agents call directly, and plain HTTP endpoints. Requests are answered in a second or two once a Standby run is up (the first one starts it, in a few seconds). Authenticate with your Apify API token in the `Authorization: Bearer <token>` header.

**MCP server** (Streamable HTTP): `https://akhil-rajesh--yahoo-finance-scraper.apify.actor/mcp`

```json
{"mcpServers": {"yahoo-finance": {"url": "https://akhil-rajesh--yahoo-finance-scraper.apify.actor/mcp",
  "headers": {"Authorization": "Bearer <YOUR_APIFY_TOKEN>"}}}}
```

| Tool | What it returns |
|---|---|
| `get_quotes` | Live quotes with fundamentals: price, change, market cap, P/E, dividend yield, sector, margins, analysts' target |
| `get_price_history` | Historical prices, one row per ticker with the bars as lists (any period from 1 day to all, any interval) |
| `get_options_chain` | US options with Greeks, one row per expiration, filtered by type, strike range, volume, open interest |
| `get_financial_statements` | Income statement, balance sheet and cash flow, annual or quarterly |
| `get_analyst_data` | Rating changes with price targets, earnings against estimates, EPS and revenue estimates |
| `get_ownership` | Largest institutional and fund holders, insiders and their transactions |
| `get_news` | Latest headlines per ticker |
| `get_sec_filings` | Newest SEC filings of US listings and ADRs |
| `get_market_movers` | Day gainers, losers and most actives (US and 20 other markets), trending tickers, ETFs, crypto |
| `search_symbols` | Tickers matching a word, with prices |

**HTTP endpoints**: `GET https://akhil-rajesh--yahoo-finance-scraper.apify.actor/quote?tickers=AAPL,MSFT`, and the same way `/history`, `/options`, `/financials`, `/analysts`, `/ownership`, `/news`, `/filings`, `/movers` and `/search`, or `POST /run` with the Actor's whole input as the body. The Console's Standby tab lists every parameter and lets you try them. Each answer has the rows, `notFound` (free), `notLoaded` (what Yahoo didn't answer) and notes; a request Yahoo doesn't answer at all gets HTTP 503, with nothing charged.

**Cost**: rows are charged as in a run (the prices below). As with any Standby Actor, the Standby run's platform usage is billed to you while it serves you and until its idle timeout ends it.

- **Apify MCP server**: add `https://mcp.apify.com` to Claude, ChatGPT, Cursor or any MCP client, and the agent can call this Actor as a tool: "get Apple's quote and analyst targets", "SPY options expiring Friday with delta", "India's top gainers today".
- **Compact rows** (`compactOutput: true`) keep a quote's 35 main fields instead of about 140, and a screener row's 31: fewer tokens for the model. Other row types are already short.
- **One HTTP call, rows back**: `POST https://api.apify.com/v2/acts/akhil_rajesh~yahoo-finance-scraper/run-sync-get-dataset-items?token=<TOKEN>` with the input as the body returns the rows when the run ends (runs of a few tickers take about 3 to 5 seconds).
- **Common slips are read the way they were meant**, and each one is named in the run's notes:
  - `symbols`, `symbol`, `ticker`, `stocks`, `stock`, `companies` or `company` are read as `tickers`, as a list or a text (split on commas and new lines); `query`, `queries`, `search` or `keywords` as `searchQueries` (as tickers, if they hold only tickers). An entry of `tickers` with commas (`["AAPL, MSFT"]`) is split too.
  - `NASDAQ:AAPL`, `NSE:RELIANCE`, `HKG:700`, `LON:VOD`, `AAPL.US`, `EURUSD`, `BTCUSD` and `SPX` are read as Yahoo's `AAPL`, `RELIANCE.NS`, `0700.HK`, `VOD.L`, `AAPL`, `EURUSD=X`, `BTC-USD` and `^SPX`.
  - An option changed without its switch turns the switch on (`"optionType": "calls"` alone means options are wanted, `"historyRange": "5y"` price history); an option changed while its switch is off is named as not used.
- **Wrong values cost nothing**: Apify checks each field against the input schema before the run starts. A choice that isn't one of the listed values, a number out of range or a text where a list belongs gets HTTP 400 naming the field and what it takes (`Field input.optionType must be equal to one of the allowed values: "both", "calls", "puts"`).

#### Input reference

Every field is optional; an input that names nothing reads AAPL, MSFT and NVDA.

| Field | Type | Default | Values |
|---|---|---|---|
| `tickers` | list of strings | none | Tickers, company names or ISINs, up to 1,000. Also read from `symbols`, `symbol`, `ticker`, `stocks`, `stock`, `companies` or `company` (a list or a text). An entry with commas or new lines is split. |
| `includeFundamentals` | boolean | `true` | Company profile, financial figures, analysts' targets, holdings, fund data |
| `includeOwnership` | boolean | `false` | Holder and insider trade rows, insiders' 6 months on the quote |
| `includeAnalysis` | boolean | `false` | Rating change, earnings and estimate rows |
| `ratingChangesPerTicker` | integer | `25` | 1 to 1,000, newest first |
| `includeSecFilings` | boolean | `false` | SEC filing rows (US listings and ADRs) |
| `secFilingsPerTicker` | integer | `20` | 1 to 250, newest first |
| `includeHistory` | boolean | `false` | Price history |
| `historyRange` | string | `1mo` | `1d`, `5d`, `1mo`, `3mo`, `6mo`, `ytd`, `1y`, `2y`, `5y`, `10y`, `max` |
| `historyInterval` | string | `1d` | `1m`, `2m`, `5m`, `15m`, `30m`, `60m`, `90m`, `1h`, `1d`, `5d`, `1wk`, `1mo`, `3mo` |
| `historyStartDate`, `historyEndDate` | string | none | `YYYY-MM-DD`; a start date replaces `historyRange`, an end date alone ends it |
| `historyFormat` | string | `rows` | `rows` (one per bar, data points), `series` (one per ticker, one result) |
| `includePrePost` | boolean | `false` | Pre-market and after-hours bars, with an intraday interval |
| `includeFinancials` | boolean | `false` | Statement rows |
| `financialsPeriod` | string | `annual` | `annual`, `quarterly`, `both` |
| `includeNews` | boolean | `false` | News rows |
| `newsPerTicker` | integer | `10` | 1 to 40 |
| `includeOptions` | boolean | `false` | Option rows (US listings) |
| `optionExpirations` | integer | `1` | 0 (all) to 100, nearest first |
| `optionExpirationDates` | list of strings | none | `YYYY-MM-DD`, instead of the nearest ones |
| `optionType` | string | `both` | `both`, `calls`, `puts` |
| `optionStrikeRangePercent` | number | `0` | Strikes within this % of the price (2.5 works); 0 keeps all |
| `optionMinVolume`, `optionMinOpenInterest` | integer | `0` | Minimums (volume is the latest session's); 0 keeps all |
| `includeGreeks` | boolean | `true` | Delta, gamma, theta, vega, rho |
| `optionsFormat` | string | `rows` | `rows` (one per contract, data points), `chain` (one per expiration, one result) |
| `screeners` | list of strings | none | `day_gainers`, `day_losers`, `most_actives`, `trending_tickers`, `most_watched_tickers`, `fifty_two_wk_gainers`, `fifty_two_wk_losers`, `most_actives_etfs`, `top_etfs_us`, `top_performing_etfs`, `all_cryptocurrencies_us`, `day_gainers_cryptocurrencies`, `day_losers_cryptocurrencies`, `most_actives_cryptocurrencies`, `undervalued_growth_stocks`, `growth_technology_stocks`, `undervalued_large_caps`, `aggressive_small_caps`, `small_cap_gainers`, `most_shorted_stocks`, `top_mutual_funds`, `portfolio_anchors`, `solid_large_growth_funds`, `solid_midcap_growth_funds`, `conservative_foreign_funds`, `high_yield_bond` |
| `screenerRegion` | string | `US` | `US`, `IN` (NSE), `GB`, `CA`, `AU`, `DE`, `FR`, `IT`, `ES`, `NL`, `CH`, `SE`, `HK`, `JP`, `KR`, `TW`, `SG`, `BR`, `MX`, `ZA`, `SA` (day gainers, losers, most actives) |
| `screenerResults` | integer | `25` | 1 to 1,000 per screener (trending up to 100) |
| `searchQueries` | list of strings | none | Words to find tickers by, up to 50 |
| `searchType` | string | `all` | `all`, `equity`, `etf`, `mutualfund`, `index`, `future`, `currency`, `cryptocurrency` |
| `searchResults` | integer | `25` | 1 to 1,000 per search |
| `compactOutput` | boolean | `false` | Main fields only on quote (35) and screener (31) rows |
| `proxy` | object | none | Not needed. Apify's datacenter proxy or your own; residential proxies are refused. |

An unknown field with nothing to read fails the run naming the field, so a misspelt `tickrs` doesn't quietly read the defaults.

#### How names are matched

- **A ticker** in capitals, or with a suffix or a sign (`AAPL`, `BRK.B`, `vod.l`, `^gspc`, `btc-usd`), is looked up as a ticker only. `BRK.B`, `BRK B` and `BRK/B` are Berkshire's class B shares (`BRK-B`). A word in capitals is never read as a name, so a delisted `EQR` comes back "not found", not as EQ Resources (`EQR.AX`).
- **An ISIN** whose check digit adds up (`US0378331005`, `INE002A01018`) is the listing Yahoo's search gives for it (`AAPL`, `RELIANCE.NS`).
- **An Indian ticker without its suffix** (`JIOFIN`, `TCS`, `LT`, `M&M`, `BAJAJ-AUTO`) is read on the NSE, then the BSE, when Yahoo has no US ticker by that name. A US listing wins: `INFY` is Infosys's US ADR, `INFY.NS` its NSE listing. Other exchanges need their suffix (`BMW.DE`, `BARC.L`).
- **A name** in lower or mixed case is looked up on Yahoo's search. A company fits when its name holds every word you typed, accents aside (`nestle` is Nestlé); the closest name wins (`siemens` is Siemens AG, not Siemens Energy), and initials count (`bmw`). A fund, index or coin fits only by its whole name (`bitcoin` is `BTC-USD`). A word that is a ticker as well is a name first (`hp` is HP Inc.), then a ticker.
- **A brand** Yahoo itself ranks with high confidence is its company (`google` is `GOOG`), and **an exchange code** is Yahoo's first company listed under it (`7203` is `7203.T`).
- **Other sites' forms**: an exchange prefix (`NASDAQ:AAPL`, `NYSE:KO`, `NSE:RELIANCE`, `BSE:500325`, `HKG:700`, `LON:VOD`; `TSE:` with a code in digits is Tokyo, with letters Toronto), a TradingView watchlist line (`NASDAQ:AAPL,NYSE:KO`), a `.US` suffix, a currency or crypto pair without Yahoo's signs (`EURUSD`, `BTCUSD`, `SOLUSDT`) and index names without the caret (`SPX`, `NDX`, `DJI`, `VIX`; `DJT` stays Trump Media's stock) are read as Yahoo's symbols, and named in the notes.
- **Names in capitals**: `AAPL MSFT NVDA` is three tickers, but a text whose words mostly aren't tickers (`WELLS FARGO BANK`) is looked up as one name. After 100 names in a run found nothing on Yahoo, the rest aren't looked up (each costs a request, and their rows are free): they are named in the notes.

`matchedBy` says which applied: `ticker`, `isin`, `name` or `search`; ISIN and `search` matches are also named in the status message.

#### Why the numbers are right

- **Full daily history.** Asked for its maximum range, Yahoo answers in quarterly bars (169 for Apple). This Actor asks by date, which gives every daily bar (11,554 for Apple since 1980).
- **Prices are in the listing's currency, as Yahoo gives it**: London in pence (`GBp`), Johannesburg in cents (`ZAc`), Tel Aviv in agorot (`ILA`), Kuwait in fils (`KWF`). Yahoo gives such a listing's EPS, book value and dividend rate in pounds (Shell's EPS 3.38 next to a price of 3,938p); the rows have them in pence (338), so price over EPS is the P/E. The market cap and holding values are in the major unit (`marketCapCurrency`, `valueCurrency`).
- **Company financials are in `financialCurrency`.** When it differs from the price's currency (TSM reports in TWD, VOD.L in EUR), Yahoo divides one currency by the other (TSM's price to sales of 0.48); the rows work them out again with Yahoo's own exchange rate (about 15), and leave an enterprise value empty when it isn't market cap plus net debt in one currency.
- **ADRs** (TSM, BABA): Yahoo's book value, P/B, EPS estimate, revenue per share and float are per ordinary share or in mixed currencies, so they are left empty.
- **Indian listings without a market cap**: Yahoo sends a few NSE or BSE listings without a market cap or share count (Reliance and TCS on the NSE in October 2026). Their rows get both from the share count of the same company's other listing, at the listing's own price.
- **Yahoo's slips put right**: a pence, cents, agorot or fils listing's `adjClose` is rebuilt from its dividends (Yahoo adjusts those 100 or 1,000 times too little); Tokyo's and Hong Kong's bar for today gets the latest price when Yahoo leaves it without a close; a past "next" earnings date is left empty; Yahoo's 0.00001 implied volatility (none) is left empty (the Greeks use the volatility solved from the contract's own price); a price target of 0 (none given) is empty; Berkshire's Class A figures on BRK-B are left empty.
- **Insider trades outside the US**: Yahoo doesn't say which currency their values are in (Reliance's trades read 15.69 a share for a 1,211-rupee stock), so `valueCurrency` is empty for them. Some non-US filer names come from Yahoo with their accents already replaced by `?`-like marks.

#### How much does it cost?

You pay **$0.50 per 1,000 results** and **$0.10 per 1,000 data points**, plus a start fee of $0.00005 per run (per GB of memory, at least one; runs use 256 MB by default). **Platform usage is included** in runs: no compute charge on top. The live endpoint is the exception: there you also pay the Standby run's platform usage (see [For AI agents](#for-ai-agents-mcp-server-and-real-time-api)). "Not found" rows are free.

- **A result** is a row of its own: a quote, statement, news item, holder, insider trade, rating change, earnings quarter, estimate, SEC filing, screener or search row, a whole price series (`historyFormat: series`) or a whole option expiration (`optionsFormat: chain`).
- **A data point** is one of many: a price bar or an option contract, each as its own row.

| Apify plan | Per 1,000 results | Per 1,000 data points |
|---|---|---|
| Free and Starter | $0.50 | $0.10 |
| Scale | $0.45 | $0.10 |
| Business and above | $0.40 | $0.10 |

| Run (Free and Starter plans) | Charged | Cost |
|---|---|---|
| Quotes with fundamentals for 3 tickers (the default input) | 3 results | $0.0015 |
| 100 tickers with fundamentals | 100 results | $0.05 |
| 10 years of daily prices for 100 tickers, one row per ticker | 100 quotes + 100 series | $0.10 |
| The same, one row per bar | 100 quotes + about 251,500 bars | $25.20 |
| Apple's daily prices since 1980, one row | 1 quote + 1 series | $0.001 |
| 7 days of 1-minute bars for one stock, one row per bar | about 1,950 data points | $0.20 |
| SPY's whole options chain (31 expirations), one row per expiration | 1 quote + 31 expirations | $0.016 |
| SPY's nearest expiration, one row per contract | 1 quote + about 270 data points | $0.028 |
| One company's 30 holders, insider trades, 25 rating changes, earnings and estimates | about 150 results | $0.075 |
| India's 50 top gainers | 50 results | $0.025 |

To cap spending, set a maximum cost per run in the run options: the Actor stops cleanly at the limit, keeps the newest price bars of the ticker it was storing, and names the tickers it didn't read or read in part.

A run stopped by its timeout says so and names what it didn't read: resurrect it (Console: the run's Resurrect button, or the API) to read the rest, as a resurrected run skips what it stored and charges nothing twice; a new run starts over. A run that read nothing before the timeout fails, and nothing is charged.

#### Good to know

- **Prices are as Yahoo shows them**: real time for some US data, delayed up to 20 minutes for most exchanges (`delayMinutes` says how much). This is market data, not a trading feed.
- **Intraday bars are kept for a limited time** by Yahoo: 1-minute bars for the last 29 days (Yahoo refuses a window reaching back 30; read a week at a time, as Yahoo serves them), 2- to 90-minute bars for 60 days, hourly bars for 2 years. A longer period is cut to that and the run says so.
- **Options are listed for US stocks, ETFs and indices** only. Index options are under their own symbols: the S\&P 500's under `^SPX` (not `^GSPC`), the Nasdaq-100's under `^NDX`, the Dow's under `^DJX`.
- **Holders, insider trades and analyst data** are fullest for US companies; SEC filings exist only for US listings and ADRs. Yahoo no longer serves ESG scores.
- **Trending tickers** are Yahoo's US list; other regions' trending lists hold 0 to 2 tickers on Yahoo.
- **News is best for US companies.** For other listings and crypto the Actor also searches by the company's name and keeps headlines tagged with the company's other listings (HDFC Bank's news is tagged with its US listing HDB). Yahoo has no news at all for many Indian companies; a ticker with none is named in the status message.
- **Funds, indices, crypto and currencies** have quotes and history but no company fundamentals, holders or statements.
- This Actor isn't affiliated with Yahoo. Use the data in line with Yahoo's terms.

#### FAQ

**Is there a Yahoo Finance API?** Yahoo closed its official finance API in 2017. This Actor reads the data Yahoo Finance's own pages use and returns it as structured rows, so it can stand in for one: call it from the API, a schedule, Make, Zapier, n8n or an AI agent.

**How do I download historical stock prices?** Switch on *Include price history*, choose a period (or *All available*, or start and end dates) and an interval. For many tickers or long periods choose *One row per ticker*: the whole series in one row, charged as one result.

**How do I get an options chain with Greeks?** Switch on *Include options chains*, set the expirations (0 for all, or list dates), and filter by calls or puts, strike range, volume and open interest. Greeks are on by default. *One row per expiration* gives each expiration's whole chain as one result.

**Can I get income statements and balance sheets?** Yes: *Include financial statements* gives a row per year or quarter with 61 lines across the income statement, balance sheet and cash flow.

**Who owns a stock, and what are insiders doing?** *Include holders and insider trades* lists the largest institutions and funds with their stakes and changes, the insiders, and every insider transaction Yahoo has.

**Can I get top gainers for India or the UK?** Yes: pick *Day gainers*, *Day losers* or *Most actives* and set *Screener market*.

**Can I look up a company without knowing its ticker?** Type its name (`Toyota Motor`, `nestle`) or ISIN, or use *Symbol search* with a word (`lithium`) to list matching tickers.

**How many tickers per run?** Up to 1,000. On Apify, 300 tickers with fundamentals took 70 seconds.

# Changelog

This Actor's version history is a separate document: https://apify.com/akhil_rajesh/yahoo-finance-scraper/changelog.md

# Actor input Schema

## `tickers` (type: `array`):

Yahoo Finance tickers, company names or ISINs, one per line (up to 1,000): stocks (AAPL, BRK.B), other exchanges with Yahoo's suffix (VOD.L London, SAP.DE Xetra, RELIANCE.NS India, 7203.T Tokyo, SHOP.TO Toronto), ETFs and funds (SPY, VFIAX), indices (^GSPC, ^FTSE), crypto (BTC-USD), currencies (EURUSD=X) and futures (GC=F). A company name in lower or mixed case ('Reliance Industries', 'nestle') is looked up on Yahoo's search, and an ISIN (US0378331005) gives its listing; a word in capitals is read as a ticker. An Indian ticker without its suffix (JIOFIN, TCS) is read on the NSE, then the BSE, when Yahoo has no US ticker of that name. An exchange code alone (7203) is Yahoo's first listing under it. An input Yahoo doesn't know, or lists without data, gets a free 'not found' row with Yahoo's suggestions.

## `includeFundamentals` (type: `boolean`):

Add each ticker's company profile (sector, industry, employees, description, officers), margins, revenue, cash and debt, valuation ratios, analyst price targets and ratings, next earnings date, insider and institution holdings, and for ETFs and funds their family, category, fees, assets, top holdings and sector weights.

## `includeOwnership` (type: `boolean`):

Add a row per top holder (Yahoo's 10 largest institutions, 10 largest funds and the insiders: shares, value, % held, % change, date reported) and per insider transaction (who, role, date, sale, purchase or gift, shares, value), plus insiders' buying and selling over 6 months on the quote row. Mostly US-listed companies.

## `includeAnalysis` (type: `boolean`):

Add a row per analyst rating change (firm, upgrade, downgrade or maintain, grades, price target and the one before), per reported quarter (EPS against the estimate, surprise %, report date) and per estimate period (this and next quarter and year: EPS and revenue estimates, analysts, growth, EPS trend over 90 days, revisions up and down). Off unless switched on; an API call that changes one of its options (such as ratingChangesPerTicker) without it switches it on.

## `ratingChangesPerTicker` (type: `integer`):

The newest analyst rating changes to read per ticker (up to 1,000; Yahoo has hundreds for large US companies).

## `includeSecFilings` (type: `boolean`):

Add a row per SEC filing (10-K, 10-Q, 8-K, proxy ...): date, type, title, Yahoo's page for it and the documents filed. US-listed companies and ADRs. Off unless switched on; an API call that changes one of its options (such as secFilingsPerTicker) without it switches it on.

## `secFilingsPerTicker` (type: `integer`):

The newest filings to read per ticker (up to 250).

## `includeHistory` (type: `boolean`):

Add the price history: date, open, high, low, close, adjusted close, volume, and the dividends and splits. Off unless switched on; an API call that changes one of its options (such as historyRange) without it switches it on.

## `historyRange` (type: `string`):

How far back the history goes. 'All available' reads every daily bar Yahoo has (AAPL since 1980), not the quarterly bars Yahoo's own 'max' gives. Start and end dates, when set, are used instead.

## `historyInterval` (type: `string`):

One bar per interval. Yahoo keeps intraday bars only for a while: 1 minute for the last 7 days, 2 to 90 minutes for 60 days, hourly for 2 years; a longer period is cut to that, and the run says so.

## `historyStartDate` (type: `string`):

Optional: the first day of the history (YYYY-MM-DD), instead of the period.

## `historyEndDate` (type: `string`):

Optional: the last day of the history (YYYY-MM-DD). Today when left empty; without a start date the period counts back from it.

## `historyFormat` (type: `string`):

One row per bar (good for spreadsheets; each bar is a data point), or one row per ticker holding the whole series as lists, oldest first (charged as one result: 10 years of daily bars for 100 tickers costs about the same as 100 quotes).

## `includePrePost` (type: `boolean`):

With an intraday interval, add the pre-market and after-hours bars; each bar says its session (pre, regular or post).

## `includeFinancials` (type: `boolean`):

Add a row per reported period with its income statement, balance sheet and cash flow: revenue, gross profit, operating income, net income, EBITDA, EPS, assets, liabilities, equity, cash, debt, operating and free cash flow, buybacks, dividends paid (about 4 years and 5 quarters). Companies only. Off unless switched on; an API call that changes one of its options (such as financialsPeriod) without it switches it on.

## `financialsPeriod` (type: `string`):

Annual, quarterly or both.

## `includeNews` (type: `boolean`):

Add Yahoo Finance's latest headlines tagged with each ticker: title, publisher, link, time, and the other tickers it names. Coverage is best for US companies. Off unless switched on; an API call that changes one of its options (such as newsPerTicker) without it switches it on.

## `newsPerTicker` (type: `integer`):

Headlines per ticker, newest first (up to 40).

## `includeOptions` (type: `boolean`):

Add the option contracts: call or put, expiration, strike, last price, bid, ask, volume, open interest, implied volatility, in the money, days to expiration and the Greeks. Yahoo lists options for US stocks, ETFs and indices. Off unless switched on; an API call that changes one of its options (such as optionExpirations) without it switches it on.

## `optionExpirations` (type: `integer`):

How many expiration dates to read, nearest first; 0 reads all of them (up to 100).

## `optionExpirationDates` (type: `array`):

Optional: read these expirations (YYYY-MM-DD) instead of the nearest ones. A date with no expiration is named in the status message with the nearest one.

## `optionType` (type: `string`):

Both, or only calls or only puts.

## `optionStrikeRangePercent` (type: `number`):

Only strikes within this percentage of the underlying's price (10 keeps strikes from 90% to 110% of it; 2.5 is allowed); 0 keeps every strike.

## `optionMinVolume` (type: `integer`):

Only contracts traded at least this many times today; 0 keeps all.

## `optionMinOpenInterest` (type: `integer`):

Only contracts with at least this open interest; 0 keeps all. Filters apply before anything is stored or charged.

## `includeGreeks` (type: `boolean`):

Delta, gamma, theta (per day), vega and rho (per percentage point) by the Black-Scholes-Merton model, with the 13-week T-bill rate, a carry (implied by put-call parity for an expiration a week or more away, else the dividend yield) and the volatility solved from each contract's price with them. Empty for a contract with no price.

## `optionsFormat` (type: `string`):

One row per contract (each a data point), or one row per expiration with its calls and puts as lists (charged as one result).

## `screeners` (type: `array`):

Yahoo Finance's ranked lists, read as rows with each one's quote: day gainers, day losers, most actives, 52-week gainers and losers, trending and most watched tickers, ETFs, crypto, undervalued growth stocks, most shorted stocks, top mutual funds and more. Leave empty to read only your tickers; clear the tickers above to read only the lists.

## `screenerRegion` (type: `string`):

The market of the day gainers, day losers and most actives: India, the UK, Canada, Japan and more, by Yahoo's own criteria for its US lists (price change, company size, volume). A company listed on both the NSE and the BSE comes once. The other screeners are Yahoo's US lists.

## `screenerResults` (type: `integer`):

How many of each screener's list to read, in its order (up to 1,000; trending tickers up to 100).

## `searchQueries` (type: `array`):

Optional: words to find tickers by (up to 50), such as 'lithium', 'semiconductor' or 'vanguard': a row per matching stock, ETF, fund, index, future, currency or coin, with its exchange, industry, price and change, in Yahoo's order.

## `searchType` (type: `string`):

What the symbol search returns.

## `searchResults` (type: `integer`):

How many symbols to read per search (up to 1,000).

## `compactOutput` (type: `boolean`):

Keep only the main fields of quote and screener rows (about 35 of 140): smaller results for AI agents, chat tools and quick looks.

## `proxy` (type: `object`):

Not needed: Yahoo Finance answers Apify's servers directly. Apify's datacenter proxy or your own proxies can be used; residential and other per-GB proxies aren't available.

## Actor input object example

```json
{
  "tickers": [
    "AAPL",
    "MSFT",
    "NVDA"
  ],
  "includeFundamentals": true,
  "includeOwnership": false,
  "ratingChangesPerTicker": 25,
  "secFilingsPerTicker": 20,
  "historyRange": "1mo",
  "historyInterval": "1d",
  "historyFormat": "rows",
  "includePrePost": false,
  "financialsPeriod": "annual",
  "newsPerTicker": 10,
  "optionExpirations": 1,
  "optionType": "both",
  "optionStrikeRangePercent": 0,
  "optionMinVolume": 0,
  "optionMinOpenInterest": 0,
  "includeGreeks": true,
  "optionsFormat": "rows",
  "screenerRegion": "US",
  "screenerResults": 25,
  "searchType": "all",
  "searchResults": 25,
  "compactOutput": false
}
```

# Actor output Schema

## `quotes` (type: `string`):

No description

## `history` (type: `string`):

No description

## `financials` (type: `string`):

No description

## `options` (type: `string`):

No description

## `news` (type: `string`):

No description

## `screeners` (type: `string`):

No description

## `series` (type: `string`):

No description

## `optionChains` (type: `string`):

No description

## `ownership` (type: `string`):

No description

## `analysts` (type: `string`):

No description

## `filings` (type: `string`):

No description

## `search` (type: `string`):

No description

## `notFound` (type: `string`):

No description

## `allData` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "tickers": [
        "AAPL",
        "MSFT",
        "NVDA"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("akhil_rajesh/yahoo-finance-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "tickers": [
        "AAPL",
        "MSFT",
        "NVDA",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("akhil_rajesh/yahoo-finance-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "tickers": [
    "AAPL",
    "MSFT",
    "NVDA"
  ]
}' |
apify call akhil_rajesh/yahoo-finance-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,akhil_rajesh/yahoo-finance-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/i9zOc5Mj4CpAIPVQC/builds/NOaqr8eh6Ffqhe55m/openapi.json
