# Yahoo Finance Quotes & Fundamentals Watchlist (`maydit/yahoo-finance-quote-fundamentals-monitor`) Actor

Get source-dated Yahoo Finance quotes, valuation ratios, dividends and fundamentals for a ticker watchlist. Compare saved changes, export clean rows and see delayed-data coverage. No API key.

- **URL**: https://apify.com/maydit/yahoo-finance-quote-fundamentals-monitor.md
- **Developed by:** [Brandt May](https://apify.com/maydit) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.60 / 1,000 saved observations

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 Quotes & Fundamentals Watchlist

**A ticker list in. Source-dated quotes and useful fundamentals out.** Read the public Yahoo Finance overview for each symbol, export a clean table, and compare it with your last complete watchlist check.

Start with `AAPL`. There is no API key, login, proxy setup or external subscription to configure. Each result keeps the quote's currency, source market time and reported exchange delay alongside the collection time, so a dashboard or AI workflow can tell what it actually received.

### Start in one minute

1. Paste Yahoo Finance tickers, or plain quote overview URLs, into **Ticker watchlist**.
2. Keep **Maximum saved quotes** at least as large as the list. Set an appropriate maximum charge in Apify Run options.
3. Run the Actor, then open **Quote watchlist** in the dataset. JSON and CSV exports are available; **RUN_REPORT** explains source coverage and limits.

```json
{
  "symbols": ["AAPL"],
  "maxResults": 1
}
```

### What you receive

| Output | Useful fields |
| --- | --- |
| Identity and provenance | `symbol`, `name`, `quoteType`, `sourceUrl`, `observedAt` |
| Regular market quote | `price`, `change`, `changePercent`, `open`, `previousClose`, `dayHigh`, `dayLow`, `volume` |
| Currency and freshness evidence | `currency`, `sourceMarketTime`, `quoteAgeSeconds`, `exchangeName`, `marketState`, `exchangeDelayMinutes` |
| Extended sessions, when supplied | `preMarketPrice` / `preMarketTime`, `postMarketPrice` / `postMarketTime` |
| Valuation and dividends | `marketCap`, `trailingPE`, `forwardPE`, `priceToBook`, `beta`, `dividendRate`, `dividendYieldPercent`, `exDividendDate` |
| Selected fundamentals | `trailingEps`, `forwardEps`, `sharesOutstanding`, `financialCurrency`, `totalRevenue`, `totalDebt`, `totalCash`, `freeCashflow`, `operatingCashflow`, `profitMarginPercent`, `revenueGrowthPercent`, `mostRecentQuarter` |
| Coverage and changes | `availableModules`, `missingFields`, `comparisonStatus`, `changedFields`, `previous`, `previousObservedAt`, `contentHash` |

**Units stay explicit.** Fields ending in `Percent` use percentage points: a source ratio of `0.0032` becomes `0.32`, meaning 0.32%. P/E, beta and price-to-book remain ratios. Quote values use `currency`; financial totals retain the separate `financialCurrency`. The Actor does not convert currencies, reconcile reporting periods or substitute a different field when a value is missing.

Missing optional fields are `null`, with their names in `missingFields`. A successful quote can legitimately have no company fundamentals, for example when the source does not provide those modules. `mostRecentQuarter` is the source's statistics date; it does not assert that every financial field covers that same quarter.

The dataset includes three ready-to-use views: **Quote watchlist**, **Valuation and fundamentals**, and **Market and collection evidence**. The HTML run report is self-contained and creates no additional paid rows.

### Three practical recipes

#### 1. Inspect one public stock quote

```json
{
  "symbols": ["AAPL"],
  "maxResults": 1
}
```

Use this to check the output shape and source timestamps before building a larger workflow.

#### 2. Compare a two-symbol watchlist

```json
{
  "symbols": ["AAPL", "MSFT"],
  "maxResults": 2,
  "comparePrevious": true,
  "snapshotName": "technology-watchlist"
}
```

The first complete run establishes a baseline. Later runs identify exact changed quote and fundamental fields and retain their previous values. A changed price is an observation between checks, not an alert delivered at the moment of the market change.

#### 3. Read an independent Microsoft quote URL

```json
{
  "symbols": ["https://finance.yahoo.com/quote/MSFT/"],
  "maxResults": 1,
  "comparePrevious": false
}
```

Plain overview URLs are accepted. Other Yahoo sections, query parameters, fragments and external hosts are rejected so the input stays predictable.

### Save only the changes

Set `onlyChanges: true` on the same symbols and `snapshotName`. This also enables comparison. Unchanged observations are skipped without a result charge; the first complete comparison still emits the initial records. Times alone—collection time, source quote time and computed quote age—do not create a change when the compared values are otherwise identical.

Saved history belongs to the Actor's named key-value store, isolated by the sorted symbol set and baseline label. Changing either starts a separate baseline. Run one writer per baseline at a time; the Actor detects a changed baseline before writing, but this is not a distributed transaction lock. Deleting the named history store starts comparison again.

**Partial runs never advance the baseline.** A failed symbol, blocked page, time limit, result limit, spending cap, output error or detected concurrent writer leaves the previous complete watchlist intact. A missing or delisted symbol does not become a fabricated zero-price or deletion row. Check `SUMMARY.incomplete`, `failedSources`, `sourcesNotReached` and `historyUpdated` before interpreting a run as a full check.

### Pricing and bounded collection

Pricing is **$0.001 per saved quote** ($1 per 1,000), plus the **$0.00005 Actor Start event** at this Actor's supported memory settings. Apify platform usage is separate. A successful 20-symbol run has $0.02005 in these Actor event fees before platform usage. Source errors, unchanged observations skipped by `onlyChanges`, and the run report do not create result charges.

The Actor accepts up to 20 unique symbols, at most 25 HTTP requests including robots checks, a 30–120 second input time budget and a 4 MB quote-page response limit. Requests to the same origin are spaced at least one second apart. The platform run timeout or spending cap can end work earlier. Reaching a cap can leave partial output; the summary and history behavior remain explicit.

### Source scope and reliability

The source is the **public Yahoo Finance quote overview page**. The parser validates a single embedded quote-summary result against the requested symbol. It does not use the first price found in a page, which may belong to a market index or recommended ticker.

The Actor follows the public site's robots rules and reads only the JSON already delivered inside that permitted HTML page. It does not call Yahoo's internal quote APIs, obtain session crumbs, send login cookies, follow arbitrary data links or use proxies. A source block or rate limit stops remaining requests to that source. No challenge bypass or alternate-endpoint retry is attempted.

Quotes may be delayed or stale, especially outside market hours. A source label containing “real time” is not a freshness guarantee; compare `sourceMarketTime`, `observedAt`, `exchangeDelayMinutes` and `marketState`. This Actor is a research-data input, not a trading execution feed or financial advice. It does not include historical OHLCV series, options chains, premium research, financial statements by reporting period, analyst recommendations, personal company-officer data or authenticated content. Availability and fields vary by symbol, region and source changes. Respect source terms and data-use rights for your intended workflow.

### Automation and AI use

Save a task with your watchlist, then schedule it in Apify at a cadence appropriate for the source and your budget. Export the dataset to a spreadsheet or read it through the Actor's Apify API/MCP integration. This Actor does not create schedules or send notifications on your behalf.

For an AI consumer, pass the values **together with** the source URL, market timestamp, currency and coverage result. An old source quote is not made current by a recent `observedAt`; `SUMMARY.status: "partial"` must remain visible in downstream decisions.

Useful companion tools: [SEC EDGAR filings](https://apify.com/maydit/sec-edgar-filings-scraper) for original filings and [major shareholder changes](https://apify.com/maydit/major-shareholder-change-monitor) for filing-based ownership observations. Browse the [Mayd It data tools](https://mayd-it.com/data-tools/) for additional workflows.

### Troubleshooting

| Outcome | Next step |
| --- | --- |
| Unknown ticker or HTTP 404 | Open the exact public quote URL and confirm the Yahoo ticker. No error row is billed. |
| HTTP 403/429 or robots restriction | Wait for source access to recover. The Actor does not bypass restrictions. |
| Source shape or identity error | Review `SUMMARY`; the Actor refuses ambiguous or mismatched data rather than inventing a record. |
| Some fundamentals are null | Check `availableModules` and `missingFields`; the source may not supply them for this asset. |
| Zero rows with `onlyChanges` | Confirm the whole watchlist succeeded and `unchangedSkipped` explains the result. |
| History was not updated | Resolve the incomplete run or concurrent writer, then retry the full watchlist with the same label. |

For a reproducible problem, open an issue with the run link and a non-sensitive input example. Include the symbol and source URL, not account credentials.

# Actor input Schema

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

Yahoo symbols, such as AAPL, MSFT or BRK-B, or https://finance.yahoo.com/quote/AAPL/. Only public overview pages; no query parameters or other hosts. Duplicate symbols are removed. Empty input uses AAPL.

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

One paid row per successful symbol. Keep this at least as large as your watchlist for complete coverage and baseline updates. Errors and skipped unchanged observations are not paid rows.

## `comparePrevious` (type: `boolean`):

Records new, changed and unchanged quotes with exact changed fields and previous values. Observation times and quote timestamps alone do not count as changes. History updates only after the complete watchlist and output succeed.

## `onlyChanges` (type: `boolean`):

Enables comparison and skips unchanged observations without a result charge. The first comparison emits all successful symbols. Use the same symbols and baseline label on later runs.

## `snapshotName` (type: `string`):

Use1–80 letters, numbers, underscores or hyphens. Keep the same label and symbols for repeat checks; run one writer per baseline at a time.

## `maxRunSeconds` (type: `integer`):

30–120 seconds, at least one second per source origin between requests. Source blocks stop collection without bypasses; partial runs do not advance history.

## Actor input object example

```json
{
  "symbols": [
    "AAPL"
  ],
  "maxResults": 20,
  "comparePrevious": false,
  "onlyChanges": false,
  "snapshotName": "default",
  "maxRunSeconds": 90
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `report` (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 = {
    "symbols": [
        "AAPL"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maydit/yahoo-finance-quote-fundamentals-monitor").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"] }

# Run the Actor and wait for it to finish
run = client.actor("maydit/yahoo-finance-quote-fundamentals-monitor").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"
  ]
}' |
apify call maydit/yahoo-finance-quote-fundamentals-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maydit/yahoo-finance-quote-fundamentals-monitor"
        }
    }
}
```

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/pqQ61QgSYWnGjiAwX/builds/G7NtK6BFdgJsPH9TS/openapi.json
