# Seeking Alpha Analysis Feed Scraper (`automation-lab/seeking-alpha-analysis-feed-scraper`) Actor

Collect public Seeking Alpha analysis and news metadata by ticker, with headlines, authors, dates, comments, canonical URLs, company classification, and quote context. Built for watchlist monitoring, research ingestion, sentiment pipelines, and recurring market-news refreshes.

- **URL**: https://apify.com/automation-lab/seeking-alpha-analysis-feed-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 web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Seeking Alpha Analysis Feed Scraper

Collect recent public Seeking Alpha analysis and news metadata for stock tickers.
Each dataset row combines a headline with its author, publication time, comment
count, canonical URL, related symbols, company classification, and current quote
context from the public symbol overview.

Use the Actor for watchlist monitoring, investment-research ingestion, sentiment
pipelines, and recurring market-news refreshes. It does **not** extract article
bodies, premium quant ratings, portfolios, account data, or subscriber-only
content.

### What does Seeking Alpha Analysis Feed Scraper do?

The Actor accepts ticker symbols or public Seeking Alpha symbol URLs. For every
symbol, it reads the public overview and returns the newest visible records from
two feed types:

- **Analysis** — Seeking Alpha contributor analysis metadata.
- **News** — Seeking Alpha news alert metadata.

Results from both feeds are merged by publication time and deduplicated by their
stable source type and ID. A global `maxItems` limit keeps scheduled runs bounded.
When multiple tickers are supplied, the result budget is distributed across the
watchlist so one active symbol does not consume the whole run.

The implementation is HTTP-first. It does not launch a browser or automatically
use residential proxies, which keeps runs lightweight and predictable.

### Who is it for?

#### Investment research teams

Refresh a coverage list before a morning research meeting and send the dataset to
a spreadsheet, warehouse, or internal dashboard.

#### Portfolio and watchlist operators

Schedule repeated runs for symbols held in a portfolio and compare new IDs with a
previous run to detect newly published commentary.

#### Sentiment and event pipelines

Use headlines, content type, author, comment count, and related tickers as inputs
to classification, alerting, or human-review workflows.

#### Financial data product teams

Enrich an existing quote or fundamentals product with source-specific public
analysis and news discovery links without collecting premium article text.

### Why use this Actor?

- Provide tickers directly or paste Seeking Alpha symbol URLs.
- Return analysis, news, or both from one consistent contract.
- Include quote and company context on every feed record.
- Deduplicate stable source IDs and canonical URLs.
- Apply a hard global result limit of up to 500 records.
- Fail clearly when the source returns a challenge or an unexpected schema.
- Avoid account credentials, browser sessions, and automatic paid proxy traffic.
- Produce typed rows ready for CSV, JSON, Excel, API, webhooks, or datasets.

This v1 is intentionally narrower than products that promise article bodies,
ratings, transcripts, or private portfolio features. Its job is a repeatable,
public ticker analysis/news metadata feed.

### What data can you extract?

| Field | Meaning |
| --- | --- |
| `sourceId` | Stable Seeking Alpha article or news ID |
| `contentType` | `analysis` or `news` |
| `ticker` | Canonical requested symbol |
| `companyName` | Company name from the symbol overview |
| `sector` | Seeking Alpha sector |
| `industry` | Seeking Alpha industry |
| `exchange` | Trading exchange |
| `currency` | Quote currency |
| `lastPrice` | Latest price visible during collection |
| `previousClose` | Previous close from quote context |
| `volume` | Latest reported volume |
| `quoteTimestamp` | Source timestamp for quote context |
| `marketState` | Market status reported by Seeking Alpha |
| `headline` | Public analysis or news headline |
| `author` | Contributor or Seeking Alpha news editor |
| `publishedAt` | Publication time in ISO 8601 format |
| `commentCount` | Reported number of comments |
| `articleUrl` | Canonical analysis or news URL |
| `relatedTickers` | Symbols linked to the record |
| `isPaywalled` | Whether the linked item is marked paywalled/Pro |
| `sourceUrl` | Symbol overview used for context |
| `scrapedAt` | Collection timestamp |

