# Yahoo Finance Scraper — Quotes, Fundamentals & Price History (`tidyfeed/yahoo-finance-scraper`) Actor

Any list of tickers to one spreadsheet: price, change, market cap, P/E, EPS, dividend yield, 52-week range, analyst target, next earnings date, sector. Or a year of daily open/high/low/close/volume per ticker. US and international symbols, ETFs and indices. No API key, no login.

- **URL**: https://apify.com/tidyfeed/yahoo-finance-scraper.md
- **Developed by:** [tidyfeed](https://apify.com/tidyfeed) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 quotes

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Yahoo Finance Scraper — Quotes, Fundamentals & Price History

**A list of tickers in, one clean spreadsheet out.**

Give it any symbols Yahoo Finance knows — US stocks, foreign listings, ETFs, indices, crypto — and get one row per ticker: price and change, market cap, P/E, EPS, PEG, price-to-book, dividend rate and yield, 52-week range, beta, short interest, revenue and margins, analyst target and rating split, next earnings date, sector, industry, employees. Or flip the switch and get the price history: one row per trading day, week or month with open, high, low, close, adjusted close and volume, for up to everything Yahoo has.

Plain numbers in plain columns. No "4.68T" strings to fix, no percent signs, no nested objects.

No API key. No login. No proxies.

***

### Two modes

**Quotes — one row per ticker.** The default. Fifty tickers in, fifty rows out, sorted however you like: by P/E, by dividend yield, by distance from the 52-week high, by how far the analyst target sits above the price.

**History — one row per bar.** A year of daily closes for a watchlist, or ten years of weekly bars for a backtest, in one dataset with a `symbol` column so it pivots straight into a chart.

Measured 15 September 2026: 8 tickers in quotes mode in about 4 seconds; a year of daily history for a ticker, 251 rows, in under a second.

***

### What you get

#### Quotes mode

**Price** — `price`, `change`, `changePercent`, `previousClose`, `open`, `dayLow`, `dayHigh`, `volume`, `averageVolume`, `fiftyTwoWeekLow`, `fiftyTwoWeekHigh`, `quotedAt`, `marketState`

**Valuation** — `marketCap`, `trailingPE`, `forwardPE`, `trailingEps`, `forwardEps`, `pegRatio`, `priceToBook`, `priceToSales`, `beta`, `sharesOutstanding`, `shortPercentOfFloat`

**Income and cash** — `totalRevenue`, `revenueGrowth`, `profitMargin`, `freeCashflow`, `totalCash`, `totalDebt`, `dividendRate`, `dividendYield`, `exDividendDate`

**Street view** — `targetMeanPrice`, `targetLowPrice`, `targetHighPrice`, `recommendation`, `analystCount`, `analystsStrongBuy` … `analystsStrongSell`

**The company** — `name`, `exchange`, `currency`, `quoteType`, `sector`, `industry`, `country`, `employees`, `website`, `nextEarningsDate`, `yahooUrl`

#### History mode

`symbol`, `date`, `open`, `high`, `low`, `close`, `adjClose`, `volume`, `currency`, `exchange`

***

### Typical uses

- **A watchlist that updates itself.** Quotes mode on your tickers, on a schedule, into a sheet. Every run is a dated snapshot.
- **Screen a sector.** Thirty names, sorted by forward P/E or dividend yield, with the analyst target next to the price.
- **Earnings calendar.** `nextEarningsDate` across a portfolio, sorted.
- **Backtests and charts.** History mode, weekly bars, five years, ten tickers — one dataset, ready to pivot.
- **Non-US coverage.** `005930.KS`, `7203.T`, `SAP.DE`, `^FTSE` — the same columns, in each listing's own currency.

***

### Input

| Field | What it does |
|---|---|
| `tickers` | Yahoo symbols, one per line, or Yahoo Finance quote links. Foreign listings carry their exchange suffix (`.KS`, `.T`, `.L`, `.DE`); indices start with `^`; crypto pairs look like `BTC-USD`. |
| `mode` | `quotes` (default) or `history`. |
| `range` | History window: `1mo` to `10y`, or `max`. Default `1y`. |
| `interval` | `1d` (default), `1wk` or `1mo`. |

***

### What it costs

**$5.00 per 1,000 quote rows** in quotes mode, **$1.00 per 1,000 price rows** in history mode, plus $0.005 per run. Apify's Starter, Scale and Business plans get 10%, 20% and 30% off.

You pay for rows delivered. A symbol Yahoo does not know costs nothing. For scale: a 100-ticker watchlist is 50 cents a run; a year of daily history for 20 tickers is about 5,000 rows, five dollars.

***

### How it works

Yahoo Finance serves two JSON endpoints to anyone: a chart endpoint for prices, and a quote-summary endpoint for fundamentals that asks for a session cookie and a "crumb" token Yahoo hands out on request. This actor performs that handshake once per run and reads the two endpoints — no browser, no HTML scraping, no proxies. Every figure is Yahoo's own; nothing is estimated or derived except the percentage conversions noted below.

***

### Honest limits

- **Quotes are delayed the way Yahoo delays them** — typically 15 minutes for US exchanges, and `quotedAt` says exactly when the price is from. This is not a real-time feed.
- **Fundamentals are as Yahoo publishes them.** Some fields are blank for some instruments: an index has no P/E, an ETF has no employees, a young company has no trailing EPS. Blank means Yahoo has no figure, not that the actor missed it.
- **Percentages are converted from Yahoo's fractions.** `changePercent`, `dividendYield`, `revenueGrowth`, `profitMargin` and `shortPercentOfFloat` are given as percent figures (2.5 means 2.5%). Everything else is the raw number in the listing's currency.
- **The current, unfinished bar is not in the history.** Yahoo pads today's bar with empty values until the session closes; it is skipped rather than reported as zero.
- **Symbols are Yahoo's.** A ticker without its exchange suffix may resolve to a different listing than you meant. When Yahoo does not know a symbol, the row is skipped and the reason is logged.
- **Yahoo throttles heavy readers.** Tickers are read one at a time with a short pause; a run of thousands may see HTTP 429, which is reported per ticker rather than failing the run.
- **This is data, not advice.** The actor reports what Yahoo Finance shows and makes no recommendation of its own.

***

### Scheduling

Prices move. Schedule quotes mode daily on your watchlist and each run adds a dated snapshot; schedule history mode weekly with `range: "1mo"` and you fill in the bars since the last run without re-reading years of data.

***

### Legal

This actor reads only data that Yahoo Finance serves publicly, at addresses it serves to anyone. It collects no personal data, requires no login and bypasses no access control. Market data is provided by Yahoo and its data partners and is for personal, informational use unless your own agreement with them says otherwise. You remain responsible for how you use the exported data.

***

Questions, or a symbol that behaves oddly? Open an issue on the actor — issues are read and answered.

# Actor input Schema

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

Yahoo Finance symbols, one per line: AAPL, MSFT, BRK-B, ^GSPC for the S\&P 500, 005930.KS for Samsung, 7203.T for Toyota, VOO for an ETF, BTC-USD for bitcoin. A Yahoo Finance quote link works too.

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

"Quotes" gives one row per ticker with price, valuation, dividends, analyst targets and company profile. "History" gives one row per trading day (or week, or month) with open, high, low, close, adjusted close and volume.

## `range` (type: `string`):

How far back the price history goes. History mode only.

## `interval` (type: `string`):

One row per day, week or month. History mode only.

## Actor input object example

```json
{
  "tickers": [
    "AAPL",
    "MSFT",
    "005930.KS",
    "^GSPC",
    "VOO"
  ],
  "mode": "quotes",
  "range": "1y",
  "interval": "1d"
}
```

# Actor output Schema

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

No description

## `rowsCsv` (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("tidyfeed/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("tidyfeed/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 tidyfeed/yahoo-finance-scraper --silent --output-dataset

```

## MCP server setup

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