# Zacks Rank Scraper — Zacks Rank, Style Scores & industry rank (`istmobot/zacks-rank-scraper`) Actor

Scrape Zacks Rank (1 Strong Buy to 5 Strong Sell), Zacks Style Scores (Value, Growth, Momentum, VGM score), industry rank, industry and sector for any US stock or ETF ticker list. Optional quote: price, P/E, EPS, market cap, dividend yield. No API key or login.

- **URL**: https://apify.com/istmobot/zacks-rank-scraper.md
- **Developed by:** [Istmobot](https://apify.com/istmobot) (community)
- **Categories:** Other
- **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.

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

## Zacks Rank Scraper — Zacks Rank, Style Scores, VGM Score & Industry Rank API

Scrape the **Zacks Rank** (1 = Strong Buy … 5 = Strong Sell), the **Zacks Style Scores** (Value, Growth, Momentum and **VGM Score**, graded A–F), the **industry rank**, industry and sector for any list of US stock and ETF tickers. This Zacks scraper works like an unofficial **Zacks API**: send tickers, get one clean JSON row per ticker, ready for your stock rating screener, spreadsheet or trading model.

### What is Zacks Rank Scraper?

Zacks Rank Scraper is an Apify Actor that collects Zacks ratings and a quote snapshot from zacks.com for the tickers you give it. It needs **no Zacks API key, no login and no Zacks Premium account** — it reads Zacks' public quote feed and the public stock quote page that any visitor sees, without a browser, politely throttled.

Use it as a lightweight alternative to manually copying ranks from zacks.com or paying for a data subscription just to get ratings. Results are stored in an Apify dataset and can be downloaded as **JSON, CSV, Excel, HTML** or XML, or pulled through the Apify API.

- **Zacks Rank** as a number and text (`3` / `"Hold"`), exactly as shown on zacks.com.
- **Zacks Style Scores** — Value, Growth, Momentum and VGM Score (A–F).
- **Industry rank** — position and total (`26` of `247`), the original text (`"Top 11% (26 out of 247)"`), plus industry and sector names.
- **Quote snapshot** (optional) — price, change, change %, P/E (F1), EPS, market cap, dividend yield, exchange, last update.
- **ETFs** are supported: you get the rank and quote from Zacks' quote feed (Style Scores and industry rank don't exist for ETFs).
- Unknown tickers produce a free error item instead of failing the run.

#### What data can I extract with Zacks Rank Scraper?

| Field | Description |
|---|---|
| `ticker` | Ticker symbol (upper-cased, deduplicated) |
| `companyName` | Company or fund name |
| `assetType` | `stock`, `etf`, `fund` or `other` |
| `zacksRank` | Zacks Rank 1–5 (1 = Strong Buy, 5 = Strong Sell) |
| `zacksRankText` | `Strong Buy`, `Buy`, `Hold`, `Sell` or `Strong Sell` |
| `valueScore` | Zacks Value Style Score (A–F) |
| `growthScore` | Zacks Growth Style Score (A–F) |
| `momentumScore` | Zacks Momentum Style Score (A–F) |
| `vgmScore` | Zacks VGM Score (A–F) |
| `industry` | Zacks industry name |
| `industryRank` / `industryRankTotal` | Industry position and number of industries (e.g. 26 of 247) |
| `industryRankText` | Original text, e.g. `Top 11% (26 out of 247)` |
| `sector` | Zacks sector name |
| `price`, `change`, `changePercent` | Delayed quote price and daily change |
| `peRatio` | P/E using the current fiscal year (F1) consensus |
| `eps` | Trailing EPS from Zacks' quote feed |
| `marketCap` | Market capitalization in USD |
| `dividendYield` | Dividend yield in percent |
| `exchange`, `quoteUpdated` | Exchange and time of the quote |
| `url`, `scrapedAt` | Source page and scrape timestamp |

### How can I use Zacks data?

- **Screen your watchlist** — which of your 50 stocks are Zacks Rank #1/#2 with an A or B VGM Score?
- **Daily rank-change alerts** — schedule the Actor and compare runs, or pipe results into Google Sheets or Slack.
- **Quant research** — build a history of Zacks Ranks and Style Scores for backtests.
- **Portfolio reports & newsletters** — enrich holdings with rank, industry rank and sector.
- **Stock rating screener** — combine Zacks Rank with industry rank to find top-rated stocks in top-ranked industries.