Quote or classification values can be `null` when Seeking Alpha does not expose
them for a particular instrument. The Actor never follows a paywalled record to
extract its body.

### How much does it cost to scrape Seeking Alpha analysis feeds?

The Actor uses pay-per-event pricing:

- **Start:** $0.005 per run.
- **Feed record:** $0.000054785 per saved record on the FREE tier.
- Paid Apify plans receive the active tier discount shown before starting a run.

Example calculations with the current pricing are:

| Saved records | Charge calculation |
| ---: | --- |
| 10 | Start fee + 10 × the applicable item-tier price |
| 100 | Start fee + 100 × the applicable item-tier price |
| 500 | Start fee + 500 × the applicable item-tier price |

The Actor charges only for validated rows it attempts to save. Duplicates,
rejected shapes, failed requests, and empty responses are not item events. Apify
shows the exact active price and maximum run charge before execution.

### Getting started

1. Open the Actor in Apify Console.
2. Enter one or more values in **Stock tickers**, such as `AAPL` and `MSFT`.
3. Alternatively, add public URLs such as
   `https://seekingalpha.com/symbol/NVDA`.
4. Select **Analysis**, **News**, or both.
5. Set **Maximum results**. Start with 10–50 for a first run.
6. Click **Start**.
7. Open the **Results** dataset and export JSON, CSV, Excel, XML, or RSS.
8. Save the task and add a schedule if you need recurring refreshes.

A useful first input is:

```json
{
  "tickers": ["AAPL", "MSFT"],
  "includeTypes": ["analysis", "news"],
  "maxItems": 20
}
```

### Input parameters

#### `tickers`

An optional array of 1–50 stock symbols. Symbols are normalized to uppercase.
Letters, numbers, dots, colons, and hyphens are supported, including values such
as `BRK.B`. Duplicate symbols are removed.

#### `startUrls`

An optional array of public `seekingalpha.com/symbol/{TICKER}` URLs. Symbol
subpages such as `/analysis` and `/news` are accepted and normalized to the
symbol overview. Other hosts and non-symbol paths are rejected.

You can combine `tickers` and `startUrls` in the same run.

#### `includeTypes`

Select one or both supported values:

- `analysis`
- `news`

The default in Console is both feed types.

#### `maxItems`

Global number of records to save across all symbols. Allowed range: 1–500.
The default is 50. For a multi-symbol watchlist, the Actor allocates the remaining
result budget across the remaining symbols.

### Output example

A real run produces rows shaped like this (values abbreviated):

```json
{
  "sourceId": "4925269",
  "contentType": "analysis",
  "ticker": "AAPL",
  "companyName": "Apple Inc.",
  "sector": "Information Technology",
  "industry": "Technology Hardware, Storage and Peripherals",
  "exchange": "NASDAQ",
  "currency": "USD",
  "lastPrice": 333.02,
  "previousClose": 321.66,
  "volume": 47489415.903844,
  "quoteTimestamp": "2026-07-24T21:28:44.930-04:00",
  "marketState": "Market Close",
  "headline": "Apple: Q3 Is About Cameras, Not AI - Here's Why That's A Good Thing",
  "author": "Rick Orford",
  "publishedAt": "2026-07-24T13:54:05.000Z",
  "commentCount": 8,
  "articleUrl": "https://seekingalpha.com/article/4925269-apple-q3-is-about-cameras-not-ai-heres-why-thats-a-good-thing",
  "relatedTickers": ["AAPL"],
  "isPaywalled": false,
  "sourceUrl": "https://seekingalpha.com/symbol/AAPL",
  "scrapedAt": "2026-07-26T03:00:00.000Z"
}
```

Prices and engagement change over time. Treat quote fields as context captured at
`scrapedAt`, not as a guaranteed exchange-grade real-time market data service.

### Monitoring and integration workflows

#### Scheduled watchlist refresh

Create a saved task with 10–50 symbols and schedule it hourly or daily. Compare
`contentType:id` against your own previous snapshot to identify new records.

#### Slack or email alerts

