Stocktwits Scraper

Track public Stocktwits ticker messages, bullish/bearish sentiment, users, likes, replies, and mentioned cashtags for market monitoring.

Data fields

FieldTypeDescription
symbolstringValue exported as symbol.
messageIdintegerValue exported as messageId.
bodystringValue exported as body.
createdAtstring | nullValue exported as createdAt.
userIdinteger | nullValue exported as userId.
usernamestring | nullValue exported as username.
userNamestring | nullValue exported as userName.
avatarUrlstring | nullValue exported as avatarUrl.

Input preview

symbolsStocktwits symbols *
maxMessagesPerSymbolMessages per symbol
sinceMessageIdSince message ID
beforeMessageIdBefore message ID
includeRawInclude raw message JSON
proxyConfigurationProxy configuration

API and agents

This actor can be run through Apify API, datasets, webhooks, schedules, and the official Apify MCP server.

Ready-to-run examples

Open a saved Apify example, adjust the input, and run the actor in your own Apify account.

View all examples

How this actor works

See example inputs, outputs, API usage, and practical limits before running this actor on Apify.

Open Apify page

Scrape public Stocktwits ticker conversations into a clean Apify dataset. Track trader messages, bullish or bearish sentiment, authors, likes, replies, mentioned cashtags, and direct message URLs for any public Stocktwits symbol stream.

Use this actor when you need structured Stocktwits data for market monitoring, sentiment dashboards, alerts, research, or investor-relations workflows.

What does Stocktwits Scraper do?

Stocktwits Scraper collects public messages from Stocktwits symbol streams such as AAPL, TSLA, MSFT, or $NVDA.

It returns one dataset row per message with normalized fields that are ready for spreadsheets, BI tools, databases, and automations.

The actor can collect recent messages for multiple symbols in one run and can optionally use Stocktwits message IDs for incremental collection.

Who is it for?

  • ๐Ÿ“ˆ Traders tracking ticker-level discussion and market mood
  • ๐Ÿง  Quant researchers building sentiment datasets
  • ๐Ÿ“ฐ Finance journalists watching fast-moving narratives
  • ๐Ÿข Investor-relations teams monitoring public market chatter
  • ๐Ÿ”” Automation builders creating ticker alerts
  • ๐Ÿ“Š Analysts comparing sentiment across symbols

Why use this scraper?

Stocktwits is fast-moving and difficult to monitor manually across many tickers. This actor turns public symbol conversations into a structured dataset with consistent field names.

You can schedule it, call it from an API, connect it to Make or Zapier, or export results to CSV, JSON, Excel, Google Sheets, BigQuery, and other Apify integrations.

What Stocktwits data can I scrape?

You can scrape public symbol message streams. For each requested symbol, the actor returns the newest public messages up to your configured limit.

Typical use cases include collecting the latest messages for watchlists, comparing bullish and bearish mentions, or building a rolling archive with sinceMessageId.

How to use Stocktwits Scraper

  1. Open the actor on Apify.
  2. Add one or more Stocktwits symbols, for example AAPL, TSLA, or MSFT.
  3. Set the number of messages per symbol.
  4. Run the actor.
  5. Export the dataset or connect it to your workflow.

Input settings

Setting JSON key Type / default Description
Stocktwits symbols symbols array, default ["AAPL","TSLA"] Ticker or cashtag symbols to scrape from Stocktwits. Use values like AAPL, TSLA, MSFT, or $NVDA.
Messages per symbol maxMessagesPerSymbol integer, default 20 Maximum number of messages to save for each Stocktwits symbol.
Since message ID sinceMessageId integer Only request messages newer than this Stocktwits message ID, when supported by the public stream.
Before message ID beforeMessageId integer Start pagination before this Stocktwits message ID to collect older messages.
Include raw message JSON includeRaw boolean, default false Add the raw Stocktwits message object to each dataset item for debugging or custom parsing.
Proxy configuration proxyConfiguration object, default {"useApifyProxy":false} Optional Apify proxy settings. Leave disabled unless your network is blocked by Stocktwits.

Example input

{
  "symbols": ["AAPL", "TSLA"],
  "maxMessagesPerSymbol": 20,
  "includeRaw": false
}

Example output

{
  "symbol": "AAPL",
  "messageId": 123456789,
  "body": "$AAPL watching the breakout level",
  "createdAt": "2026-07-03T15:00:00Z",
  "userId": 12345,
  "username": "marketwatcher",
  "userName": "Market Watcher",
  "avatarUrl": "https://...",
  "sentiment": "bullish",
  "likes": 4,
  "replies": 1,
  "mentionedSymbols": ["AAPL", "SPY"],
  "sourceUrl": "https://stocktwits.com/marketwatcher/message/123456789"
}

Tips for best results

  • Start with a small symbol list and increase after checking output quality.
  • Use scheduled runs for rolling sentiment monitoring.
  • Store the highest messageId from each run if you need incremental updates.
  • Keep includeRaw off unless you need it, because raw payloads increase dataset size.
  • Use symbols that have active Stocktwits streams for non-empty outputs.

Handling empty streams

