# Yahoo Finance Scraper - 10 modes (`zet46/yahoo-finance-scraper`) Actor

Yahoo Finance pages for any ticker: summary quote, 60+ key stats, profile, income statement TTM+4y, analyst estimates, Top-10 holders, full option chain, markets/sector screener (gainers/losers/sectors). Use when an agent needs stock fundamentals, analyst targets, or sector screening.

- **URL**: https://apify.com/zet46/yahoo-finance-scraper.md
- **Developed by:** [An Tan Huynh](https://apify.com/zet46) (community)
- **Categories:** Business, AI, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

Scrape eight Yahoo Finance pages in one actor — seven per-ticker sub-pages plus a markets/sector screener:

| Mode | URL | What you get |
|---|---|---|
| `summary` | `/quote/<SYM>/` | Price, change, 15 At-a-Glance stats (Prev Close, Open, Bid, Ask, Day's / 52 Week range, Volume, Avg Vol, Market Cap, Beta 5Y, PE Ratio TTM, EPS TTM, Earnings Date, Forward Dividend & Yield, 1y Target Est) |
| `key_stats` | `/quote/<SYM>/key-statistics/` | 60+ valuation rows (Market Cap, Enterprise Value, Trailing P/E, Forward P/E, PEG, Price/Sales, Price/Book, EV/Revenue, EV/EBITDA, Profit Margin, Operating Margin, ROA, ROE, Revenue, EBITDA, EPS, Total Cash, Total Debt, OCF, LFCF, 52W Change, 50/200D Moving Average, Shares Outstanding, Float, Insider / Institution %, Short interest, Payout Ratio, Dividend dates, Last Split...) |
| `profile` | `/quote/<SYM>/profile/` | Address + phone + website + Sector + Industry + Full-Time Employees + Business Summary |
| `financials` | `/quote/<SYM>/financials/` | Income statement — TTM + 4 fiscal years. Total Revenue, Cost of Revenue, Gross Profit, Operating Expense, Operating Income, Pretax Income, Tax Provision, Net Income, Diluted EPS, Basic EPS, EBITDA, EBIT and more |
| `analysis` | `/quote/<SYM>/analysis/` | Earnings Estimate (next qtr / next year), Revenue Estimate, Earnings History, EPS Trend, EPS Revisions and Growth Estimates vs peers |
| `holders` | `/quote/<SYM>/holders/` | Major Holders Breakdown (% insider / institutions / float / count), Top-10 Institutional Holders (Blackrock, Vanguard, State Street…), Top-10 Mutual Fund Holders — all with shares + date + % out + value |
| `options` | `/quote/<SYM>/options/` | Full option chain for the nearest expiration — calls + puts tables with contract symbol, strike, last trade, bid/ask, change, volume, open interest, implied volatility (~90-180 contracts/ticker for US stocks) |
| `screener` | `/markets/stocks/{gainers,losers,…}/`<br/>or `/sectors/<slug>/` | Markets or sector page as one row with embedded ticker list — symbol, name, price, change %, volume, market cap, P/E, 52w range (or sector table: market weight + YTD return + analyst rating) |
| `all` | all 7 per-ticker above | Merged bundle row per ticker, priced at a 50% bundle discount |

Works for US stocks (`AAPL`), international tickers with suffix (`7203.T`, `BABA`, `RIO.AX`), ETFs (`SPY`), indexes (`^GSPC`, `^DJI`, `^IXIC`), crypto (`BTC-USD`, `ETH-USD`) and FX pairs (`EURUSD=X`, `GBPUSD=X`). International tickers may have fewer holders/options rows — Yahoo doesn't surface those for every exchange.

### Pricing (pay-per-event)

| Event | Price | What triggers it |
|---|---|---|
| `summary` | **$0.001** | One summary row (one ticker) |
| `key_stats` | **$0.001** | One key statistics row |
| `profile` | **$0.001** | One profile row |
| `financials` | **$0.001** | One financials row |
| `analysis` | **$0.001** | One analysis row |
| `holders` | **$0.001** | One holders row (major + Top-10 institutional + Top-10 MF) |
| `options` | **$0.002** | One option-chain row (full calls + puts for the nearest expiration) |
| `screener` | **$0.002** | One screener row (markets or sector page with embedded ticker list) |
| `all` | **$0.004** | One bundled row with all 7 per-ticker sub-pages: 6 × $0.001 + 1 × $0.002 options = $0.008 unbundled, so 50% off |

Example runs:

- `tickers: ["AAPL"], mode: "summary"` → 1 row, $0.001
- `tickers: ["AAPL", "MSFT", "NVDA"], mode: "financials"` → 3 rows, $0.003
- `tickers: ["AAPL"], mode: "options"` → 1 row (189 contracts), $0.002
- `tickers: ["AAPL"], mode: "all"` → 1 bundled row (7 sub-pages), $0.004
- `tickers: ["AAPL"], modes: ["holders", "options"]` → 2 rows, $0.003
- `mode: "screener", screeners: ["gainers", "sector-technology"]` → 2 rows, $0.004

### Input

```json
{
  "tickers": ["AAPL", "MSFT", "NVDA"],
  "mode": "summary"
}
```

- `tickers` *(required for per-ticker modes)* — list of Yahoo Finance symbols. Dict form `{"symbol": "7203.T"}` is also accepted.
- `mode` *(default `summary`)* — one of `summary`, `key_stats`, `profile`, `financials`, `analysis`, `holders`, `options`, `screener`, `all`.
- `modes` *(optional)* — fine-grained override. When non-empty, overrides `mode` and emits one dataset row per `(ticker, sub-page)`. Items must be in the 7 per-ticker sub-pages above (not `screener` / `all`).
- `screeners` *(required when `mode="screener"`)* — list of screener keys. Supported: `gainers`, `losers`, `most-active`, `trending`, `52-week-gainers`, `52-week-losers`, `crypto`, `etfs-gainers`, `etfs-losers`, and `sector-<slug>` for the 11 Yahoo sectors (`sector-technology`, `sector-healthcare`, `sector-financial-services`, `sector-consumer-cyclical`, `sector-communication-services`, `sector-industrials`, `sector-consumer-defensive`, `sector-energy`, `sector-basic-materials`, `sector-real-estate`, `sector-utilities`).
- `proxyConfiguration` *(optional)* — defaults to Apify datacenter with `apifyProxyCountry=US`. Yahoo Finance 404s / soft-blocks non-US IPs for the full SSR; keep the country override unless you have a good reason to change it.

### Sample output

#### `summary` row (AAPL)

```json
{
  "symbol": "AAPL",
  "mode": "summary",
  "name": "Apple Inc.",
  "exchange": "NasdaqGS - Nasdaq Real Time Price",
  "currency": "USD",
  "price": 342.00,
  "change": -0.96,
  "changePercent": -0.28,
  "marketState": "At close: 4:00:01 PM EDT",
  "previousClose": 342.96,
  "openPrice": 346.95,
  "volume": 39605715,
  "avgVolume": 44865393,
  "marketCap": 4991000000000,
  "beta": 1.07,
  "peRatio": 39.04,
  "eps": 8.76,
  "oneYearTarget": 329.38,
  "stats": {
    "previousClose": "342.96",
    "open": "346.95",
    "bid": "343.01 x 400",
    "ask": "347.98 x 400",
    "dayRange": "341.60 - 347.85",
    "fiftyTwoWeekRange": "243.42 - 348.15",
    "volume": "39,605,715",
    "avgVolume": "44,865,393",
    "marketCap": "4.991T",
    "beta5YMonthly": "1.07",
    "peRatioTtm": "39.04",
    "epsTtm": "8.76",
    "earningsDate": "Nov 2, 2026",
    "forwardDividendYield": "-- (0.32%)",
    "oneYearTargetEst": "329.38"
  }
}
```

#### `profile` row (AAPL)

```json
{
  "symbol": "AAPL",
  "mode": "profile",
  "address": {
    "line1": "One Apple Park Way",
    "line2": "Cupertino, CA 95014",
    "country": "United States",
    "full": "One Apple Park Way, Cupertino, CA 95014, United States"
  },
  "phone": "(408) 996-1010",
  "website": "https://www.apple.com",
  "sector": "Technology",
  "industry": "Consumer Electronics",
  "fullTimeEmployees": 150000,
  "description": "Apple Inc. designs, manufactures, and markets smartphones, personal computers, tablets, wearables..."
}
```

#### `financials` row (AAPL)

```json
{
  "symbol": "AAPL",
  "mode": "financials",
  "columns": ["9/30/2022", "9/30/2023", "9/30/2024", "9/30/2025", "TTM"],
  "body": {
    "totalRevenue": {
      "label": "Total Revenue",
      "values": ["394.33B", "383.29B", "391.04B", "416.16B", "466.82B"],
      "numbers": [394330000000, 383290000000, 391040000000, 416160000000, 466820000000]
    },
    "operatingIncome": {
      "values": ["119.44B", "114.3B", "123.22B", "133.05B", "154.86B"],
      "numbers": [119440000000, 114300000000, 123220000000, 133050000000, 154860000000]
    },
    "netIncomeCommonStockholders": {
      "values": ["99.8B", "97B", "93.74B", "112.01B", "128.93B"]
    },
    "dilutedEps": {"values": ["6.11", "6.13", "6.08", "7.46", "8.76"]}
  },
  "totalRevenueTtm": 466820000000,
  "operatingIncomeTtm": 154860000000,
  "netIncomeCommonStockholders": 112010000000,
  "dilutedEps": 7.46
}
```

#### `analysis` row (AAPL)

```json
{
  "symbol": "AAPL",
  "mode": "analysis",
  "earningsEstimate": {
    "columns": ["Current Qtr. (Sep 2026)", "Next Qtr. (Dec 2026)", "Current Year (2026)", "Next Year (2027)"],
    "rows": {
      "No. of Analysts": ["27", "22", "39", "40"],
      "Avg. Estimate": ["1.98", "2.9", "8.82", "9.57"]
    }
  },
  "growthEstimates": {
    "columns": ["Current Qtr.", "Next Qtr.", "Current Year", "Next Year"],
    "rows": {
      "AAPL": {"values": ["7.14%", "1.31%", "18.38%", "8.45%"]},
      "S&P 500": {"values": ["24.57%", "26.56%", "32.41%", "16.50%"]}
    }
  }
}
```

#### `holders` row (AAPL)

```json
{
  "symbol": "AAPL",
  "mode": "holders",
  "majorHolders": {
    "percentSharesInsider": {"text": "1.65%", "number": 1.65},
    "percentSharesInstitutions": {"text": "66.33%", "number": 66.33},
    "percentFloatInstitutions": {"text": "67.44%", "number": 67.44},
    "numberOfInstitutionsHolding": {"text": "7,697", "number": 7697}
  },
  "percentSharesInsider": 1.65,
  "percentSharesInstitutions": 66.33,
  "topInstitutionalHolders": [
    {"holder": "Blackrock Inc.", "shares": "1.16B", "sharesNumber": 1160000000, "dateReported": "Jun 30, 2026", "percentOut": "7.97%", "percentOutNumber": 7.97, "value": "397,744,953,138", "valueNumber": 397744953138},
    {"holder": "Vanguard Capital Management LLC", "shares": "959.11M", "sharesNumber": 959110000, "dateReported": "Jun 30, 2026", "percentOut": "6.57%", "percentOutNumber": 6.57, "value": "328,014,905,562", "valueNumber": 328014905562}
  ],
  "topMutualFundHolders": [...]
}
```

#### `options` row (AAPL, nearest expiration)

```json
{
  "symbol": "AAPL",
  "mode": "options",
  "expiration": "2026-10-16",
  "callsCount": 94,
  "putsCount": 95,
  "calls": [
    {"side": "call", "inTheMoney": true, "contractName": "AAPL261016C00130000",
     "strike": "130", "strikeNumber": 130,
     "lastTradeDate": "10/15/2026 2:27 PM",
     "lastPrice": "212.22", "lastPriceNumber": 212.22,
     "bid": "211.35", "ask": "213.25",
     "change": "-2.25", "percentChange": "-1.05%",
     "volume": "25", "volumeNumber": 25,
     "openInterest": "38", "openInterestNumber": 38,
     "impliedVolatility": "563.67%", "impliedVolatilityNumber": 563.67}
  ],
  "puts": [...]
}
```

#### `screener` row (markets gainers)

```json
{
  "symbol": "gainers",
  "mode": "screener",
  "screener": "gainers",
  "rowsCount": 25,
  "rows": [
    {"symbol": "RGC", "name": "Regencell Bioscience Holdings Limited",
     "price": 9.52, "change": 1.41, "percentChange": 17.39,
     "volume": 1902000, "avgVolume3Month": 197307,
     "marketCap": 4721000000, "peRatioTtm": null,
     "fiftyTwoWeekPercentChange": -54.82,
     "fiftyTwoWeekLow": 4.51, "fiftyTwoWeekHigh": 69.0}
  ]
}
```

### Tips

- Use `mode: "all"` when you want everything in one row (great for MCP / RAG — one JSON blob per ticker, 7 sub-pages, 50% off vs billing each separately).
- Use `modes: ["summary", "financials"]` when you only want a subset — you only pay for what you ask.
- Set `apifyProxyCountry` to `US` (default). Yahoo returns a trimmed SSR shell to non-US IPs that strips the `yf-11op525` quote-statistics container.
- Rate: the actor sleeps 0.4-0.8s between fetches to stay under Yahoo's per-IP throttle. 100 tickers in `summary` mode take about 2 minutes; `mode: "all"` is ~9× slower per ticker.
- Fields are camelCase (`forwardAnnualDividendYield`) and `number` / `text` doublets are provided for every key statistic so you can either compute math on the number or render the exact Yahoo string.
- International tickers (e.g. `7203.T`) may have smaller holders/options tables — Yahoo doesn't surface the full set for non-US exchanges. The actor still succeeds and returns whatever Yahoo renders.

# Actor input Schema

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

List of Yahoo Finance symbols. Works for US stocks (AAPL, MSFT), international tickers with suffix (7203.T, BABA, RIO.AX), ETFs (SPY, VOO), indexes (^GSPC, ^DJI), crypto (BTC-USD, ETH-USD) and FX (EURUSD=X, GBPUSD=X). Required for every mode except 'screener'.

## `mode` (type: `string`):

What to scrape per ticker. 'all' bundles all 7 per-ticker sub-pages in one dataset row (50% off vs charging each page separately). 'screener' uses the 'screeners' input instead of 'tickers'.

## `modes` (type: `array`):

Fine-grained alternative to 'mode'. If set, one dataset row is emitted per (ticker, sub-page). Overrides 'mode' when non-empty.

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

Markets / sector screener keys used when mode='screener'. Supported: 'gainers', 'losers', 'most-active', 'trending', '52-week-gainers', '52-week-losers', 'crypto', 'etfs-gainers', 'etfs-losers', 'sector-technology', 'sector-healthcare', 'sector-financial-services', 'sector-consumer-cyclical', 'sector-communication-services', 'sector-industrials', 'sector-consumer-defensive', 'sector-energy', 'sector-basic-materials', 'sector-real-estate', 'sector-utilities'.

## `proxyConfiguration` (type: `object`):

Yahoo Finance serves full SSR to US datacenter IPs. The actor forces apifyProxyCountry=US by default and escalates to residential US on repeated 429/403.

## Actor input object example

```json
{
  "tickers": [
    "AAPL",
    "MSFT",
    "NVDA"
  ],
  "mode": "summary",
  "modes": [],
  "screeners": [
    "gainers"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `rows` (type: `string`):

All scraped rows as JSON items (one row per sub-page per ticker).

## `rowsCsv` (type: `string`):

The same rows as a flat CSV file (nested objects are JSON-encoded).

# 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"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("zet46/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",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("zet46/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"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call zet46/yahoo-finance-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,zet46/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/wBDdlxtmzrWbd25S3/builds/xExHAFkP4Xo2iiaeq/openapi.json
