# Finviz Stock Quote & News Scraper (`automation-lab/finviz-stock-quote-news-scraper`) Actor

Extract Finviz quotes, fundamentals, valuation, growth, ownership, margins, technical indicators, price, volume, and timestamped company news. No Finviz login or API key required.

- **URL**: https://apify.com/automation-lab/finviz-stock-quote-news-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

## Finviz Stock Quote & News Scraper

Extract **Finviz stock quotes, fundamentals, valuation ratios, technical indicators, and company news** for any ticker symbol. This Finviz scraper accepts a watchlist or public quote URLs and returns one export-ready record per stock — no Finviz login or API key required.

Use it to refresh portfolio snapshots, monitor company headlines, enrich research databases, or supply structured market context to AI and quant workflows. The Actor uses lightweight HTTP extraction rather than a browser, so small watchlists finish quickly and economically.

### What does Finviz Stock Quote & News Scraper do?

Finviz Stock Quote & News Scraper reads public ticker quote pages such as `quote.ashx?t=AAPL` and transforms their server-rendered tables into clean JSON.

For every ticker, it collects:

- 📈 Current price, daily change, volume, and relative volume
- 💰 Market cap, P/E, forward P/E, PEG, P/S, P/B, and enterprise-value ratios
- 🧾 Income, sales, book value, cash per share, dividends, debt, and liquidity
- 🚀 EPS and sales growth across quarterly and multi-year windows
- 🏢 Insider and institutional ownership, transactions, employees, and IPO date
- 📊 Margins, returns, moving averages, RSI, beta, volatility, and performance
- 📰 Recent news with timestamps, headlines, publishers, and outbound article URLs

Every original Finviz snapshot label remains available in the `metrics` object, while popular fields are also normalized into typed top-level columns for easy filtering.

### Who is this Finviz scraper for?

**Investors and portfolio managers**

- Refresh watchlist valuation and momentum snapshots before market review
- Compare price, volume, technical, profitability, and ownership signals
- Monitor recent headlines around held or prospective positions

**Quant analysts and data scientists**

- Collect consistent point-in-time features for research pipelines
- Join Finviz metrics with price history, SEC filings, or alternative datasets
- Feed structured fundamentals and news links into scoring or alert systems

**Financial-data and FinTech teams**

- Enrich internal security masters with public company attributes
- Power research dashboards without maintaining a browser crawler
- Schedule repeat quote extraction through Apify API or webhooks

**AI workflow builders**

- Give agents concise company and market context for a ticker list
- Build daily briefings from fresh metrics and linked company news
- Export JSON to retrieval, summarization, or portfolio-analysis pipelines

### Why use this Finviz quote extractor?

- ⚡ **HTTP-first extraction** — 256 MB memory and no browser overhead
- 🔑 **No login or API key** — works with public Finviz quote pages
- 🧩 **Complete snapshot preservation** — original labels stay in `metrics`
- 🔢 **Typed popular fields** — prices, ratios, volumes, and counts are numbers
- 📰 **News included** — headlines are nested beside the ticker they describe
- 🔁 **Watchlist batching** — submit multiple symbols or quote URLs in one run
- 🛡️ **Resilient requests** — bounded retries, backoff, deduplication, and optional proxy routing
- 📦 **Flexible exports** — download JSON, CSV, Excel, XML, or RSS through Apify
- 🗓️ **Automation-ready** — schedule runs and deliver results by API or webhook

### What Finviz stock data can you extract?

| Category | Example fields |
|---|---|
| Identity | ticker, company name, website, sector, industry, country, indexes |
| Valuation | market cap, enterprise value, P/E, forward P/E, PEG, P/S, P/B, P/FCF |
| Financials | income, sales, book/cash per share, dividends, payout, debt ratios |
| Growth | EPS and sales growth, quarterly changes, multi-year estimates |
| Ownership | insider ownership/transactions, institutional ownership/transactions |
| Profitability | ROA, ROE, ROIC, gross margin, operating margin, profit margin |
| Technicals | SMA20/50/200, RSI, ATR, beta, volatility, 52-week high/low |
| Performance | week, month, quarter, half-year, YTD, 1/3/5/10-year performance |
| Trading | current/previous price, daily change, volume, average and relative volume |
| Events | earnings date, surprises, ex-dividend date, recommendation, target price |
| News | timestamp, original time label, headline, publisher, article URL |

