# Yahoo Finance Scraper 📈 (quotes, fundamentals, history) (`tagadanar/yahoo-finance-scraper`) Actor

Quotes, key stats, financial statements and price history for any list of tickers in one table: stocks, ETFs, crypto, FX, indices. Price, change, market cap, P/E, EPS, dividend yield, sector, annual and quarterly statements, daily to monthly OHLC. No API key, no login.

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

## Pricing

from $0.70 / 1,000 ticker processeds

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?

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: quotes, key stats, financials and price history for any tickers

Paste a list of tickers and get one clean table back: the current quote, the key statistics, the income statement, balance sheet and cash flow (annual and quarterly), and the daily, weekly or monthly price history. Stocks from any exchange Yahoo covers, ETFs and funds, crypto pairs, currencies, indices and futures, in one run.

Built for retail investors and quant hobbyists, financial bloggers, fintech prototypers, analysts keeping a watchlist, and AI agents that need market data without a data-vendor contract.

**$1 per 1,000 tickers** (quote, key stats and every financial statement included) plus **$0.20 per 1,000 price-history rows**. Platform usage included. No API key, no login.

### What you get

Every row has a `recordType` so you can split the dataset, and the Output tab has a separate view for each type.

#### `quote`: one row per ticker

| Field | Description |
| --- | --- |
| `ticker`, `name`, `quoteType`, `exchange`, `currency` | What it is and where it trades (EQUITY, ETF, CRYPTOCURRENCY, CURRENCY, INDEX, FUTURE...) |
| `price`, `change`, `changePercent`, `previousClose`, `open`, `dayHigh`, `dayLow` | Latest regular-session numbers |
| `volume`, `avgVolume3Month`, `avgVolume10Day` | Trading volume |
| `marketCap`, `sharesOutstanding` | Size |
| `fiftyTwoWeekHigh`, `fiftyTwoWeekLow`, `fiftyDayAverage`, `twoHundredDayAverage` | Range and moving averages |
| `trailingPE`, `forwardPE`, `eps`, `forwardEps`, `priceToBook`, `bookValue` | Valuation |
| `dividendYieldPercent`, `dividendRate` | Dividend (percent, so 0.32 means 0.32 %) |
| `preMarketPrice`, `postMarketPrice`, `marketState` | Extended hours and whether the market is open |
| `quoteTime`, `quoteSource`, `dataDelayMinutes` | When the price was struck and Yahoo's own label for its delay |
| `sector`, `industry`, `beta` | From key stats (see below) |

Turn on **Key stats** and the same row also carries: `country`, `website`, `employees`, `enterpriseValue`, `priceToSales`, `enterpriseToEbitda`, `pegRatio`, margins (`profitMargin`, `grossMargin`, `operatingMargin`), `returnOnEquity`, `revenueGrowth`, `earningsGrowth`, `totalRevenue`, `ebitda`, `freeCashflow`, `totalCash`, `totalDebt`, `debtToEquity`, `currentRatio`, `payoutRatio`, `exDividendDate`, short interest and ownership percentages, analyst targets and recommendation, and for funds the category, family, total assets, expense ratio and returns. Fields that do not apply to a ticker (a P/E for a currency pair) are `null`.

#### `financials`: one row per statement and period

`ticker`, `statement` (`income`, `balance` or `cashflow`), `period` (`annual` or `quarterly`), `endDate`, `currency`, then the line items as columns, for example `totalRevenue`, `grossProfit`, `operatingIncome`, `netIncome`, `dilutedEps`, `totalAssets`, `totalDebt`, `stockholdersEquity`, `operatingCashFlow`, `freeCashFlow`, `capitalExpenditure`. Newest period first. A listed company usually gives about 4 annual and 4 to 5 quarterly periods per statement.

#### `history`: one row per day, week or month

`ticker`, `date`, `timestamp`, `open`, `high`, `low`, `close`, `adjClose` (adjusted for splits and dividends), `volume`, `currency`. If Yahoo has not yet published the final close of the newest bar, that row carries the latest trade price as its close and `partialBar: true`.

### Input

| Field | What it does |
| --- | --- |
| **Tickers** | One Yahoo symbol per line: `AAPL`, `MSFT`, `BTC-USD`, `^GSPC`, `EURUSD=X`, `7203.T`, `SAP.DE`, `GC=F`. You can paste finance.yahoo.com/quote/... links. Up to 1,000. |
| **What to fetch** | Any of Quote, Key stats, Financial statements, Price history. Default: quote and key stats. |
| **History range / interval** | 1 month to max, daily, weekly or monthly. Only used with Price history. |
| **Company names to look up** | Optional. `Toyota Motor` adds Yahoo's best match (`TM`) to the tickers; the quote row says which name it came from. |

Watchlist with fundamentals:

```json
{
  "tickers": ["AAPL", "MSFT", "NVDA", "7203.T", "SAP.DE"],
  "dataTypes": ["quote", "keyStats", "financials"]
}
```

Five years of weekly prices for backtesting:

```json
{
  "tickers": ["SPY", "QQQ", "BTC-USD", "^GSPC"],
  "dataTypes": ["history"],
  "historyRange": "5y",
  "historyInterval": "1wk"
}
```

### Example row (real, from a run on 2026-10-16)

A `quote` row with key stats on (excerpt):

