# Yahoo Finance Scraper — Quotes, History, Financials & News (`tortuga/yahoo-finance-scraper`) Actor

Yahoo Finance data for stocks, ETFs, indices, crypto, FX and futures: quotes, price history, profiles, key stats, financial statements, analyst targets, earnings, news, screeners and ticker search.

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

## Pricing

$0.40 / 1,000 results

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 — Quotes, History, Financials & News

Get Yahoo Finance data for any ticker: stocks, ETFs, indices, crypto, currencies, futures and mutual funds. One run gives you live quotes, historical prices with dividends and splits, company profiles, key statistics, income statements, balance sheets, cash flows, analyst ratings and price targets, earnings dates and estimates, and the latest news headlines. It also exports market lists (most active, gainers, losers, trending, 52-week movers, screeners for ETFs, funds and crypto) and runs ticker search.

The data comes from the same JSON API that finance.yahoo.com uses. There is no browser and no API key, and runs are fast: 5 tickers with every section take about 4 seconds. You pay per result.

### What data does Yahoo Finance Scraper extract?

Each ticker becomes one result with the sections you turn on:

| Section | Fields |
|---|---|
| Quote | `price`, `change`, `changePercent`, `previousClose`, `open`, `dayLow`, `dayHigh`, `volume`, `averageVolume3Month`, `marketCap`, `sharesOutstanding`, `fiftyTwoWeekLow/High`, `fiftyDayAverage`, `twoHundredDayAverage`, `trailingPE`, `forwardPE`, `epsTrailingTwelveMonths`, `epsForward`, `priceToBook`, `bookValue`, `dividendRate`, `dividendYieldPercent`, `bid`, `ask`, pre/post-market price and change, `earningsDate`, `averageAnalystRating`, `marketState`, `regularMarketTime`. Crypto adds `circulatingSupply`, `maxSupply` and `volume24Hr`. ETFs and funds add `netAssets`, `netExpenseRatio` and `ytdReturn`. Futures add `expireDate`, `openInterest` and `underlyingSymbol`. |
| `profile` | `sector`, `industry`, `fullTimeEmployees`, `description`, `website`, `phone`, `address`, `officers` (name, title, age, pay, as Yahoo lists them), `governanceRisk`. ETFs and funds add `fund` (family, category, expense ratio), `topHoldings`, `sectorWeightingsPercent` and `assetAllocationPercent`. Crypto adds coin name, start date and whitepaper. |
| `statistics` | `enterpriseValue`, `enterpriseToRevenue`, `enterpriseToEbitda`, `pegRatio`, `priceToSalesTrailing12Months`, `beta`, margins, `returnOnAssets`, `returnOnEquity`, `totalCash`, `totalDebt`, `debtToEquity`, `currentRatio`, `freeCashflow`, `revenueGrowth`, `earningsGrowth`, `floatShares`, `sharesShort`, `shortRatio`, `heldPercentInsiders`, `heldPercentInstitutions`, `payoutRatio`, `exDividendDate`, `lastSplitFactor`, fiscal dates, `allTimeHigh`. Ratios are fractions (0.27 = 27%). |
| `analysts` | `recommendationKey`, `recommendationMean`, `numberOfAnalysts`, `targetMeanPrice`, `targetMedianPrice`, `targetHighPrice`, `targetLowPrice`, `recommendationTrend` (strong buy to strong sell, last 4 months), `ratingChanges` (25 latest upgrades and downgrades with firm and price target), `estimates` (EPS and revenue estimates for this and next quarter and year, EPS trend and revisions). |
| `earnings` | `nextEarningsDate`, `earningsCallDate`, EPS and revenue estimates, `epsHistory` (actual vs estimate and surprise % for the last 4 quarters), `quarterlyEps`, `yearlyRevenueEarnings`, `quarterlyRevenueEarnings`, `exDividendDate`, `dividendDate`. |
| `financials` | `incomeStatement`, `balanceSheet` and `cashFlow`, annual and/or quarterly. Each statement is a list of periods (`periodEnd`, `periodType`, `currency`) with every line item Yahoo shows, such as `totalRevenue`, `grossProfit`, `operatingIncome`, `ebitda`, `netIncome`, `dilutedEPS`, `totalAssets`, `totalDebt`, `stockholdersEquity`, `operatingCashFlow`, `capitalExpenditure` and `freeCashFlow`. |
| `history` | One bar per day, week, month or intraday interval with `date`, `open`, `high`, `low`, `close`, `adjClose` and `volume`, plus `dividends` and `splits` in the range. |