Finviz can display different fields for different security types. The `metrics` object preserves whichever labeled values the source provides instead of inventing missing values.

### How much does it cost to scrape Finviz stock quotes?

This Actor uses pay-per-event pricing: one small run-start charge plus one charge per saved ticker record. You are not charged separately for every metric or nested news headline.

| Plan | Price per ticker record |
|---|---:|
| Free | $0.00022159 |
| Starter / BRONZE | $0.00019269 |
| Scale / SILVER | $0.00015030 |
| Business / GOLD | $0.00011561 |
| PLATINUM | $0.000077074 |
| DIAMOND | $0.000053952 |

A one-time `$0.005` run-start event applies. At BRONZE pricing, 10 tickers cost about `$0.0069`, and 100 tickers cost about `$0.0243`.

With the Apify Free plan's included credits, you can test many small watchlists before scaling. Final cost appears in the run console before export.

### How to scrape Finviz quotes and news

1. Open [Finviz Stock Quote & News Scraper](https://apify.com/automation-lab/finviz-stock-quote-news-scraper).
2. Click **Try for free**.
3. Add ticker symbols such as `AAPL`, `MSFT`, or `NVDA`.
4. Optionally add public Finviz quote URLs.
5. Choose whether to include news and set the per-ticker news limit.
6. Keep concurrency low for your first run.
7. Click **Start**.
8. Review the Stock quotes dataset view.
9. Export results or connect an integration.

**Minimal ticker input**

```json
{
  "tickerSymbols": ["AAPL"]
}
````

**Watchlist input**

```json
{
  "tickerSymbols": ["AAPL", "MSFT", "NVDA", "SPY"],
  "includeNews": true,
  "maxNewsItems": 20,
  "maxConcurrency": 3
}
```

**Public quote URL input**

```json
{
  "startUrls": [
    { "url": "https://finviz.com/quote.ashx?t=BRK-B&p=d" }
  ],
  "maxNewsItems": 10
}
```

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `tickerSymbols` | array | `[]` | US stock or ETF symbols, for example `AAPL`, `SPY`, or `BRK-B` |
| `startUrls` | array | `[]` | Public Finviz `quote.ashx?t=` URLs |
| `includeNews` | boolean | `true` | Include nested news records for each ticker |
| `maxNewsItems` | integer | `20` | Maximum recent news rows per ticker, from 0 to 100 |
| `maxConcurrency` | integer | `3` | Parallel quote requests, from 1 to 10 |
| `proxyConfiguration` | object | direct | Optional Apify Proxy configuration for repeated blocks |

At least one valid ticker symbol or quote URL is required. Symbols and URL-derived tickers are normalized to uppercase and deduplicated.

This V1 deliberately supports **quote detail pages only**. Finviz screener and search URLs are not accepted.

### Output example

```json
{
  "ticker": "AAPL",
  "companyName": "Apple Inc",
  "companyUrl": "http://www.apple.com",
  "quoteUrl": "https://finviz.com/quote.ashx?t=AAPL&p=d",
  "sector": "Technology",
  "industry": "Consumer Electronics",
  "country": "USA",
  "indexMemberships": ["DJIA", "NDX", "S&P 500"],
  "price": 314.86,
  "changePercent": -0.77,
  "marketCap": "4624.46B",
  "pe": 38.09,
  "forwardPe": 30.12,
  "targetPrice": 275.53,
  "volume": 43210000,
  "averageVolume": 52140000,
  "relativeVolume": 0.83,
  "employees": 166000,
  "earnings": "Jul 30 AMC",
  "metrics": {
    "Market Cap": "4624.46B",
    "P/E": "38.09",
    "Gross Margin": "46.60%",
    "RSI (14)": "63.22"
  },
  "news": [
    {
      "publishedAt": "2026-07-15T02:42:00.000Z",
      "sourceDateTime": "Today 10:42PM",
      "headline": "Example company headline",
      "source": "Example Publisher",
      "url": "https://example.com/article"
    }
  ],
  "newsCount": 1,
  "scrapedAt": "2026-07-15T03:00:00.000Z"
}
```

The values above illustrate the schema. Market values change continuously, so compare live output with the source timestamp.

### Understanding the metrics object

Finviz labels some values with units and time windows. The Actor preserves the displayed string so meaning is not lost.

- Percentages retain `%` inside `metrics`.
- Market-cap and financial abbreviations retain `K`, `M`, `B`, or `T`.
- Dates and announcement timing retain the Finviz label.
- Missing source cells remain absent or use the source's `-` value.
- Popular fields are normalized separately for sorting and calculations.

Use `metrics["Gross Margin"]` for full source fidelity, or `price`, `pe`, and `volume` for typed analysis.

### Working with Finviz company news

Each ticker record contains a `news` array, ordered as shown by Finviz.

A news item includes:

- `publishedAt` — normalized ISO 8601 timestamp
- `sourceDateTime` — original Finviz date/time text
- `headline` — article headline
- `source` — publisher displayed by Finviz
- `url` — outbound article URL

Set `includeNews` to `false` or `maxNewsItems` to `0` when you need only quote and fundamental data.

The Actor deduplicates news by outbound URL within each ticker record.

### Tips for reliable Finviz extraction

- 🎯 Start with one to five tickers and inspect the schema before a large refresh.
- 🐢 Keep concurrency at 3 or below unless you have verified a larger workload.
- 🔁 Schedule periodic runs instead of issuing rapid duplicate runs.
- 📰 Lower `maxNewsItems` when headlines are not central to your workflow.
- 🔒 Enable Apify Proxy only after repeated direct 403 or 429 responses.
- 🧹 Deduplicate records across scheduled runs using `ticker` plus `scrapedAt`.
- 🕒 Treat quotes as point-in-time observations, not historical bars.
- 📉 Expect ETFs and other security types to expose a different subset of metrics.

### Finviz watchlist monitoring workflow

Create an Apify Schedule that runs before market open or after market close with your portfolio tickers.

Then:

1. Save the latest dataset ID in your workflow.
2. Compare `price`, `changePercent`, `relativeVolume`, and valuation fields.
3. Compare outbound news URLs with the previous run.
4. Alert only on new URLs or threshold changes.
5. Archive full `metrics` objects for point-in-time research.

For repeat runs, use a webhook to trigger your database or automation as soon as extraction finishes.

### Integrations

**Finviz → Google Sheets**

Run a daily watchlist and append ticker, price, daily change, valuation, target price, and headline count to a tracking sheet.

**Finviz → Slack or Discord**

Use Make or Zapier to send an alert when relative volume, daily change, or a new article URL crosses your rules.

**Finviz → PostgreSQL, BigQuery, or Snowflake**

Store normalized top-level fields for analysis and retain the complete `metrics` JSON for future feature engineering.

**Finviz → LLM briefing**

Send the quote snapshot and latest headlines to an LLM that produces a cited morning watchlist summary. Follow outbound links only when your downstream process is authorized to fetch them.

**Scheduled portfolio snapshots**

Use Apify Scheduler and webhooks to create repeatable snapshots without keeping your own server online.

### Using the Apify API

**Node.js**

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/finviz-stock-quote-news-scraper').call({
  tickerSymbols: ['AAPL', 'MSFT', 'NVDA'],
  includeNews: true,
  maxNewsItems: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**Python**

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/finviz-stock-quote-news-scraper').call(
    run_input={
        'tickerSymbols': ['AAPL', 'MSFT', 'NVDA'],
        'includeNews': True,
        'maxNewsItems': 10,
    }
)
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

**cURL**

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~finviz-stock-quote-news-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"tickerSymbols":["AAPL","MSFT"],"maxNewsItems":10}'
```

### Use with AI agents via MCP

Finviz Stock Quote & News Scraper can be called by AI assistants through the [Apify Model Context Protocol integration](https://docs.apify.com/platform/integrations/mcp).

**Claude Code**

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=automation-lab/finviz-stock-quote-news-scraper"
```

**Claude Desktop, Cursor, or VS Code**

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/finviz-stock-quote-news-scraper"
    }
  }
}
```

Authenticate with your Apify account when prompted.

Example prompts:

- “Use `automation-lab/finviz-stock-quote-news-scraper` to compare AAPL, MSFT, and NVDA valuation, margins, and relative volume.”
- “Refresh the Finviz quote and latest 20 company headlines for every ticker in my watchlist.”
- “Extract SPY and QQQ technical indicators and summarize where their performance differs.”

### Is it legal to scrape Finviz?

Scraping publicly available data is generally lawful in many jurisdictions, but the details depend on your location, purpose, contract, and the data involved. This Actor only targets anonymous public Finviz quote pages and does not bypass authentication.

You are responsible for using it ethically and complying with Finviz terms, applicable copyright and database rights, privacy law, and reasonable request rates. Do not use the output for unlawful market manipulation, deceptive financial promotion, or decisions requiring licensed advice without independent verification.

This Actor is an extraction tool, not investment advice. Market data may be delayed, incomplete, or changed by the source.

### Limitations

- V1 does not scrape Finviz screener, search, portfolio, or authenticated pages.
- Finviz may throttle or challenge repeated automated requests.
- Quote data is a snapshot and does not provide historical candles.
- News links point to third-party publishers whose pages may require subscriptions.
- Available metrics vary by stock, ETF, and other security type.
- The Actor preserves source values but does not independently validate financial figures.
- Timestamps are normalized from Finviz's Eastern Time display.

### Troubleshooting

**Why did my run reject a URL?**

Only public `finviz.com/quote.ashx?t=...` URLs are accepted. Paste a quote-detail URL or enter the ticker in `tickerSymbols`. Screener URLs are outside the supported V1 scope.

**Why was one ticker skipped?**

The symbol may be invalid, unavailable on Finviz, temporarily blocked, or returning an unexpected page. Review the run log for the ticker-specific warning. Valid tickers continue processing.

**Why are some metrics missing?**

Finviz displays different fields by security type and data availability. Check `metrics` for source labels and do not assume every stock or ETF has every ratio.

**Why did I receive a 403 or 429?**

Lower `maxConcurrency`, wait before retrying, and enable an Apify Proxy configuration if direct traffic is repeatedly blocked.

### Frequently asked questions

**How fast is the Finviz scraper?**

It makes one lightweight HTTP request per unique ticker and processes up to three by default. Small watchlists normally finish quickly, although source latency and retries can vary.

**Does it require a Finviz API key?**

No. It extracts anonymous server-rendered quote pages and needs no Finviz account or API key.

**Does it scrape the Finviz stock screener?**

No. This V1 intentionally supports ticker quote pages only. It does not promise a screener route that is currently more heavily protected.

**Can I use ticker symbols and URLs together?**

Yes. The Actor combines both inputs, normalizes their symbols, and removes duplicates.

**Am I charged for every news headline?**

No. Charging is per saved ticker record, regardless of how many nested news items are included up to your configured limit.

**Is this a real-time trading feed?**

No. It captures the values currently displayed by Finviz. Verify timing and market-data requirements before using it in trading systems.

### Other financial data scrapers

Combine this Actor with related Automation Labs tools:

- [Stocktwits Scraper](https://apify.com/automation-lab/stocktwits-scraper) — retail investor messages and sentiment
- [SEC Company Facts API Scraper](https://apify.com/automation-lab/sec-company-facts-api-scraper) — standardized company financial facts
- [SEC 8-K Current Reports Scraper](https://apify.com/automation-lab/sec-8-k-current-reports-scraper) — material corporate events
- [SEC Form 4 Insider Transactions Scraper](https://apify.com/automation-lab/sec-form-4-insider-transactions-scraper) — insider purchase and sale filings
- [SEC 13F Manager Quarterly Report Scraper](https://apify.com/automation-lab/sec-13f-manager-quarterly-report-scraper) — institutional holdings
- [SEC S-1 IPO Filings Scraper](https://apify.com/automation-lab/sec-s1-ipo-filings-scraper) — public offering registrations

Together, these Actors can connect market snapshots, news, sentiment, company fundamentals, insider activity, and regulatory filings in one research workflow.

# Actor input Schema

## `tickerSymbols` (type: `array`):

Add US-listed stock or ETF ticker symbols such as AAPL, NVDA, BRK-B, or SPY.

## `startUrls` (type: `array`):

Add public Finviz quote URLs in the form https://finviz.com/quote.ashx?t=AAPL. Screener/search URLs are not supported.

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

Include timestamp, headline, publisher, and outbound URL for recent news listed on each quote page.

## `maxNewsItems` (type: `integer`):

Limit nested news records for each stock. Set to 0 to return quote and fundamentals data without news.

## `maxConcurrency` (type: `integer`):

Number of Finviz quote pages fetched in parallel. Keep this conservative to reduce rate-limit risk.

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

Optional Apify Proxy settings. Direct HTTP is the default; enable proxy rotation if Finviz returns repeated 403 or 429 responses.

## Actor input object example

```json
{
  "tickerSymbols": [
    "AAPL"
  ],
  "startUrls": [
    {
      "url": "https://finviz.com/quote.ashx?t=AAPL&p=d"
    }
  ],
  "includeNews": true,
  "maxNewsItems": 10,
  "maxConcurrency": 2,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "tickerSymbols": [
        "AAPL"
    ],
    "startUrls": [
        {
            "url": "https://finviz.com/quote.ashx?t=AAPL&p=d"
        }
    ],
    "includeNews": true,
    "maxNewsItems": 10,
    "maxConcurrency": 2,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/finviz-stock-quote-news-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 = {
    "tickerSymbols": ["AAPL"],
    "startUrls": [{ "url": "https://finviz.com/quote.ashx?t=AAPL&p=d" }],
    "includeNews": True,
    "maxNewsItems": 10,
    "maxConcurrency": 2,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/finviz-stock-quote-news-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "tickerSymbols": [
    "AAPL"
  ],
  "startUrls": [
    {
      "url": "https://finviz.com/quote.ashx?t=AAPL&p=d"
    }
  ],
  "includeNews": true,
  "maxNewsItems": 10,
  "maxConcurrency": 2,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call automation-lab/finviz-stock-quote-news-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=automation-lab/finviz-stock-quote-news-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Finviz Stock Quote & News Scraper",
        "description": "Extract Finviz quotes, fundamentals, valuation, growth, ownership, margins, technical indicators, price, volume, and timestamped company news. No Finviz login or API key required.",
        "version": "0.1",
        "x-build-id": "Cbi5wQK8yhQLkK7Sx"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/automation-lab~finviz-stock-quote-news-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-automation-lab-finviz-stock-quote-news-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/automation-lab~finviz-stock-quote-news-scraper/runs": {
            "post": {
                "operationId": "runs-sync-automation-lab-finviz-stock-quote-news-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/automation-lab~finviz-stock-quote-news-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-automation-lab-finviz-stock-quote-news-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "tickerSymbols": {
                        "title": "📈 Ticker symbols",
                        "type": "array",
                        "description": "Add US-listed stock or ETF ticker symbols such as AAPL, NVDA, BRK-B, or SPY.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Finviz quote URLs",
                        "type": "array",
                        "description": "Add public Finviz quote URLs in the form https://finviz.com/quote.ashx?t=AAPL. Screener/search URLs are not supported.",
                        "default": [],
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "includeNews": {
                        "title": "📰 Include company news",
                        "type": "boolean",
                        "description": "Include timestamp, headline, publisher, and outbound URL for recent news listed on each quote page.",
                        "default": true
                    },
                    "maxNewsItems": {
                        "title": "Maximum news items per ticker",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Limit nested news records for each stock. Set to 0 to return quote and fundamentals data without news.",
                        "default": 20
                    },
                    "maxConcurrency": {
                        "title": "Concurrent ticker requests",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Number of Finviz quote pages fetched in parallel. Keep this conservative to reduce rate-limit risk.",
                        "default": 3
                    },
                    "proxyConfiguration": {
                        "title": "🔒 Proxy configuration",
                        "type": "object",
                        "description": "Optional Apify Proxy settings. Direct HTTP is the default; enable proxy rotation if Finviz returns repeated 403 or 429 responses.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
