Stocktwits Scraper
Pricing
from $0.03 / 1,000 message scrapeds
Stocktwits Scraper
Track public Stocktwits ticker messages, bullish/bearish sentiment, users, likes, replies, and mentioned cashtags for market monitoring.
Pricing
from $0.03 / 1,000 message scrapeds
Rating
0.0
(0)
Developer
Hanna Nosova
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
13 hours ago
Last modified
Categories
Share
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.
Output fields
| JSON key | Label | Type | Description |
|---|---|---|---|
symbol | Symbol | string | Output field for symbol. |
messageId | MessageId | integer | Output field for messageid. |
body | Body | string | Output field for body. |
createdAt | CreatedAt | string / null | Output field for createdat. |
userId | UserId | integer / null | Output field for userid. |
username | Username | string / null | Output field for username. |
userName | UserName | string / null | Output field for username. |
avatarUrl | AvatarUrl | string / null | Output field for avatarurl. |
sentiment | Sentiment | string / null | Output field for sentiment. |
likes | Likes | integer | Output field for likes. |
replies | Replies | integer | Output field for replies. |
mentionedSymbols | MentionedSymbols | array | Output field for mentionedsymbols. |
sourceUrl | SourceUrl | string | Output field for sourceurl. |
raw | Raw | object | Output field for raw. |
Pricing
This Actor uses Apify pay-per-event pricing. The prices below come from the current Actor pricing configuration. Apify public plans map to Store discount tiers, so the table shows both the user-facing plan context and the pricing tier name. The final price shown in Apify depends on the user account plan and any custom agreement.
| Event | What is charged | Price |
|---|---|---|
run-started | One-time fee per run. | $0.005 |
| Event | What is charged | Free / no discount | Starter / Bronze | Scale / Silver | Business / Gold | Custom / Platinum | Custom / Diamond |
|---|---|---|---|---|---|---|---|
message-scraped | Per Stocktwits message saved to the dataset. | $0.06018 / 1,000 | $0.05233 / 1,000 | $0.04082 / 1,000 | $0.0314 / 1,000 | $0.02093 / 1,000 | $0.01465 / 1,000 |
Apify may also charge platform usage for compute, storage, proxies, or data transfer outside this Actor pricing. Check the Actor run and the Apify Pricing tab for the exact cost shown to your account.
How to use Stocktwits Scraper
- Open the actor on Apify.
- Add one or more Stocktwits symbols, for example
AAPL,TSLA, orMSFT. - Set the number of messages per symbol.
- Run the actor.
- 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. |
Ready-to-run examples
- Stocktwits Raw Json Sample
- Crypto Stocktwits Message Export
- Stocktwits Etf Market Watchlist
- Monitor Meme Stock Stocktwits
- Track Tech Stocktwits Sentiment
View all ready-to-run examples
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
messageIdfrom each run if you need incremental updates. - Keep
includeRawoff 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 ApifyClientimport osclient = 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().itemsprint(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.
FAQ
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.
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.
Related actors
- Mastodon Posts & Profiles Scraper
- Rotten Tomatoes Movies & Reviews Scraper
- Substack Posts Scraper
- Telegram Channel Posts Scraper
- Bilibili Video Search Scraper
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.