Stocktwits Scraper - Messages, Sentiment & Trending
Pricing
from $1.20 / 1,000 message or profile records
Stocktwits Scraper - Messages, Sentiment & Trending
Scrape Stocktwits message streams with bull/bear sentiment labels, bodies, likes, replies, cashtags and author stats for any symbol. Trending symbols, user profiles and full reply threads. Incremental monitoring, resume and MCP export.
Pricing
from $1.20 / 1,000 message or profile records
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Stocktwits Scraper
Pull the retail-trader conversation from Stocktwits (stocktwits.com): symbol message streams with the crowd's own Bullish / Bearish sentiment labels, full reply threads, user profiles and the trending symbols list. Every message record carries the body, the author, the sentiment tag the author chose, likes, reply counts and the cashtags it mentions. Recurring runs can report only what changed.
Why This Scraper?
- Ready-made sentiment dataset: authors tag their own messages Bullish or Bearish; every record ships that label (or None), no inference required.
- Any surface, one schema: a single record shape covers symbol streams,
user messages, thread replies, profiles and trending symbols, filtered by
the
kindfield. - Full reply threads: open any message and get every public reply with its own author, sentiment and likes (the reviews-analog surface).
- Trending and profiles: the current trending symbols with watchlist counts, and user profiles with follower, following and idea counts.
- Incremental monitoring: recurring runs emit only NEW, UPDATED, REAPPEARED or EXPIRED records against the same input, with first-seen and last-seen timestamps.
- Resume support: continue an interrupted run without returning records already collected.
Data You Get
Sample shape, values are illustrative placeholders, not from a live listing.
| Field | Example value |
|---|---|
kind | message |
recordId | m:00000000 |
messageId | 00000000 |
url | https://stocktwits.com/sampletrader/messages/00000000 |
body | Sample trading note about the sample company. $SAMPLE looking ready. |
createdAt | 2027-01-15T19:30:24Z |
sentiment | Bullish (or Bearish, or None for untagged) |
likes | 0 |
repliesCount | 0 |
reshares | 0 |
cashtags | ["SAMPLE"] |
symbols | [{"symbol": "SAMPLE", "title": "Sample Company Inc", "exchange": "NYSE"}] |
mentionedUsers | [] |
authorUsername / authorName | sampletrader / Sample Trader |
authorFollowers | 0 |
authorIdentity / authorOfficial | User / false |
symbolContext | SAMPLE (the stream the message was read from) |
kind | reply (thread replies add parentMessageId, inReplyToMessageId) |
kind | symbol (trending: symbol, symbolTitle, exchange, region, watchlistCount, trendingRank) |
kind | user (profiles: userId, username, profileUrl, joinDate, followers, following, ideas) |
changeType / changedFields / firstSeenAt / lastSeenAt | incremental mode only |
Modes
| Mode | Input | What you get |
|---|---|---|
symbols | symbols (tickers, $ optional) | each ticker's message stream walked newest-first |
trending | none | the current trending symbols with ranks |
users | usernames (@ optional) | profile record + the user's recent messages |
threads | messageUrls (links or bare message IDs) | the message + every public reply |
url | startUrls | symbol pages walked as streams, profile pages as user reads, message links as threads |
Filters
- Stream order (symbols mode):
all(newest first, the default) ortop(the site's engagement-ranked order). - Sentiment filter: keep only
Bullish,Bearishor untagged (None) messages. Runs on every fetched message in every mode that returns them.
Reply threads (opt-in, surcharge per 10 replies)
Turn on Fetch reply threads to read each returned message's conversation
(one extra read per message) and emit every public reply as its own reply
record. There is no reply cap: the full public thread is returned. Threads
mode needs no toggle: the thread is the surface you asked for. Large,
talkative symbols can make this heavy, so:
- the thread read bills one
detail-enrichmentevent, plus one more per started block of 10 replies returned (a 25-reply thread bills 3), - a run-level breaker stops thread fetching for the rest of the run when threads keep failing,
- a suppressed incremental record never triggers a thread read or the surcharge.
Limits
Max items is the one cap: it defaults to 20, and 0 means no limit (the
run then stops when the streams run out). Large, active symbol streams
effectively never run out, so set a limit when you do not need the full
history.
Resume and recurring updates
- Resume (
resumeFromRunId): paste a previous run or dataset ID to skip records already collected there. - Incremental mode (
incrementalMode): for scheduled monitoring. The first run reports every record NEW; later runs report NEW, UPDATED and REAPPEARED. Like and reply counts move constantly, so they never mark a message UPDATED; a real body or sentiment change does. emitUnchanged/emitExpired: off by default; turning them on returns (and bills) extra rows. EXPIRED detection only fires after a complete, uninterrupted scan, so a capped or partial run never tombstones live records.
Send results into your apps (MCP connectors)
You can optionally pipe results into apps you already use via Model Context
Protocol (MCP) connectors. Authorize a connector under Apify, Settings, API &
Integrations, then select it in the mcpConnectors input field. For Notion,
set notionParentPageUrl to the page under which item pages are created; the
Notion export writes a page per record with a readable summary. Other
connectors get a best-effort write or digest. Cap the export with
maxNotifyListings. Leave mcpConnectors empty to skip the export entirely;
the dataset output is never changed by the connector surface.
Connection and limits
- Runs on the plain Apify proxy by default; every plan works. The source answered identically on datacenter and residential exits when probed, so there is no need to pay for residential unless you want to.
- Per-request timeout 15 s, at most 5 attempts per read, short backoff, and a fresh exit on transport errors: the run fails fast rather than grinding.
- If every read is refused, the run fails loudly instead of reporting an empty success; a genuinely empty result succeeds with a warning.
Usage notes
- Tickertime note: symbol streams cover stocks, ETFs, crypto pairs and futures tickers that exist on Stocktwits. An unknown ticker is reported and skipped, and a run where nothing could be read fails loudly.
- One dataset, mixed kinds: filter on
kind(message,reply,symbol,user) in the dataset views.