The other result types are:

- **News headline** (`type: "news"`): `symbol`, `title`, `publisher`, `link`, `publishedAt`, `relatedTickers`, `thumbnailUrl`, `uuid`.
- **Market list row** (`type: "listQuote"`): `list`, `rank`, and the same quote fields as above.
- **Search match** (`type: "searchResult"`): `query`, `rank`, `symbol`, `name`, `quoteType`, `exchange`, `sector`, `industry`.
- **Price bar** (`type: "priceBar"`, when **One row per price bar** is on): `symbol`, `date`, OHLC, `adjClose`, `volume`, and `dividend` or `split` on the bar where one happened.

### How to scrape Yahoo Finance stock data

1. Enter tickers in **Tickers**, for example `AAPL`, `MSFT`, `SPY`, `^GSPC`, `BTC-USD`, `EURUSD=X`, `GC=F`, `SAP.DE` or `7203.T`. Yahoo Finance quote URLs work too.
2. Choose the sections you need. Quote, profile, statistics, analysts and earnings are on by default. Financial statements, historical prices and news are opt-in.
3. Optionally add **Market lists** (gainers, losers, most active, trending and others) or **Ticker search** queries.
4. Click **Start**, then download the results as JSON, CSV or Excel, or read them through the API.

### Input example

```json
{
  "tickers": ["AAPL", "NVDA", "SPY", "BTC-USD"],
  "includeFinancials": true,
  "financialsPeriod": "both",
  "includeHistory": true,
  "historyStart": "2024-01-01",
  "historyInterval": "1wk",
  "includeNews": true,
  "maxNewsPerTicker": 10,
  "lists": ["day_gainers", "most_actives"],
  "maxResultsPerList": 25,
  "maxItems": 500
}
```

### Output example

A ticker result, shortened. Statement and history lists are cut to one entry here.

```json
{
  "type": "ticker",
  "symbol": "AAPL",
  "name": "Apple Inc.",
  "quoteType": "EQUITY",
  "exchange": "NasdaqGS",
  "currency": "USD",
  "price": 336.64,
  "change": -3.78,
  "changePercent": -1.11039,
  "volume": 37821157,
  "marketCap": 4912984883200,
  "fiftyTwoWeekLow": 243.42,
  "fiftyTwoWeekHigh": 345.34,
  "trailingPE": 38.605507,
  "epsTrailingTwelveMonths": 8.72,
  "dividendYieldPercent": 0.32,
  "earningsDate": "2026-11-02T20:00:00Z",
  "profile": {
    "sector": "Technology",
    "industry": "Consumer Electronics",
    "fullTimeEmployees": 150000,
    "website": "https://www.apple.com",
    "officers": [{ "name": "Mr. Timothy D. Cook", "title": "Executive Chairman of the Board", "yearBorn": 1961 }]
  },
  "statistics": { "enterpriseValue": 4935528218624, "beta": 1.069, "profitMargins": 0.27618998, "returnOnEquity": 1.4875101 },
  "analysts": { "recommendationKey": "buy", "numberOfAnalysts": 39, "targetMeanPrice": 328.09, "targetHighPrice": 405.0 },
  "earnings": { "nextEarningsDate": "2026-11-02T20:00:00Z", "epsEstimateAvg": 1.9822 },
  "financials": {
    "annual": {
      "incomeStatement": [{ "periodEnd": "2025-09-30", "periodType": "12M", "currency": "USD", "totalRevenue": 416161000000, "grossProfit": 195201000000, "netIncome": 112010000000 }]
    }
  },
  "historyInterval": "1d",
  "history": [{ "date": "2026-09-09", "open": 315.49, "high": 319.15, "low": 309.9, "close": 315.34, "adjClose": 315.34, "volume": 65640000 }],
  "dividends": [],
  "splits": [],
  "url": "https://finance.yahoo.com/quote/AAPL/",
  "scrapedAt": "2026-10-10T01:09:14Z"
}
```

A news headline:

```json
{
  "type": "news",
  "symbol": "AAPL",
  "uuid": "7b0832eb-8bfa-315e-a3bd-5f68341692fb",
  "title": "Why Apple (AAPL) Stock Is Trading Lower Today",
  "publisher": "StockStory",
  "link": "https://finance.yahoo.com/markets/stocks/articles/why-apple-aapl-stock-trading-231510875.html",
  "publishedAt": "2026-10-09T23:15:10Z",
  "relatedTickers": ["AAPL"],
  "newsQuery": "AAPL"
}
```

### How to download historical stock prices from Yahoo Finance

Turn on **Historical prices**. Set **History from** to a date (`2015-01-01`) or a period (`5 years`, `6 months`, `ytd`, `max`) and pick an interval: daily, weekly, monthly or intraday (1 hour down to 1 minute). Closing prices are split-adjusted. `adjClose` is also adjusted for dividends, the same as Yahoo's "Adj Close" column. By default the bars are a `history` list inside each ticker result, so a full price history of one ticker costs one result. Turn on **One row per price bar** for a flat table, which is easier in CSV or Excel. In that mode each bar is one result.

Intraday data only goes back as far as Yahoo keeps it: 7 days for 1-minute bars, 60 days for 5 to 30 minutes, and 2 years for 1-hour bars.

### How to get financial statements, analyst ratings and earnings

Turn on **Financial statements** and choose annual, quarterly or both. You get the same line items as the Financials, Balance Sheet and Cash Flow tabs on Yahoo Finance: usually 4 fiscal years or the last 5 quarters. **Analyst ratings and price targets** and **Earnings** are on by default. They share a single request per ticker with the profile and statistics, so they add no extra cost. Statements exist for stocks only. ETFs, funds and crypto get their own profile data instead.

### How to get top gainers, losers and most active stocks

Pick one or more entries in **Market lists**: most active, top gainers, top losers, trending tickers, most added to watchlists, 52-week gainers and losers, undervalued growth stocks, growth technology stocks, undervalued large caps, aggressive small caps, most shorted stocks, top ETFs, most active ETFs, top mutual funds, and all, most active or top-gaining cryptocurrencies. Each entry is one result with its full quote. **Results per list** controls how many you get, up to the length of the list. Yahoo serves 250 entries per request.

### Monitor changes on a schedule

Turn on **Only new or changed items** and save the input as a task with a daily or hourly Schedule in Apify. The actor then remembers which news headlines earlier runs returned and outputs only new ones. Headlines that were already delivered are not output again and are not charged. New items carry `changeType: "new"`. Ticker results, list rows and search results are snapshots, so they are output on every run. If several schedules use the same tickers, give each one its own **Monitoring key**.

### Does it need a Yahoo account or API key?

No. The actor uses Yahoo Finance's public web endpoints with the cookie and "crumb" that every visitor gets. Each proxy IP gets its own cookie and crumb, and throttled IPs are replaced automatically. Apify's default datacenter proxy is enough. No login is needed.

### How much does it cost?

You pay **$0.40 per 1,000 results**, plus a small amount of Apify platform usage. A result is one ticker with all the sections you chose, one headline, one list row, one search match, or one price bar in row mode. There is no start fee. Use **Max results** to cap a run.

### Integrations and API

Call the actor from Python, Node.js or any HTTP client with the Apify API, schedule it, or connect it to Google Sheets, Zapier, Make or n8n. AI agents can call it through the Apify MCP server. See the **API** tab for code snippets.

### Is it legal to scrape Yahoo Finance?

The actor reads only public data that finance.yahoo.com shows to every visitor without logging in. That covers market data, company filings data and news headlines, plus the names and titles of company officers as Yahoo publishes them. It does not log in or access anything private. Market data and news remain the property of Yahoo and its data providers. You are responsible for using the data in line with Yahoo's terms and the law that applies to you. Many uses, such as research and personal analysis, are fine. Redistributing data commercially may need a license.

### Support

Missing a field, or a ticker that doesn't work? Open an issue in the **Issues** tab. Issues are usually answered within a day.

# Actor input Schema

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

Yahoo Finance symbols or quote URLs, one per line: stocks (AAPL, BRK-B, SAP.DE, 7203.T), ETFs (SPY), indices (^GSPC), crypto (BTC-USD), currencies (EURUSD=X), futures (GC=F), mutual funds (VFIAX). Each ticker is one result with the sections chosen below.