Connect an Apify webhook to Make, Zapier, n8n, or your own endpoint. Filter new
rows by ticker, headline keywords, author, or comment count before sending alerts.

#### Sentiment enrichment

Send `headline`, `contentType`, `ticker`, and `publishedAt` to a classifier. Keep
`articleUrl` as the citation link for a human reviewer.

#### Data warehouse ingestion

Read the default dataset through the Apify API and upsert on
`contentType + sourceId`. Store `scrapedAt` and quote fields as observation metadata.

### Use with the Apify API

Replace `APIFY_TOKEN` with a secret environment variable, never a committed value.

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~seeking-alpha-analysis-feed-scraper/runs?waitForFinish=300" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"tickers":["AAPL","MSFT"],"includeTypes":["analysis","news"],"maxItems":20}'
```

#### JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor(
  'automation-lab/seeking-alpha-analysis-feed-scraper',
).call({
  tickers: ['AAPL', 'MSFT'],
  includeTypes: ['analysis', 'news'],
  maxItems: 20,
});

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/seeking-alpha-analysis-feed-scraper"
).call(run_input={
    "tickers": ["AAPL", "MSFT"],
    "includeTypes": ["analysis", "news"],
    "maxItems": 20,
})

items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

### Use with MCP and AI agents

Add this Actor as an Apify MCP tool in Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/seeking-alpha-analysis-feed-scraper"
```

#### Claude Desktop, Cursor, and VS Code setup