Some symbols may have little or no recent Stocktwits activity. If a symbol returns no rows, try a more active ticker such as AAPL, TSLA, NVDA, or SPY to confirm your setup.

Integrations

Stocktwits Scraper works with Apify integrations and webhooks.

  • ๐Ÿ“Š Send dataset exports to Google Sheets for analyst review.
  • ๐Ÿ”” Trigger a webhook when new messages are collected.
  • ๐Ÿง  Feed messages into sentiment or LLM classification pipelines.
  • ๐Ÿ—„๏ธ Store results in BigQuery, Snowflake, PostgreSQL, or S3.
  • ๐Ÿ“ฌ Build alerts for bullish or bearish spikes.

API usage

Run Stocktwits Scraper from your own code with the Apify API.

Node.js

import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const input = {
  "symbols": [
    "AAPL",
    "TSLA"
  ],
  "maxMessagesPerSymbol": 20,
  "sinceMessageId": 1,
  "beforeMessageId": 1,
  "includeRaw": false
};

const run = await client.actor('fetch_cat/stocktwits-scraper').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

from apify_client import ApifyClient
import os

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("fetch_cat/stocktwits-scraper").call(run_input={
  "symbols": [
    "AAPL",
    "TSLA"
  ],
  "maxMessagesPerSymbol": 20,
  "sinceMessageId": 1,
  "beforeMessageId": 1,
  "includeRaw": false
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)

cURL

curl -X POST "https://api.apify.com/v2/acts/fetch_cat~stocktwits-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"symbols":["AAPL","TSLA"],"maxMessagesPerSymbol":20,"sinceMessageId":1,"beforeMessageId":1,"includeRaw":false}'

Use with AI agents via MCP

Stocktwits Scraper can be used by AI assistants through the hosted Apify MCP server.

Claude Code setup

claude mcp add --transport http apify "https://mcp.apify.com?tools=fetch_cat/stocktwits-scraper"

Claude Desktop, Cursor, or VS Code JSON config

{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=fetch_cat/stocktwits-scraper"
    }
  }
}

Example prompts

  • "Run Stocktwits Scraper with this input JSON and summarize the dataset."
  • "Export the latest Stocktwits Scraper results to a table I can review."
  • "Schedule this Actor for monitoring and tell me what changed between runs."

Scheduling

For continuous monitoring, schedule runs every 15 minutes, hourly, or daily depending on your needs. Store the latest message IDs between runs if you want incremental collection.

Data quality notes

Stocktwits messages are user-generated content. Sentiment is returned when available from Stocktwits. Not every message has sentiment, replies, or complete user profile metadata.

Legality and responsible use

This actor collects publicly available Stocktwits data. You are responsible for using the results in compliance with applicable laws, Stocktwits terms, and your own data policies. Avoid collecting or processing personal data unless you have a lawful basis.

Troubleshooting

Why did my run return fewer messages than requested?

The symbol may have limited recent activity, or the public stream may not provide enough older messages for the requested boundary.

Why is sentiment null?

Not every Stocktwits message has a bullish or bearish sentiment label. Null means no sentiment was present for that message.

Should I enable proxies?

Leave proxies disabled by default. Enable an Apify proxy only if your environment cannot reach Stocktwits reliably.

Support

Report bugs, wrong output, blocked runs, or missing fields from the Actor page. Include the Apify run ID or run URL, your input JSON, what you expected, what the Actor returned, and one reproducible public URL so the issue can be tested quickly.

Field reference details

sourceUrl points to the public Stocktwits message page when a username is available. mentionedSymbols includes cashtags returned with the message and may include the requested symbol plus other referenced tickers.

Export formats

Apify datasets can be exported as JSON, CSV, Excel, XML, RSS, and HTML. CSV and Excel are convenient for analysts; JSON is best for pipelines.

Performance expectations

The actor is HTTP-based and designed for quick runs. Runtime mainly depends on the number of symbols and messages requested.

Monitoring workflows

A common workflow is to run the actor every hour for a watchlist, filter for messages with sentiment, and alert when bearish or bullish counts change sharply.

Research workflows

Researchers can collect historical samples by using beforeMessageId and repeated runs. Keep your collection rate conservative and document your methodology.

Investor-relations workflows

IR teams can monitor tickers around earnings calls, product launches, analyst reports, and market-moving news.

Automation workflows

Use Apify webhooks to trigger downstream jobs after the dataset is ready. For example, send the dataset to an LLM summarizer or a dashboard refresh.

Common questions

Questions and answers reused from the canonical actor README.

Does Stocktwits Scraper require a Stocktwits account?

No. The actor collects public ticker stream messages that are visible without a Stocktwits login.

Can I monitor multiple tickers in one run?

Yes. Add multiple symbols such as AAPL, TSLA, MSFT, and NVDA; the actor applies maxMessagesPerSymbol to each symbol.

Does the actor return bullish and bearish sentiment?

Yes when Stocktwits includes a sentiment label for the message. Messages without a label return null so your workflow can distinguish missing labels from bearish or bullish labels.

Can I collect older messages?

Use beforeMessageId to request messages older than a known message id. For recurring monitoring, save the newest messageId and use it as sinceMessageId in the next run.