```json
{
  "recordType": "quote",
  "ticker": "AAPL",
  "name": "Apple Inc.",
  "quoteType": "EQUITY",
  "exchange": "NasdaqGS",
  "currency": "USD",
  "price": 342,
  "change": -0.959991,
  "changePercent": -0.279914,
  "volume": 39605715,
  "marketCap": 4991209701376,
  "fiftyTwoWeekHigh": 348.15,
  "fiftyTwoWeekLow": 243.42,
  "trailingPE": 39.1304,
  "eps": 8.74,
  "dividendYieldPercent": 0.32,
  "marketState": "POSTPOST",
  "quoteTime": "2026-10-15T20:00:01.000Z",
  "quoteSource": "Nasdaq Real Time Price",
  "dataDelayMinutes": 15,
  "sector": "Technology",
  "industry": "Consumer Electronics",
  "beta": 1.069,
  "profitMargin": 0.27618998,
  "analystRecommendation": "buy",
  "analystTargetMean": 329.3759,
  "url": "https://finance.yahoo.com/quote/AAPL",
  "capturedAt": "2026-10-16T00:32:25.277Z"
}
```

A `financials` row and a `history` row:

```json
{ "recordType": "financials", "ticker": "AAPL", "statement": "income", "period": "annual", "endDate": "2025-09-30", "currency": "USD", "totalRevenue": 416161000000, "grossProfit": 195201000000, "operatingIncome": 133050000000, "netIncome": 112010000000, "dilutedEps": 7.46 }
{ "recordType": "history", "ticker": "AAPL", "date": "2026-10-14", "timestamp": "2026-10-14T13:30:00.000Z", "open": 344.61, "high": 347.09, "low": 341.72, "close": 342.96, "adjClose": 342.96, "volume": 50061100, "currency": "USD" }
```

### Pricing

| Event | List price | Gold plan |
| --- | --- | --- |
| Ticker processed (quote, key stats and financial statements all included) | $1.00 per 1,000 | $0.70 per 1,000 |
| Price history row | $0.20 per 1,000 | $0.14 per 1,000 |
| Run start | $0.001 per run | $0.001 per run |

A ticker is charged only when it delivers something; symbols Yahoo does not know cost nothing. Platform usage is included. Examples at list price: 100 tickers with quote, key stats and statements = $0.10; one year of daily history for the same 100 tickers (about 25,000 rows) = about $5.00 more.

Only history is charged per row, so you can pull statements for a whole index without paying per line item.

### FAQ

**Is the price real-time?** No promise is made. Each row carries Yahoo's own label (`quoteSource`) and delay (`dataDelayMinutes`): many US prices show a 15-minute delay, other exchanges 15 to 20 minutes, crypto and currencies are close to live. Treat every quote as delayed unless you have checked it against your broker.

**Why does a ticker have no financial statements?** Yahoo publishes statements for companies, not for crypto, currencies, indices, futures or most ETFs. The status line at the end of the run names the tickers and data types Yahoo had nothing for, and they are not charged.

**What does the ticker format look like for non-US stocks?** Yahoo's own: exchange suffix after a dot (`7203.T` Tokyo, `SAP.DE` Xetra, `VOD.L` London, `MC.PA` Paris, `RY.TO` Toronto, `9988.HK` Hong Kong). Use the company-name lookup if you do not know it.

**How far back does history go?** To the first trade Yahoo has when you choose Maximum. Daily bars for a year are about 250 rows for stocks and 365 for crypto.

**Can I schedule it?** Yes. Run the same input every day for a daily snapshot table, or weekly for fundamentals.

### Legal and use

This actor reads the public Yahoo Finance pages' data feeds. Use the data for personal and research purposes and check Yahoo's terms before redistributing it commercially. Nothing here is investment advice, and quotes are delayed.

### Related actors

- [Brand & News Monitor](https://apify.com/tagadanar/brand-news-monitor): Google News alerts for the companies on your watchlist.
- [Google Trends Scraper](https://apify.com/tagadanar/google-trends-scraper): search interest for a ticker or brand next to its price.
- [X (Twitter) Watchlist](https://apify.com/tagadanar/x-account-watchlist): new posts from the accounts you follow for market chatter.

# Changelog

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

# Actor input Schema

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

One Yahoo Finance symbol per line: stocks (AAPL, MSFT), foreign listings with their exchange suffix (7203.T, SAP.DE, VOD.L), ETFs (SPY), crypto (BTC-USD), currencies (EURUSD=X), indices (^GSPC), futures (GC=F). You can also paste a finance.yahoo.com/quote/... link. Duplicates are removed.

## `dataTypes` (type: `array`):

Quote: price, change, volume, market cap, 52-week range, P/E, EPS, dividend yield. Key stats: adds sector, industry, beta, margins, ratios and analyst targets to the quote row. Financial statements: income statement, balance sheet and cash flow, annual and quarterly (one row per statement and period). Price history: one row per day, week or month. Leave empty for quote and key stats.

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

How far back the price history goes. Only used when 'Price history' is selected. 'max' goes back to the first trade Yahoo has.

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

One price row per day, week or month. Only used when 'Price history' is selected.

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

Optional. Type a company or fund name (for example 'Toyota Motor') and Yahoo's best match is added to the tickers above; the quote row says which name it came from.

## Actor input object example

```json
{
  "tickers": [
    "AAPL",
    "MSFT",
    "BTC-USD"
  ],
  "dataTypes": [
    "quote",
    "keyStats"
  ],
  "historyRange": "1y",
  "historyInterval": "1d"
}
```

# Actor output Schema

## `results` (type: `string`):

One quote row per ticker, plus financials and history rows when selected (see recordType).

# 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",
        "BTC-USD"
    ],
    "dataTypes": [
        "quote",
        "keyStats"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tagadanar/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",
        "BTC-USD",
    ],
    "dataTypes": [
        "quote",
        "keyStats",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("tagadanar/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",
    "BTC-USD"
  ],
  "dataTypes": [
    "quote",
    "keyStats"
  ]
}' |
apify call tagadanar/yahoo-finance-scraper --silent --output-dataset

```

## MCP server setup

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