### How to scrape Zacks Rank

1. Click **Try for free** on this page to open the Actor in Apify Console (create a free account if you don't have one).
2. Enter your **tickers** (e.g. `AAPL`, `MSFT`, `BRK.B`, `SPY`) and choose whether to include the quote snapshot.
3. Click **Start** and wait for the run to finish.
4. Open the **Output** tab and download the dataset as JSON, CSV, Excel or HTML — or fetch it via the API.

### How much does it cost?

Zacks Rank Scraper uses **pay-per-event** pricing — you only pay for results:

| Event | Price |
|---|---|
| Actor start | **$0.005** per run |
| `ticker-result` | **$0.003** per ticker (= **$3 per 1,000 tickers**) |

**Example:** 1 run × 500 tickers = $0.005 + $1.50 = **$1.505**.

The Apify free plan includes **$5 of monthly credit**, which covers roughly **1,650 tickers** a month at no cost. Error items (unknown or failed tickers) are **free**. You can set a **maximum cost per run** — once it is reached, the Actor stops cleanly and keeps the results it already has.

### ⬇️ Input

| Field | Type | Default | Description |
|---|---|---|---|
| `tickers` | list of strings | — (required) | US stock or ETF tickers, e.g. `AAPL`, `MSFT`, `BRK.B`, `SPY`. Duplicates are removed. |
| `includeQuote` | boolean | `true` | Add price, change, change %, P/E, EPS, market cap, dividend yield, exchange and quote time |
| `maxConcurrency` | integer 1–5 | `2` | Parallel quote-page requests (still globally throttled) |
| `proxyConfiguration` | proxy | none | Optional Apify Proxy (RESIDENTIAL works best if Zacks starts blocking) |

```json
{
    "tickers": ["AAPL", "MSFT", "NVDA", "TSLA", "BRK.B"],
    "includeQuote": true,
    "maxConcurrency": 2
}
```

### ⬆️ Output

Each ticker becomes one dataset row. The **Overview** table view shows ticker, company, rank, Style Scores, industry, sector, price, change %, P/E, market cap and URL at a glance.

```json
{
  "ticker": "AAPL",
  "companyName": "Apple Inc.",
  "assetType": "stock",
  "zacksRank": 3,
  "zacksRankText": "Hold",
  "valueScore": "F",
  "growthScore": "B",
  "momentumScore": "C",
  "vgmScore": "D",
  "industry": "Computer - Micro Computers",
  "industryRank": 26,
  "industryRankTotal": 247,
  "industryRankText": "Top 11% (26 out of 247)",
  "sector": "Computer and Technology",
  "price": 333.02,
  "change": 3.62,
  "changePercent": 1.1,
  "peRatio": 37.21,
  "eps": 8.61,
  "marketCap": 4860153823600,
  "dividendYield": 0.33,
  "exchange": "NASDAQ",
  "quoteUpdated": "Sep 30, 2026 04:00 PM",
  "url": "https://www.zacks.com/stock/quote/AAPL",
  "scrapedAt": "2026-10-01T01:42:52.008Z"
}
```

- With `includeQuote: false` the quote fields are omitted.
- If the quote page could not be read but the quote feed worked, the row still has the Zacks Rank and quote, Style Scores are `null`, and a `warning` field explains why.
- For ETFs, `url` points to the Zacks ETF profile page.

**Error item** (never charged):

```json
{
  "ticker": "ZZZZQ",
  "errorType": "INVALID_TICKER",
  "error": "Zacks does not know this ticker (quote feed: invalid ticker).",
  "url": "https://www.zacks.com/stock/quote/ZZZZQ",
  "scrapedAt": "2026-10-01T01:42:52.008Z"
}
```

`errorType` is `INVALID_TICKER`, `NOT_FOUND`, `FETCH_FAILED` or `FAILED`.

### Integrations and API

Run Zacks Rank Scraper programmatically with the [Apify API](https://docs.apify.com/api/v2) — use it as a Zacks API for your own code.

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("istmobot/zacks-rank-scraper").call(
    run_input={"tickers": ["AAPL", "MSFT", "NVDA"], "includeQuote": True}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["ticker"], item.get("zacksRank"), item.get("vgmScore"))
```

**Node.js** (`npm install apify-client`):

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('istmobot/zacks-rank-scraper').call({
    tickers: ['AAPL', 'MSFT', 'NVDA'],
    includeQuote: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

More ways to connect:

- **Schedules** — run daily after the market close for automatic Zacks Rank tracking.
- **Webhooks** — get notified (or trigger your pipeline) when a run finishes.
- **Make, Zapier, n8n** — plug results into no-code workflows.
- **Google Sheets** — export the dataset to a sheet for a live stock rating screener.
- **AI agents** — use it from Claude, ChatGPT and other AI agents via the [Apify MCP server](https://mcp.apify.com).

### FAQ

**Does it need a Zacks API key or Zacks Premium account?**
No. It only reads what zacks.com shows to any visitor, without logging in.

**How fresh is the data?**
Zacks updates ranks and scores daily; the quote is Zacks' delayed quote at the time of the run (`quoteUpdated`).

**How fast is it? How many tickers can I run?**
Hundreds per run. Quote data is fetched in batches of 25 tickers per request, and stock quote pages are throttled to about 1.4 requests per second with retries and exponential backoff — so 500 stocks take roughly 6–7 minutes.

**Why are Style Scores `null` for some tickers?**
ETFs and funds have no Style Scores or industry rank. For stocks, `null` plus a `warning` means the quote page was blocked or unavailable for that run — re-run, or enable Apify Proxy.

**Do I need a proxy?**
Usually not. Zacks uses an anti-bot service; if your runs start getting `warning` fields, enable Apify Proxy (RESIDENTIAL works best).

**Can I schedule it?**
Yes. Create a schedule in Apify Console (e.g. every weekday evening) to track Zacks Rank and VGM Score changes over time.

**Is it legal to scrape Zacks?**
This Actor only reads **publicly available** data shown to any visitor of zacks.com, without logging in, and collects no personal data. Even so, you are responsible for using it in line with applicable laws and Zacks' terms of use; if you are unsure about your use case, consult a lawyer. The data may be delayed or incomplete and is **not investment advice**.

This is an **unofficial** tool. It is not affiliated with, endorsed by or sponsored by Zacks Investment Research. "Zacks Rank" and "Style Scores" are Zacks' trademarks and proprietary ratings.

### Other Actors you might like

- [Metacritic Scraper](https://apify.com/istmobot/metacritic-scraper)
- [Steam Game Intelligence](https://apify.com/istmobot/steam-game-intelligence)
- [Earnings Call Transcripts Scraper](https://apify.com/istmobot/earnings-call-transcripts-scraper)
- [BoardGameGeek Scraper](https://apify.com/istmobot/boardgamegeek-scraper)

### Your feedback

Found a bug or missing a field? Open an issue in the **Issues** tab and we'll take a look.

# Actor input Schema

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

US stock or ETF ticker symbols, e.g. AAPL, MSFT, BRK.B. Duplicates are removed.

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

Add price, change, change %, P/E, EPS, market cap, dividend yield and exchange from Zacks' quote feed.

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

Parallel quote-page requests (1–5). Requests are globally throttled to about 1.4 per second either way to stay polite.

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

Optional. If Zacks starts returning its anti-bot page for your runs (results get a "warning" and no Style Scores), enable Apify Proxy — RESIDENTIAL works best.

## Actor input object example

```json
{
  "tickers": [
    "AAPL",
    "MSFT",
    "NVDA",
    "TSLA",
    "BRK.B"
  ],
  "includeQuote": true,
  "maxConcurrency": 2,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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",
        "NVDA",
        "TSLA",
        "BRK.B"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("istmobot/zacks-rank-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",
        "NVDA",
        "TSLA",
        "BRK.B",
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("istmobot/zacks-rank-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",
    "NVDA",
    "TSLA",
    "BRK.B"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call istmobot/zacks-rank-scraper --silent --output-dataset

```

## MCP server setup

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