# Stocktwits Scraper (`insights_data/stocktwits-scraper`) Actor

Scrape Stocktwits for live stock & crypto messages, bullish/bearish sentiment, price targets, and trending symbols. Extract trader chatter and market mood — no API key. Export JSON/CSV for sentiment analysis, dashboards, and trading research.

- **URL**: https://apify.com/insights\_data/stocktwits-scraper.md
- **Developed by:** [Insights Data](https://apify.com/insights_data) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

### What does Stocktwits Scraper do?

This **Stocktwits scraper** turns [stocktwits.com](https://stocktwits.com) — the largest **financial social media** network for traders — into clean, structured **Stocktwits data** you can export, schedule, and reuse. Pull live **ticker message streams**, a trader’s public posts, the site-wide trending feed, or today’s **Stocktwits trending symbols** with AI summaries. No API key, no login. ✅

As a **stock sentiment scraper** and practical **Stocktwits API** alternative, it helps you **extract Stocktwits messages**, capture **bullish bearish sentiment**, surface **price target predictions**, and track **retail investor sentiment** for stocks and crypto — ideal for dashboards, NLP datasets, and **market mood** research.

Open it in [Apify Console](https://console.apify.com), pick a mode, hit **Start** — results stream into your dataset as they arrive.

#### ✨ What can this Stocktwits scraper do?

- 📈 **Symbol streams** — every recent message for any stock or crypto ticker with this **stock message scraper**
- 👤 **User posts** — the public history of any Stocktwits username
- 🔥 **Trending messages** — the real-time, site-wide feed of active discussions
- 📊 **Trending symbols** — ranked tickers with AI summaries and fundamentals (**Stocktwits trending symbols** mode)
- 💭 **Smart filters** — sentiment, likes, asset class (stocks vs crypto), links / charts / videos
- 🎯 **Price-target focus** — keep only messages with **price target predictions** when you need them
- 👁️ **Monitor mode** — scheduled runs return only new posts — a standing **Stocktwits monitor** / **market mood tracker**
- 🧠 **Trending enrichment** — optionally tag messages with rank, score, and AI context
- 🗂️ **Sectioned output** — Messages · Trending Symbols · Progress
- ⚡ **Live results** — watch rows land while the run is still going
- 🧩 **Apify platform powers** — scheduling, monitoring, API access, MCP, webhooks, and 1,000+ integrations

#### 📦 What data can you extract from Stocktwits?

| 🗂️ Section | 📌 What you get |
|---|---|
| 💬 Messages | Body, timestamps, **bullish bearish sentiment**, likes / replies / reshares, hashtags, mentions, charts & media URLs |
| 🎯 Price targets | Predict™-style **price target predictions** with start/current price, status, and accuracy when attached |
| 📉 Price since post | Snapshots of how mentioned symbols moved after the post |
| 👤 Author | Username, display name, followers, official flag |
| 🏷️ Symbols | Tickers, titles, exchanges, live symbol prices |
| 📊 Trending symbols | Rank, score, AI summary, market cap, sector, industry, P/E and more |

### 🌟 Why scrape Stocktwits?

Stocktwits concentrates **social trading data** and **stock market sentiment** that rarely appears in traditional price feeds. A dedicated **financial NLP dataset** source and **stock sentiment analysis tool** helps you:

- 📡 Build **trading signal** features from **retail investor sentiment** and discussion volume
- 🪙 Run **crypto sentiment analysis** on `$BTC.X`, `$ETH.X`, and other crypto tickers
- 📊 Power **stock sentiment** dashboards and **stock chatter** alerts around earnings or news
- 🧠 Fine-tune LLMs on labeled financial text from live **Stocktwits data**
- 🔥 Discover movers via **trending stocks scraper** workflows before you dig into full streams

### 🚀 How to scrape Stocktwits (Apify Console)

1. Open **Stocktwits Scraper** in [Apify Console](https://console.apify.com)
2. Choose a **Scraping mode** — symbol, user, trending messages, or trending symbols
3. Add tickers (e.g. `AAPL`, `TSLA`, `BTC.X`) or usernames — bulk paste supported
4. Set **Max messages**, optional sentiment / engagement filters, and monitor mode if needed
5. Click **Start** and follow live progress in the log
6. Open **Output**, switch views, and export JSON / CSV / Excel / XML — or pull via API

💡 Tip: crypto needs the `.X` suffix (`BTC.X`). A bare `BTC` is a different instrument — this **crypto ticker scraper** never guesses it for you.

### 📥 Input

Simple JSON — no coding required:

```json
{
    "mode": "symbol",
    "symbols": ["AAPL", "TSLA", "BTC.X"],
    "maxMessages": 100,
    "onlyPriceTargets": false,
    "sentimentFilter": "",
    "onlyNewMessages": false
}
```

| Field | Description |
|---|---|
| 🎯 `mode` | `symbol` · `user` · `trending` · `trending-symbols` — core of this **Stocktwits scraper** |
| 📈 `symbols` | Tickers for symbol mode (powers **ticker message stream** scrapes) |
| 👤 `usernames` | Stocktwits usernames for user mode (no `@`) |
| 🔢 `maxMessages` | Cap per target (or total for trending modes). `0` = unlimited up to platform limits |
| 💭 `sentimentFilter` | Keep Bullish, Bearish, untagged, or any — classic **stock sentiment scraper** control |
| 👍 `minLikes` | Drop low-engagement posts |
| 🏷️ `assetClassFilter` | Stocks only, crypto only, or both |
| 🧵 `filter` | All / top / links / charts / videos |
| 🎯 `onlyPriceTargets` | Only messages with **price target predictions** |
| 🧠 `includeTrendingSymbolDetails` | Enrich messages with trending rank / score / AI summary |
| 👁️ `onlyNewMessages` (+ `monitorStoreName`) | **Stocktwits monitor** — only unseen messages |
| Advanced | Resume IDs, concurrency, raw payload, snake\_case aliases, meta records |

See the **Input** tab for every option with helpful defaults.

### 📤 Output

Every record carries a `recordType` so views stay tidy — ready for BI tools, CRMs, or your own **social trading data** pipeline:

```json
{
    "recordType": "message",
    "messageId": 663738296,
    "body": "$AAPL $360 soon.",
    "createdAt": "2026-09-07T05:27:22Z",
    "sentiment": null,
    "likeCount": 4,
    "replyCount": 0,
    "reshareCount": 0,
    "hasPriceTarget": false,
    "priceTarget": null,
    "symbols": ["AAPL"],
    "symbolsDetailed": [{ "symbol": "AAPL", "title": "Apple Inc", "exchange": "NASDAQ" }],
    "symbolPrices": [{ "symbol": "AAPL", "price": 320.01 }],
    "username": "onlythebestcompanies",
    "userName": "Tom",
    "userFollowers": 82,
    "url": "https://stocktwits.com/onlythebestcompanies/message/663738296",
    "scrapedAt": "2026-09-07T06:25:42.011Z"
}
```

**Trending symbol** example (`mode: "trending-symbols"`):

```json
{
    "recordType": "trendingSymbol",
    "rank": 1,
    "symbol": "NVDA",
    "title": "NVIDIA Corporation",
    "exchange": "NASDAQ",
    "trendingScore": 8.92,
    "aiSummary": "NVIDIA is surging on AI chip demand...",
    "marketCap": 2810500000000,
    "sector": "Technology",
    "industry": "Semiconductors",
    "scrapedAt": "2026-09-07T09:26:54.370Z"
}
```

#### 🗂️ Output views

| View | Shows |
|---|---|
| 💬 **Messages** | Full message records from symbol / user / trending modes |
| 📊 **Trending Symbols** | Ranked tickers from **trending stocks scraper** mode |
| 📑 **Progress** | Per-target bookkeeping when meta is enabled |

A combined JSON array is also saved under key-value store **`OUTPUT`** for a classic single-file download.

### 🤖 Use via API (Stocktwits API style)

Call the Actor like a lightweight **Stocktwits API** / **Stocktwits Python** workflow and get dataset items back:

```bash
curl -X POST "https://api.apify.com/v2/acts/<YOUR_USERNAME>~stocktwits-scraper/run-sync-get-dataset-items" \
     -H "Authorization: Bearer $APIFY_TOKEN" \
     -H "Content-Type: application/json" \
     -d '{"mode": "symbol", "symbols": ["AAPL", "TSLA"], "maxMessages": 50}'
```

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("YOUR_USERNAME/stocktwits-scraper").call(run_input={
    "mode": "symbol",
    "symbols": ["AAPL", "TSLA"],
    "maxMessages": 100,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
```

Schedule runs, connect Zapier / Make / n8n, or pipe **Stocktwits data** into agents via [Apify MCP](https://docs.apify.com/platform/integrations/mcp).

### 🎯 Best use cases for this stock sentiment analysis tool

- 📡 **Trading signals & stock market sentiment** models from live chatter
- 🧠 **Financial NLP dataset** / LLM fine-tuning on labeled trader text
- 🪙 **Crypto sentiment analysis** and discussion-volume spikes
- 📊 Sentiment dashboards and **market mood tracker** alerts around events
- 🔥 Discover tickers with **Stocktwits trending symbols**, then scrape their full streams
- 👤 Follow top traders’ public posts for **social trading data** research

### 🔗 Integrations & related Actors

This **financial social media scraper** works with Apify’s API, schedules, webhooks, and popular destinations (Sheets, Slack, warehouses, and more).

| Actor | What it helps with |
|---|---|
| [Google Ads Transparency Center Scraper & API](https://apify.com) | Competitor ad creatives and brand tracking across Google surfaces |
| [Y Combinator Scraper](https://apify.com) | Startup directory, founders, jobs, and Launch YC posts |
| [Flipkart Product Scraper](https://apify.com) | Marketplace product, price, and catalog data |

Need a custom pipeline (alerts, enrichment, or a private sentiment feed)? Email **hello.insights.data@gmail.com**.

### ❓ FAQ

#### Does it work for crypto tickers?

Yes — use the `.X` suffix: `BTC.X`, `ETH.X`, `SOL.X`. That keeps this **crypto ticker scraper** aligned with Stocktwits’ own symbols.

#### Why is `sentiment` null for some messages?

Sentiment is user-tagged. Many posts have no Bullish / Bearish label — that is normal for **retail investor sentiment** data.

#### Why did I get zero results?

Check ticker format (crypto needs `.X`), confirm the symbol or username exists, or try `trending-symbols` mode to discover active tickers for your **stock chatter scraper** workflow.

#### Can I only fetch new messages on a schedule?

Yes. Turn on **Monitor mode** and use [Apify Schedules](https://docs.apify.com/platform/schedules) — a standing **Stocktwits monitor** without re-scraping old posts.

#### Can I get results in Python or JavaScript?

Yes. Use the Apify API / SDKs to pull **Stocktwits data** into Python, Node.js, or any HTTP client — the same pattern as calling a lightweight **Stocktwits API**.

#### Is scraping Stocktwits allowed for research?

This Actor collects only publicly available content. Use the data responsibly and in line with Stocktwits’ terms and applicable laws. For compliance questions on a custom deployment, contact **hello.insights.data@gmail.com**.

### 🛟 Support & custom solutions

Bugs or feature ideas? Open an issue on this Actor’s **Issues** tab in Apify Console.

For custom scrapers, scheduled **market mood** syncs, private enrichment, or enterprise exports of **Stocktwits data**, email **hello.insights.data@gmail.com** — we build tailored solutions on top of this Actor.

***

*Data is collected only from Stocktwits’ publicly available pages and feeds. Intended for legitimate market research, sentiment analysis, NLP datasets, and trading research. No authentication, no private messages.*

# Actor input Schema

## `mode` (type: `string`):

What to scrape:<br>📈 <strong>symbol</strong> — messages for one or more stock/crypto tickers<br>👤 <strong>user</strong> — the public post history of one or more Stocktwits users<br>🔥 <strong>trending</strong> — the site-wide trending-messages feed<br>📊 <strong>trending-symbols</strong> — today's ranked trending tickers with AI summaries

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

✨ One ticker per line, bulk-paste supported. Used in <strong>symbol</strong> mode. e.g. <code>AAPL</code>, <code>TSLA</code>. Crypto tickers need their own <code>.X</code> suffix — <code>BTC.X</code>, <code>ETH.X</code> (a bare <code>BTC</code> resolves to a different, non-crypto instrument, so it is never guessed for you). A leading <code>$</code> is stripped automatically.

## `usernames` (type: `array`):

One username per line (no <code>@</code>), bulk-paste supported. Used in <strong>user</strong> mode.

## `maxMessages` (type: `integer`):

Stop after this many messages per symbol/user (or total, for trending & trending-symbols modes). <code>0</code> = unlimited, up to Stocktwits' own API limits. Start low (20-50) to test before scaling up.

## `sentimentFilter` (type: `string`):

Only keep messages with this user-tagged sentiment. Leave on "Any" to keep everything. Roughly 30-50% of messages carry a sentiment tag at all.

## `minLikes` (type: `integer`):

Drop messages with fewer likes than this. Handy for surfacing only the higher-engagement posts.

## `assetClassFilter` (type: `string`):

Only keep messages about stocks or only about crypto, based on whether a message's symbols end in <code>.X</code>.

## `filter` (type: `string`):

Narrow a symbol/user/trending stream to a specific content type before it's even paged through.

## `includeTrendingSymbolDetails` (type: `boolean`):

Tag every message with its primary symbol's current trending-list standing (rank, score, AI summary) — one extra request per run, shared across every target, not one per message.

## `onlyNewMessages` (type: `boolean`):

Turn ON to only fetch messages newer than the last time this Actor ran with the same 'Monitor checkpoint name' below. Perfect for a scheduled run that checks in every few hours without re-scraping what it already saw.

## `monitorStoreName` (type: `string`):

Name of the checkpoint that remembers the last-seen message per target between runs. Use a different name to track separate watchlists independently.

## `onlyPriceTargets` (type: `boolean`):

When ON, only messages carrying a Stocktwits Predict™ price-target prediction are saved. Every message is still scanned either way (there's no server-side filter for this) — it only changes what gets pushed to your dataset.

## `sinceId` (type: `integer`):

Advanced: manually resume a single-target run forward from a specific message ID instead of starting from the newest message. Leave empty for normal use.

## `maxId` (type: `integer`):

Advanced: manually resume a single-target run backward (older messages) from a specific message ID. Leave empty for normal use.

## `includeRawData` (type: `boolean`):

Attach the raw decoded message/symbol object to every record, verbatim — handy for power users and debugging, or if a field isn't mapped yet.

## `legacyKeyAliases` (type: `boolean`):

Also emit snake\_case aliases (message\_id, price\_target, user\_id, ...) alongside the primary camelCase keys, for pipelines expecting either style.

## `includeMeta` (type: `boolean`):

Emit one bookkeeping record per target (recordType "meta") with scan counts and pagination status — visible in its own dataset view.

## `concurrency` (type: `integer`):

How many symbols/usernames are paginated at the same time.

## `httpMaxConcurrency` (type: `integer`):

Hard cap on how many HTTP requests are ever in flight at once, across every target combined.

## `requestDelaySecs` (type: `number`):

A polite minimum pace shared across every concurrent request. Raise this if you see a lot of retry/backoff activity in the log.

## `maxRetries` (type: `integer`):

How many times one failed/blocked request is retried (with backoff) before it's given up on. The residential proxy tier always gets at least 3 attempts.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for a single response before treating it as failed.

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

🚦 Default is NO proxy — the Actor talks to Stocktwits directly. If a request ever gets rejected or blocked, it automatically escalates step-by-step: 🚫 no proxy → 🖥️ datacenter proxy → 🏠 residential proxy (retrying up to 3× on residential), then sticks with residential for the rest of the run. Every escalation is logged clearly. Force a tier yourself here if you already know what you need.

## Actor input object example

```json
{
  "mode": "symbol",
  "symbols": [
    "AAPL",
    "TSLA",
    "BTC.X"
  ],
  "usernames": [
    "jimcramer"
  ],
  "maxMessages": 20,
  "sentimentFilter": "",
  "minLikes": 0,
  "assetClassFilter": "",
  "filter": "all",
  "includeTrendingSymbolDetails": false,
  "onlyNewMessages": false,
  "monitorStoreName": "stocktwits-monitor",
  "onlyPriceTargets": false,
  "includeRawData": false,
  "legacyKeyAliases": true,
  "includeMeta": true,
  "concurrency": 5,
  "httpMaxConcurrency": 4,
  "requestDelaySecs": 0.34,
  "maxRetries": 3,
  "requestTimeoutSecs": 30,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Every scraped record together, in scrape order.

## `messages` (type: `string`):

Only message records — text, sentiment, engagement, symbols, author and price-target fields.

## `trendingSymbols` (type: `string`):

Only trending-symbol records (mode 'trending-symbols') — rank, score, AI summary and fundamentals.

## `progress` (type: `string`):

Per-target bookkeeping: how many messages were scanned and saved for each symbol/user.

## `outputJson` (type: `string`):

Every record from this run in a single combined JSON array — the classic output.json shape — saved to the run's key-value store under the 'OUTPUT' key.

# 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 = {
    "mode": "symbol",
    "symbols": [
        "AAPL",
        "TSLA"
    ],
    "usernames": [
        "jimcramer"
    ],
    "maxMessages": 20,
    "monitorStoreName": "stocktwits-monitor",
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("insights_data/stocktwits-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 = {
    "mode": "symbol",
    "symbols": [
        "AAPL",
        "TSLA",
    ],
    "usernames": ["jimcramer"],
    "maxMessages": 20,
    "monitorStoreName": "stocktwits-monitor",
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("insights_data/stocktwits-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 '{
  "mode": "symbol",
  "symbols": [
    "AAPL",
    "TSLA"
  ],
  "usernames": [
    "jimcramer"
  ],
  "maxMessages": 20,
  "monitorStoreName": "stocktwits-monitor",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call insights_data/stocktwits-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,insights_data/stocktwits-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/pvb9gswzYg1jHWo9w/builds/rOOoe8GVdeQrLUYtu/openapi.json