Claude Desktop, Cursor, and VS Code can use this MCP configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/seeking-alpha-analysis-feed-scraper"
    }
  }
}
```

#### Example prompts for MCP

- “Using the Apify MCP tool, collect the newest Seeking Alpha analysis and news for AAPL and MSFT.”
- “Use MCP to return only analysis metadata for the NVDA symbol page.”
- “Through MCP, refresh these five tickers and summarize which headlines have the most comments.”

The Actor returns source records; an AI agent can summarize or classify them in a
separate step.

### Tips for reliable runs

- Start with a small `maxItems` while designing your downstream workflow.
- Use ticker inputs instead of constructing URLs when you already know symbols.
- Use `analysis` only if news alerts would add noise to your pipeline.
- Schedule at a cadence appropriate for the source; constant polling is wasteful.
- Deduplicate downstream using `contentType` and `id`.
- Inspect run logs after a source challenge or schema error.
- Retry later rather than immediately repeating a blocked run.
- Do not add login cookies or private credentials to Actor input.

### Limits and failure behavior

- The Actor supports public symbol overview, analysis metadata, and news metadata.
- It does not extract analysis bodies, premium ratings, transcripts, portfolios,
  account pages, recommendations, or subscriber-only fields.
- `maxItems` is capped at 500 and the ticker list at 50 per run.
- Source timestamps and market states are reported by Seeking Alpha.
- A linked item can be marked paywalled even though its public metadata is visible.
- Seeking Alpha can change its HTML, JSON shape, or anti-bot controls.
- The Actor retries transient timeouts, HTTP 429, and temporary server failures.
- Deterministic 4xx responses and malformed inputs are not retried blindly.
- One invalid upstream ticker does not discard useful rows from other valid tickers.
- If no validated feed record can be saved, the run fails instead of returning a
  misleading quote-only success.

### Responsible use and legality

Use this Actor only for data you are legally permitted to collect and process.
Review Seeking Alpha’s Terms of Use, robots guidance, and any applicable market
data licensing terms for your use case. Do not use the Actor to bypass access
controls, reproduce premium content, impersonate users, or create a substitute
for subscriber-only services.

Headlines, author names, and article links can be copyrighted or personal data in
some jurisdictions. Keep a lawful purpose, minimize retention, honor deletion or
access obligations, and preserve source attribution. This documentation is not
legal advice.

### Troubleshooting

#### Why did the run say that no useful records were saved?

Check that each ticker exists on Seeking Alpha and that the selected feed type has
recent public records. The run also fails this way when the source returns a
challenge or no longer exposes the expected SSR/feed shape.

#### Why was my URL rejected?

Only `seekingalpha.com/symbol/{TICKER}` URLs and their symbol subpages are in
scope. Paste a symbol URL or supply the ticker directly.

#### Why is a quote field null?

Some instruments or market states do not expose every quote field. Feed metadata
can still be valid; nullable quote fields are part of the output contract.

#### Why are fewer than `maxItems` returned?

`maxItems` is a ceiling, not a promise. The selected feed can be naturally sparse,
records can overlap across requested symbols, or a symbol can fail while others
succeed.

#### Does the Actor open or scrape premium articles?

No. It emits public discovery metadata and the canonical link only. The
`isPaywalled` flag describes the linked item; it does not bypass the paywall.

### Related automation-lab Actors

- [Stocktwits Scraper](https://apify.com/automation-lab/stocktwits-scraper) for
  social investing messages and ticker conversation signals.
- [Google News Scraper](https://apify.com/automation-lab/google-news-scraper) for
  broader publisher coverage and keyword-based news discovery.
- [Yahoo Finance Scraper](https://apify.com/automation-lab/yahoo-finance-scraper)
  for a different public finance data and news source.

Use this Actor when the source-specific Seeking Alpha analysis/news feed is the
important signal. Combine it with broader news or social sources when you need a
multi-source market-monitoring workflow.

### FAQ

#### Can I use both tickers and start URLs?

Yes. They are normalized into one deduplicated symbol list.

#### Are results returned in publication order?

Rows for each symbol are merged from the selected feeds and sorted newest first.
Multi-symbol output is grouped by the order of requested symbols.

#### Can I request only news?

Yes. Set `includeTypes` to `["news"]`.

#### Can I request historical article bodies?

No. Article body extraction and premium content are deliberately outside v1.

#### Does the Actor need a proxy?

No automatic proxy route is enabled. The tested implementation uses direct,
lightweight HTTP requests with conservative retry behavior.

#### How should I identify a record in my database?

Use the pair `contentType` and `sourceId`. Keep `articleUrl` as the canonical source link.

#### Is the quote real-time?

It is the latest context Seeking Alpha placed on the public overview when the
Actor fetched it. Use licensed exchange-grade feeds for trading decisions that
require guaranteed real-time data.

#### Can I schedule the Actor?

Yes. Save the input as an Apify task, attach a schedule, and consume the dataset
through webhooks or the API.

# Actor input Schema

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

Ticker symbols to monitor, such as AAPL, MSFT, NVDA, or BRK.B. Tickers and start URLs can be combined.

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

Optional seekingalpha.com/symbol/{TICKER} URLs. Analysis or news subpage URLs are accepted and normalized to the symbol overview.

## `includeTypes` (type: `array`):

Choose whether to return Seeking Alpha-authored analysis, news alerts, or both.

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

Maximum number of deduplicated feed records to save across all requested tickers.

## Actor input object example

```json
{
  "tickers": [
    "AAPL",
    "MSFT"
  ],
  "startUrls": [
    {
      "url": "https://seekingalpha.com/symbol/NVDA"
    }
  ],
  "includeTypes": [
    "analysis",
    "news"
  ],
  "maxItems": 20
}
```

# Actor output Schema

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

Deduplicated analysis and news feed records.

# 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"
    ],
    "startUrls": [
        {
            "url": "https://seekingalpha.com/symbol/NVDA"
        }
    ],
    "includeTypes": [
        "analysis",
        "news"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/seeking-alpha-analysis-feed-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",
    ],
    "startUrls": [{ "url": "https://seekingalpha.com/symbol/NVDA" }],
    "includeTypes": [
        "analysis",
        "news",
    ],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/seeking-alpha-analysis-feed-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 '{
  "tickers": [
    "AAPL",
    "MSFT"
  ],
  "startUrls": [
    {
      "url": "https://seekingalpha.com/symbol/NVDA"
    }
  ],
  "includeTypes": [
    "analysis",
    "news"
  ],
  "maxItems": 20
}' |
apify call automation-lab/seeking-alpha-analysis-feed-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/eN3vhbf5y93shVWHb/builds/5KZrjkrIvwsvSG940/openapi.json
