# Yahoo Finance Stock Price Scraper - Quotes, History & Dividends (`neverempty/yahoo-finance-stock-price-scraper`) Actor

Get Yahoo Finance stock prices by ticker or company name: latest quote, change vs previous close, OHLCV history from 1-minute to monthly bars, dividends and splits. One row per symbol or one row per bar. Monitoring mode returns a symbol only when its price moves past your threshold.

- **URL**: https://apify.com/neverempty/yahoo-finance-stock-price-scraper.md
- **Developed by:** [NeverEmpty](https://apify.com/neverempty) (community)
- **Categories:** Business, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.46 / 1,000 symbol row returneds

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 Stock Price Scraper - Quotes, History & Dividends

Get **stock prices from Yahoo Finance** for a list of tickers or company names: the **latest price**, the **change from the previous close**, the day's open, high, low and volume, the 52-week range, and **price history (OHLCV)** from 1-minute to quarterly bars, with **dividends and stock splits**. Works for US and international stocks (`7203.T`, `VOD.L`), ETFs, mutual funds, indices (`^GSPC`), futures, currencies and crypto.

Choose **one row per symbol** (the quote plus the whole history in a list) or **one row per price bar**, ready for a spreadsheet. Turn on **monitoring mode**, schedule the Actor, and a run returns a symbol **only when its price moved** by your threshold.

No API key and no Yahoo account are needed.

### What you can use it for

- **Portfolio and watchlist tracking**: the latest price and daily change for all your tickers in one table, on a schedule.
- **Backtesting and research**: daily, weekly or monthly OHLCV history back to a stock's first trading day, with adjusted closes, dividends and splits.
- **Intraday analysis**: 1-minute to 4-hour bars for recent days.
- **Price alerts**: monitoring mode returns only the symbols that moved by at least your threshold since the row last returned for them.
- **Dividend research**: every dividend and split in a period, with its date and amount or ratio.

### How it works

1. For each symbol the Actor reads Yahoo Finance's public chart data (`https://query1.finance.yahoo.com/v8/finance/chart/<symbol>`), the data source the Yahoo Finance website uses for its charts. It checks that Yahoo answered for **the same symbol you asked for**.
2. The quote is read with a one-day request, because only that request gives the previous day's close: in a longer request Yahoo's "previous close" is the close before the start of the range (for Apple on 2026-09-16 a one-month request gave `305.93`, the close a month earlier, while the previous day's close was `331.34`). The change is computed from that close and the latest price, and Yahoo's own percent is passed through separately as `yahooChangePercent`.
3. If price history is on, a second request reads the bars for your range and interval (1-minute bars are read in 7-day pieces, because Yahoo returns at most 8 days of them per request).
4. Company names are looked up with Yahoo Finance search (`/v1/finance/search`); the first stock, ETF, fund or index in Yahoo's answer is used and every row shows what was matched.
5. Unknown symbols, unmatched names, settings Yahoo does not allow and rate limits come back as **free rows** that say why.

Company financials (income statements, balance sheets) are not included: Yahoo's endpoint for them needs a session token and answered HTTP 401 when tried from Apify on 2026-09-16 (UTC).

### Input

| Field | Default | What it does |
| --- | --- | --- |
| `symbols` | example symbols | Yahoo Finance symbols, one per line (commas also separate entries). Lower case is accepted. A repeated symbol is read and charged once; the repeat gets a free `duplicate` row. |
| `companyNames` | - | Company names to look up with Yahoo search, one per line. |
| `outputFormat` | `symbol` | `symbol` = one row per symbol with the history in a list; `bar` = one row per price bar, dividend or split. |
| `includeHistory` | `true` | Symbol format: include the price bars, dividends and splits. Off = latest quote only (one request per symbol). |
| `range` | `1mo` | How far back the history goes: `1d`, `5d`, `1mo`, `3mo`, `6mo`, `1y`, `2y`, `5y`, `10y`, `ytd` or `max`. Ignored when `startDate` is set. |
| `startDate` | - | `YYYY-MM-DD`: history from this date (the exchange's local date) instead of `range`. |
| `endDate` | - | `YYYY-MM-DD`, included. Needs `startDate`. |
| `interval` | `1d` | Bar length: `1m`, `2m`, `5m`, `15m`, `30m`, `60m`, `90m`, `1h`, `4h`, `1d`, `5d`, `1wk`, `1mo`, `3mo`. |
| `includeEvents` | `true` | Include dividends and splits inside the history period. |
| `maxResults` | 1,000 symbol rows / 10,000 bar rows | The most charged rows per run. |
| `monitoringMode` | `false` | Return a symbol only when its price moved by at least `thresholdPercent` since the row last returned for it. |
| `thresholdPercent` | `1` | Monitoring mode: the smallest move, in percent up or down, that returns a symbol. |
| `resetMonitoringState` | `false` | Forget every remembered price and start a fresh baseline. Turn it off again after one run. |
| `useProxy` | `true` | Retry a request through an Apify proxy only if Yahoo rate-limits it. |

```json
{
    "symbols": ["AAPL", "MSFT", "7203.T", "^GSPC"],
    "companyNames": ["Nvidia"],
    "range": "1y",
    "interval": "1d"
}
```

If you leave out both `symbols` and `companyNames` with monitoring off, the example symbols `AAPL`, `MSFT` and `7203.T` are read (the run log says so and every row shows them in `input`). In monitoring mode one of the two fields is required, so a schedule never pays to watch the examples. An empty list is rejected with a free `invalid-input` row.

#### Symbols

Use the symbol exactly as Yahoo Finance writes it: `AAPL`, `BRK-B` (share classes take a dash; `BRK.B` is not found), `7203.T` (Tokyo), `VOD.L` (London), `^GSPC` (S\&P 500), `ES=F` (futures), `EURUSD=X` (currency), `BTC-USD` (crypto). Entries with a space are not split into symbols: put company names in `companyNames`.

#### Company names

Yahoo search usually lists the main US listing first: on 2026-09-16 (UTC) `Toyota Motor` gave `TM` (NYSE) and `Sony Group` gave `SONY` (NYSE), not `7203.T` or `6758.T` in Tokyo. Futures on the same company (for example `SAAPL=F`) are skipped. Check `searchMatchName` and `searchMatchExchange`, and use the symbol when you need a specific listing.

#### Allowed intervals and ranges

Yahoo keeps intraday bars only for a limited time (from Yahoo's own error messages, 2026-09-16 UTC):

| Interval | Yahoo keeps | `range` values accepted | Oldest `startDate` accepted |
| --- | --- | --- | --- |
| `1m` | last 30 days, at most 8 days per request | `1d`, `5d` | 28 days back |
| `2m`, `5m`, `15m`, `30m`, `90m` | last 60 days | `1d`, `5d`, `1mo` (`ytd` in the first 60 days of a year) | 58 days back |
| `60m`, `1h`, `4h` | last 730 days | `1d` to `2y`, and `ytd` | 728 days back |
| `1d`, `5d`, `1wk`, `1mo`, `3mo` | full history | all | any |

Other combinations are rejected before anything is requested, with a free `invalid-input` row that says why. With `range: "max"`, Yahoo silently returns 3-month bars when asked for weekly or monthly ones, so this Actor asks for the full period by dates instead, and it never sells bars of a different interval than the one you chose (they get a free `interval-changed-by-yahoo` row).

Weekly, 5-day, monthly and quarterly bars are cut at the edges of what you ask for: with `range: "1mo"` or a From date in the middle of a week, the first weekly bar covers only the days inside the range, so its open and volume differ from the full week on Yahoo's chart.

### Output

#### Symbol format (default)

One row per symbol. Shortened (2 of 22 bars shown); read from Apify's servers on 2026-09-16 at 15:28 UTC, during the US trading session:

```json
{
    "status": "ok",
    "rowType": "symbol",
    "input": "AAPL",
    "inputKind": "symbol",
    "symbol": "AAPL",
    "name": "Apple Inc.",
    "shortName": "Apple Inc.",
    "instrumentType": "EQUITY",
    "currency": "USD",
    "exchange": "NMS",
    "exchangeName": "NasdaqGS",
    "exchangeTimezone": "America/New_York",
    "yahooUrl": "https://finance.yahoo.com/quote/AAPL",
    "price": 332.51,
    "priceTime": "2026-09-16T15:28:48.000Z",
    "priceLocalTime": "2026-09-16T11:28:48",
    "marketState": "regular-session",
    "previousClose": 331.34,
    "change": 1.17,
    "changePercent": 0.3531116074,
    "dayChangeStatus": "ok",
    "yahooChangePercent": 0.353,
    "dayOpen": 332.42,
    "dayHigh": 335.48,
    "dayLow": 331.87,
    "dayVolume": 10570989,
    "fiftyTwoWeekHigh": 344.57,
    "fiftyTwoWeekLow": 236.65,
    "firstTradeDate": "1980-12-12T14:30:00.000Z",
    "historyInterval": "1d",
    "historyRange": "1mo",
    "barCount": 22,
    "barsWithoutClose": 0,
    "bars": [
        {
            "date": "2026-09-15",
            "time": "2026-09-15T13:30:00.000Z",
            "localTime": "2026-09-15T09:30:00",
            "open": 330.14,
            "high": 331.78,
            "low": 328.35,
            "close": 331.34,
            "adjClose": 331.34,
            "volume": 31694100,
            "isIncomplete": false,
            "closeFromQuote": false
        },
        {
            "date": "2026-09-16",
            "time": "2026-09-16T13:30:00.000Z",
            "localTime": "2026-09-16T09:30:00",
            "open": 332.42,
            "high": 335.48,
            "low": 331.87,
            "close": 332.53,
            "adjClose": 332.53,
            "volume": 10571255,
            "isIncomplete": true,
            "closeFromQuote": false
        }
    ],
    "dividends": [],
    "splits": [],
    "historyStatus": "ok",
    "searchMatchName": null,
    "searchMatchExchange": null,
    "monitorStatus": null,
    "thresholdPercent": null,
    "isFirstCheck": null,
    "previousReturnedPrice": null,
    "previousReturnedPriceTime": null,
    "previousReturnedAt": null,
    "previousCurrency": null,
    "priceMove": null,
    "priceMovePercent": null,
    "source": "yahoo-finance",
    "scrapedAt": "2026-09-16T15:28:48.000Z"
}
```

- `price`, `priceTime`: Yahoo's latest regular-market price and the time of that trade. Yahoo does not say whether a quote is real-time or delayed; for many exchanges Yahoo's own site shows delayed quotes.
- `marketState`: `regular-session`, `pre-market`, `post-market` or `closed`, from Yahoo's trading periods at the time of the run. For 24-hour markets (crypto) the whole day counts as `regular-session`.
- `previousClose`, `change`, `changePercent`: computed from the previous day's close. `dayChangeStatus` is `ok`, `no-previous-close`, `previous-close-not-confirmed`, or `not-provided-for-this-instrument-type` for crypto, currencies and other 24-hour instruments. The computed percent is checked against Yahoo's own percent; if they differ by more than 0.01 percentage points (or Yahoo gives none), no previous close is sold and the status is `previous-close-not-confirmed`: on 2026-09-16 UTC Yahoo's one-day "previous close" for the Hang Seng index (`^HSI`) was the close of 2026-09-14, two trading days back (`24917.6`), which would have turned Yahoo's +0.189% into -0.818%. For crypto and currencies: for `BTC-USD` on 2026-09-16 Yahoo's one-day "previous close" (`75586.51`) did not match Yahoo's own daily change (`-845` from `75619.95`), so no previous close is sold for them. `yahooChangePercent` is Yahoo's own number, passed through unchanged.
- `bars[]`: oldest first. `open`, `high`, `low` and `close` are **adjusted for splits by Yahoo** (NVIDIA's close on 2024-06-03, before its 10-for-1 split on 2024-06-10, comes back as `115`); `adjClose` is also adjusted for dividends (daily and longer bars only). `date` and `localTime` are in the exchange's time zone, `time` is UTC.
- `isIncomplete`: `true` for the last bar while its period is still running (today's daily bar during the session, the current week or month, the latest intraday bar during the session). During trading Yahoo sends the latest price as a separate piece at the end of the chart; the Actor merges it into the bar of the same period (high and low combined, close from the latest price, volumes added), so the current week or month is one bar, not two.
- `barsWithoutClose`: Yahoo sometimes sends bars with no closing price (for Toyota `7203.T` on 2026-09-16 the finished day's bar had no close; 1-minute bars also contain some). Those bars are **left out and counted here**. The one exception: if the last daily bar has no close and is the same trading day as the quote, its close is filled with Yahoo's quote price and `closeFromQuote` is `true`.
- Prices in bars are sent by Yahoo with float rounding noise (`333.1050109863281`); they are returned as the shortest decimal that is the same number (`333.105`).
- `dividends[]`: `date`, `time`, `amount` (per share, in the symbol's currency). `splits[]`: `date`, `time`, `numerator`, `denominator`, `ratio` (for example `"10:1"`).
- `historyStatus`: `ok`, or `not-requested` when price history is off or in monitoring mode (then `bars`, `dividends`, `splits` and the other history columns are `null`).

#### Bar format (`outputFormat: "bar"`)

One row per price bar, plus one row per dividend and per split (`rowType` is `bar`, `dividend` or `split`), **newest first**:

```json
{
    "source": "yahoo-finance",
    "status": "ok",
    "scrapedAt": "2026-09-16T15:28:48.000Z",
    "input": "MSFT",
    "symbol": "MSFT",
    "name": "Microsoft Corporation",
    "currency": "USD",
    "exchange": "NMS",
    "exchangeTimezone": "America/New_York",
    "interval": "1d",
    "rowType": "dividend",
    "date": "2026-08-20",
    "time": "2026-08-20T13:30:00.000Z",
    "localTime": null,
    "open": null,
    "high": null,
    "low": null,
    "close": null,
    "adjClose": null,
    "volume": null,
    "isIncomplete": null,
    "closeFromQuote": null,
    "dividendAmount": 0.91,
    "splitRatio": null,
    "splitNumerator": null,
    "splitDenominator": null
}
```

Bar rows fill `open`, `high`, `low`, `close`, `adjClose`, `volume`, `isIncomplete`, `closeFromQuote` and `localTime`; split rows fill `splitRatio`, `splitNumerator` and `splitDenominator`. When `maxResults` or your maximum total charge stops a symbol's rows, the oldest ones are left out and a free row says how many.

#### Monitoring mode

With `monitoringMode` on, a symbol row is returned only when:

| `monitorStatus` | When |
| --- | --- |
| `"first-check"` | The symbol (with this threshold) has not been returned before. |
| `"price-moved"` | `price` moved by at least `thresholdPercent` percent, up or down, from the price in the row last returned for it. |
| `"currency-changed"` | Yahoo now quotes the symbol in a different currency than in that row (prices are not compared). |
| `"previous-price-missing"` | The remembered row has no usable price, so this row starts a new baseline. |

The move is measured from the **last returned** price, not from the last check, so a slow drift is returned once it adds up to the threshold. `previousReturnedPrice`, `previousReturnedPriceTime`, `previousReturnedAt`, `priceMove` and `priceMovePercent` show the comparison. Prices are remembered per symbol and threshold in a store named `yahoo-finance-monitoring`; two schedules that can run at the same time should not watch the same symbol with the same threshold (Apify's key-value store has no atomic update, so their records can overwrite each other).

#### Rows that are not charged

| `status` | Meaning |
| --- | --- |
| `symbol-not-found` | Yahoo answered HTTP 404 ("No data found, symbol may be delisted"). Yahoo gives this for symbols that never existed and for delisted ones alike (`TWTR` on 2026-09-16 UTC), so the row does not say which. |
| `different-symbol-returned` | Yahoo answered for another symbol than the one asked for. |
| `refused-by-yahoo` | Yahoo refused the request (HTTP 400 or 422); its message is in `note`. |
| `no-bars-returned` | Yahoo answered but sent no bars with a closing price for the range and interval (on 2026-09-16 UTC it did so for 2-minute bars 52 to 59 days back, inside its 60-day window). This does not claim there was no trading. |
| `interval-changed-by-yahoo` | Yahoo sent bars of a different interval than requested. |
| `no-search-match` | Yahoo search returned no stock, ETF, fund or index for a company name, even when asked twice (on 2026-09-16 UTC it once answered "Apple" with nothing and gave `AAPL` on the next request). |
| `blocked` | Yahoo answered with a rate limit, an error page or nothing, even after retries. |
| `unreadable` | Yahoo's answer could not be read. |
| `invalid-input` | The entry is not a symbol, or the settings are not allowed; nothing was requested. |
| `row-too-large` | The symbol row with its history is larger than one Apify dataset item can hold (about 9.4 MB, for example 1-minute bars of a crypto pair for four weeks). Use `outputFormat: "bar"` or a shorter range. |
| `duplicate` | The same symbol appeared earlier in the list. |
| `no-change` | Monitoring mode: no symbol moved by the threshold. |
| `not-checked` | Entries or bars left out because of `maxResults` or the 1,000-entry limit. |
| `budget-reached` | Entries or bars left out because the run's maximum total charge was reached. |

### Pricing

Pay per event:

- **$2.00 per 1,000 symbol rows** (`outputFormat: "symbol"`), charged only for rows with `status: "ok"`. One symbol row carries the whole history for your range at the same price: Apple with every daily bar since 1980 (about 11,500 bars) is one row. A row that would be larger than an Apify dataset item allows is not returned (free `row-too-large` row).
- **$0.50 per 1,000 bar rows** (`outputFormat: "bar"`), charged for each price bar, dividend and split row with `status: "ok"`. One year of daily bars for one stock is about 250 rows ($0.125).
- **$0.30 per 1,000 symbol checks** in monitoring mode: every symbol whose quote is read costs a check, moved or not, plus the symbol row price for the rows returned. 50 symbols every 15 minutes during a 6.5-hour US trading day, 22 days a month, is 28,600 checks, which is **$8.58**.

Free rows (the table above) are never charged. Set a maximum total charge on the run to cap the cost: the Actor stops reading before it would go over and says so in a free row.

### Good to know

- **This is not an official Yahoo API.** The Actor reads the public data endpoints the Yahoo Finance website uses. Yahoo can change or limit them at any time, and Yahoo's terms restrict how its data may be used and redistributed: check that your use is allowed.
- **Not investment advice.** Prices are returned as Yahoo publishes them, without any guarantee of accuracy or timeliness.
- The numbers in this README were measured from Apify's servers on 2026-09-16 (UTC) and can change.
- Requests are sent one at a time with a pause between them. If Yahoo rate-limits a request (HTTP 429), the Actor waits and retries, through a proxy if `useProxy` is on.
- If Apify restarts or moves a run, it continues where it stopped and does not charge again for rows already in the dataset.

### FAQ

**Does it return real-time prices?** It returns the latest price Yahoo's chart data has at the moment of the run, with its trade time in `priceTime`. Yahoo does not mark whether that price is delayed.

**Can I get the full history of a stock?** Yes: `range: "max"` with a daily, weekly, monthly or quarterly interval.

**Why is `change` empty for Bitcoin?** 24-hour markets have no single previous close; see `dayChangeStatus`. `yahooChangePercent` still carries Yahoo's own number.

**Why is a symbol from another exchange not found?** Add Yahoo's exchange suffix (`.T` Tokyo, `.L` London, `.DE` XETRA, `.TO` Toronto, `.HK` Hong Kong).

# Actor input Schema

## `symbols` (type: `array`):

Yahoo Finance symbols, one per line (commas also separate entries): stocks such as AAPL or BRK-B, other exchanges with Yahoo's suffix such as 7203.T (Tokyo) or VOD.L (London), indices such as ^GSPC, ETFs, mutual funds, futures such as ES=F, currencies such as EURUSD=X and crypto such as BTC-USD. Lower case is accepted. A repeated symbol is read and charged once and the repeat gets a free 'duplicate' row. If you leave both this field and Company names out with monitoring off, three example symbols are read; with monitoring on, one of them is required.

## `companyNames` (type: `array`):

Company names to look up, one per line, for example Microsoft or Toyota Motor. Each name is sent to Yahoo Finance search and the first stock, ETF, fund or index Yahoo lists is used; every row shows the name and exchange Yahoo matched (searchMatchName, searchMatchExchange), so check them. Yahoo usually lists the main US listing first (Toyota Motor gives TM on NYSE, not 7203.T in Tokyo): for another listing, give its symbol instead. A name Yahoo does not match gets a free row.

## `outputFormat` (type: `string`):

symbol = one row per symbol: the latest price, the change from the previous close, the day's range and volume, the 52-week range, and (if price history is on) all price bars in a 'bars' list plus dividends and splits; charged per symbol row. bar = one row per price bar (date, open, high, low, close, adjusted close, volume) and one row per dividend or split, newest first, ready for a spreadsheet; charged per row at the lower bar price. Monitoring mode needs 'symbol'.

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

On = each symbol row also carries the price bars for the range and interval below, with dividends and splits. Off = the latest quote only (one request per symbol). The price per symbol row is the same either way. Always on in the bar format; never read in monitoring mode.

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

How far back the price history goes, counted back from now. Ignored when From date is set. 'max' is the whole history Yahoo has (Apple: from 1980-12-12, about 11,500 daily bars). Intraday intervals only allow short ranges: 1m up to 5d, 2m to 90m up to 1mo, 60m/1h/4h up to 2y or year to date.

## `startDate` (type: `string`):

YYYY-MM-DD. Returns bars from this date (the exchange's local date) instead of using History range. Yahoo keeps 1m bars for the last 30 days (a From date up to 28 days back is accepted), 2m to 90m bars for 60 days (up to 58 days back) and 60m/1h/4h bars for 730 days (up to 728 days back); daily and longer bars go back to the first trading day.

## `endDate` (type: `string`):

YYYY-MM-DD, included. Leave empty to go up to the latest bar. Needs From date. Weekly, 5-day, monthly and quarterly bars are cut at From date and To date: the first and last of them can cover only part of their week, month or quarter.

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

The length of one price bar. 1d = daily. Settings Yahoo does not allow (for example 1m bars for a month, or 1h bars for 5 years) are rejected before anything is requested, with a free row that says why.

## `includeEvents` (type: `boolean`):

On = dividends and stock splits inside the history period are returned (a list in the symbol format, their own rows in the bar format). Off = price bars only.

## `maxResults` (type: `integer`):

The most charged rows one run returns. Leave empty for the default: 1,000 in the symbol format, 10,000 in the bar format. In the bar format rows are returned newest first, so a limit drops the oldest bars and a free row says how many were left out. In monitoring mode it does not limit the symbols returned. Up to 1,000 symbols or names are read per run.

## `monitoringMode` (type: `boolean`):

Off = every symbol comes back with its current quote, charged per row. On = the Actor remembers the price in the row it last returned for each symbol and, on later runs, returns a symbol only when its latest price moved by at least the threshold below since then (or its currency changed), with the move in price and percent. The first run returns every symbol once to set the baseline. Prices do not move while a market is closed. Price history is not read in monitoring mode. **Every symbol whose quote is read costs $0.30 per 1,000 checks, moved or not** (symbols Yahoo does not know, unmatched names and rate-limited requests are free), plus the symbol row price for the rows returned. Example: 50 symbols every 15 minutes during a 6.5-hour US trading day, 22 days a month = 28,600 checks = $8.58. The Actor reads only as many symbols as the run's maximum total charge can pay for with a check and a row each. Prices are remembered per symbol and threshold; do not put the same symbol with the same threshold in two schedules that can run at the same time.

## `thresholdPercent` (type: `number`):

Monitoring mode only: a symbol is returned when its latest price differs by this many percent or more from the price in the row last returned for it. 1 = a move of 1% up or down. From 0.01 to 1000.

## `resetMonitoringState` (type: `boolean`):

Clears every remembered price for this Actor, so the next monitoring run returns each symbol once again as a first check. This affects all your monitoring runs. Turn it off again after one run: left on in a schedule, every run returns every symbol as a first check and charges the row price for it.

## `useProxy` (type: `boolean`):

Every request is sent directly first. Only if Yahoo answers with a rate limit (HTTP 429), an error page or no response is that request retried through an Apify proxy session, with pauses; the next request is sent directly again. With it off, those requests are retried directly and then returned as a free 'blocked' row, and no proxy is paid for.

## Actor input object example

```json
{
  "symbols": [
    "AAPL",
    "MSFT",
    "7203.T"
  ],
  "outputFormat": "symbol",
  "includeHistory": true,
  "range": "1mo",
  "interval": "1d",
  "includeEvents": true,
  "monitoringMode": false,
  "thresholdPercent": 1,
  "resetMonitoringState": false,
  "useProxy": true
}
```

# Actor output Schema

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

In the symbol format, one row per symbol: the name, exchange, currency and instrument type, the latest price and its time, the market state, the previous close with the change in price and percent, the day's open, high, low and volume, the 52-week range, and the price bars, dividends and splits for the chosen range and interval; in monitoring mode also the move since the row last returned for the symbol. In the bar format, one row per price bar, dividend or split. Unknown symbols, unmatched company names, rate limits and invalid input come back as free rows that say why.

# 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 = {
    "symbols": [
        "AAPL",
        "MSFT",
        "7203.T"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("neverempty/yahoo-finance-stock-price-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 = { "symbols": [
        "AAPL",
        "MSFT",
        "7203.T",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("neverempty/yahoo-finance-stock-price-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 '{
  "symbols": [
    "AAPL",
    "MSFT",
    "7203.T"
  ]
}' |
apify call neverempty/yahoo-finance-stock-price-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,neverempty/yahoo-finance-stock-price-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/luq7gGkYgtwsXHjLC/builds/1hxNeBgCgmNziKbIO/openapi.json