## `includeQuote` (type: `boolean`):

Price, change, volume, market cap, 52-week range, P/E, EPS, dividend, bid/ask, pre/post-market. Fetched in batches of 50 tickers.

## `includeProfile` (type: `boolean`):

Sector, industry, employees, description, address, website and officers as Yahoo lists them; fund family, expense ratio and top holdings for ETFs/funds; coin info for crypto.

## `includeStatistics` (type: `boolean`):

Valuation (enterprise value, P/S, PEG, EV/EBITDA), margins, returns, cash and debt, short interest, ownership, beta, dividend and split details, fiscal dates.

## `includeAnalysts` (type: `boolean`):

Recommendation, mean/high/low price targets, rating trend for the last 4 months, the 25 latest upgrades/downgrades, EPS and revenue estimates.

## `includeEarnings` (type: `boolean`):

Next earnings date with EPS and revenue estimates, EPS actual vs estimate for the last 4 quarters, yearly and quarterly revenue and earnings.

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

Income statement, balance sheet and cash flow with all line items Yahoo shows (about 4 years or 5 quarters). Stocks only.

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

Annual, quarterly or both (both = 2 requests per ticker).

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

Open, high, low, close, adjusted close and volume per bar for the date range below, plus dividends and splits in that range.

## `historyStart` (type: `string`):

Start date YYYY-MM-DD, or a period back from today: '1 year', '6 months', '30 days', 'ytd', 'max'. Intraday bars only go back as far as Yahoo keeps them (1m: 7 days, 5m-30m: 60 days, 1h: 2 years).

## `historyEnd` (type: `string`):

End date YYYY-MM-DD (included). Empty = today.

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

Bar size.

## `historyAsRows` (type: `boolean`):

Output every bar as its own result (type 'priceBar', with dividend/split on the bar they fall in), handy for CSV/Excel and backtests. Each bar is then one result. Off: the bars are a 'history' list inside the ticker result.

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

Latest Yahoo Finance headlines per ticker: title, publisher, link, time, related tickers. Each headline is one result (a headline found for several tickers is output once).

## `maxNewsPerTicker` (type: `integer`):

1-50 (Yahoo returns at most about 50).

## `lists` (type: `array`):

Lists as on finance.yahoo.com/markets: most active, gainers, losers, trending, 52-week movers, screeners for stocks, ETFs, funds and crypto. Each listed security is one result with its quote.

## `maxResultsPerList` (type: `integer`):

Take at most this many entries from each list, in Yahoo's order (250 per request).

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

Company names or keywords to look up symbols for, e.g. 'apple', 'nvidia', 'gold'. Each match is one result: symbol, name, exchange, type, sector, industry.

## `maxSearchResults` (type: `integer`):

1-20.

## `onlyNewOrChanged` (type: `boolean`):

Remember what earlier runs of this search returned and output only new items or items whose price/status changed. Use with a Schedule; unchanged items are not charged. Here: news headlines are output once, when they first appear. Ticker results, list rows and search results are always output.

## `monitoringKey` (type: `string`):

Name for this watch, so several schedules on the same search stay separate; defaults to a key derived from the search input.

## `maxItems` (type: `integer`):

Stop after this many results in total (tickers + headlines + list rows + search results + price bars). Keeps cost predictable.

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

Apify datacenter proxy works and is the cheapest; each IP gets its own Yahoo cookie and crumb, and throttled IPs are replaced automatically. If datacenter IPs keep getting throttled, the run switches to RESIDENTIAL when your plan has it.

## Actor input object example

```json
{
  "tickers": [
    "AAPL",
    "MSFT",
    "SPY",
    "BTC-USD"
  ],
  "includeQuote": true,
  "includeProfile": true,
  "includeStatistics": true,
  "includeAnalysts": true,
  "includeEarnings": true,
  "includeFinancials": false,
  "financialsPeriod": "annual",
  "includeHistory": false,
  "historyStart": "1 year",
  "historyInterval": "1d",
  "historyAsRows": false,
  "includeNews": false,
  "maxNewsPerTicker": 10,
  "maxResultsPerList": 25,
  "maxSearchResults": 10,
  "onlyNewOrChanged": false,
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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",
        "SPY",
        "BTC-USD"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

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

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

```

## MCP server setup

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