Stocktwits Scraper at a glance
Stocktwits Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes kind, recordid, messageid, url and body, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.00 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Web data
- Pricing
- $2.00 per 1,000 results (Free plan), from $1.20 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 20 options
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.
What Stocktwits Scraper can do
- Ready-made sentiment dataset: each message carries the sentiment label its own author chose, Bullish, Bearish or untagged, no inference needed.
- One schema, four record kinds: symbol streams, user messages, thread replies and profiles all land in the same fields, filtered by the kind column.
- Reply threads on demand: turn on reply fetching and get every reply the site returns for a message, each with its own author and sentiment, with no cap on the actor's side.
- Trending symbols and profiles: the current trending list with watchlist counts, and user profiles with follower, following and idea counts.
- Five ways to point it: tickers, usernames, message links or IDs, pasted Stocktwits links, or the current trending list, no URL building required.
- Incremental monitoring: recurring runs on the same input report only NEW, UPDATED, REAPPEARED or EXPIRED records, with resume support for interrupted runs.
Choose what to collect
These inputs let you configure Stocktwits Scraper - Messages, Sentiment & Trending. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Symbols reads the message stream of one or more tickers. Trending returns the current trending symbols. Users reads a profile and its recent messages. Threads reads the full reply thread of specific messages. URL mode reads the Stocktwits pages you paste. Trending messages returns the site-wide trending message stream. The values symbol, user and trending-symbols are accepted as aliases of symbols, users and trending. |
symbolsarray | Symbols mode: one ticker per line, with or without the $ prefix. Share classes (BRK.A, BRK.B, BRK.C) and crypto tickers (BTC.X) keep their dotted suffix; foreign exchange suffixes such as .TO.HK or .L (VOD.L) are not supported and are skipped with a warning. Each symbol's message stream is walked from newest to oldest. Multi-value supported. |
sortstring | Symbols mode: All returns the newest messages first. Top returns the stream ordered by engagement, matching the site's Top view. |
usernamesarray | Users mode: one Stocktwits username per line, with or without the @ prefix. Returns the profile record plus the user's recent messages. Multi-value supported. |
messageUrlsarray | Threads mode: one message per line, as a full link (stocktwits.com/user/message/123456) or a bare numeric message ID. Returns the message and its full reply thread. Multi-value supported. |
startUrlsarray | URL mode: Stocktwits pages to read, one per line. Symbol pages (stocktwits.com/symbol/AAPL, also ?filter=top, the /sentiment and /news sub-pages, a dotted share-class ticker like /symbol/BRK.B, and crypto like /symbol/BTC.X) are walked as message streams, profile pages as user reads, message links (stocktwits.com//message/) as reply threads, /topic/ pages as topic streams, and /sentiment/trending (or /markets/trending) returns the trending symbols. The /sentiment and /news sub-pages and /markets/trending read the same data as their parent page (the symbol stream, the trending list), so they stay in the example list but not in the default. Unsupported links are skipped with a warning. Multi-value supported. |
sentimentstring | Keep only messages with a chosen crowd sentiment. All keeps every message; the other values keep only messages the authors tagged Bullish or Bearish. Untagged messages are labelled None. Applies to every mode that returns messages. |
Show 13 more inputs
| Input | What it controls |
|---|---|
onlyPriceTargetsboolean | Keep only messages that carry a structured price target (priceTarget, date and starting price). Messages without one are skipped before they reach the dataset, so they are never billed. Scanning stops after 100 pages per target when targets are rare. |
fetchRepliesboolean | For each returned message, also read its full reply thread and return every public reply as its own record. Adds a surcharge billed per thread read: one event for the read itself plus one per started block of 10 replies returned (see the Reply threads section of the README). Turning this on can be slow and heavy on large, talkative symbols: each thread is one extra read per message. |
maxItemsinteger | Stop after this many records (0 = no limit; the run then stops when the streams run out). Large, active symbol streams never run out on their own. Defaults to 20. Capped at 100000. |
maxMessagesinteger | Cap on messages taken from each symbol, user, link or the trending stream. Leave empty for no per-target cap (only the Max items total and its even split apply). To take N messages from each of several targets, set this to N and raise Max items (or use 0) so the total does not cut it short. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a large pull without returning messages already collected there. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. The first run returns every matching record as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED records. A record counts as UPDATED when its content changed: message text, sentiment, symbols and cashtags tagged, author name or identity, or a profile or symbol detail. These never trigger UPDATED on their own, though they stay in the output with their live values: likes, replies count, reshares, mentioned users, author followers, symbol watchlist count, trending rank, sentiment and volume change, and live quote numbers. Add more names in Ignore fields when detecting changes. Turn on Emit unchanged or Emit expired only when you also want those rows returned (and billed). State is kept separately for each input setup; use State key to name or deliberately share a monitoring campaign. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or deliberately share state across differently configured runs. Leave empty to let the actor derive a key automatically from the mode and input settings. |
emitUnchangedboolean | Off by default. Turn on to also return records that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have. |
emitExpiredboolean | Off by default. Turn on to also return records that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked input without stopping early. |
ignoreFieldsForChangesarray | Optional. Field names to exclude from UPDATED change detection, on top of the built-in list (likes, repliesCount, reshares, mentionedUsers, authorFollowers, watchlistCount, trendingRank, sentimentChange, volumeChange and the live quote fields). Use a top-level name such as sourceLabel, or a dotted path such as symbols.exchange to ignore a nested field inside every element of a list. Ignored fields stay in the output; they only stop triggering UPDATED and stop appearing in changedFields. |
mcpConnectorsarray | Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write or digest. Leave empty to skip; never changes the dataset output. |
notionParentPageUrlstring | URL or id of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
kindkindrecordIdrecordIdmessageIdmessageIdurlurlbodybodycreatedAtcreatedAtsentimentsentimentlikeslikesrepliesCountrepliesCountresharesresharescashtagscashtagssymbolssymbolsShow 63 more fields
mentionedUsersmentionedUsersparentMessageIdparentMessageIdinReplyToMessageIdinReplyToMessageIdauthorUsernameauthorUsernameauthorNameauthorNameauthorFollowersauthorFollowersauthorIdentityauthorIdentityauthorOfficialauthorOfficialsymbolContextsymbolContextsymbolsymbolsymbolTitlesymbolTitleexchangeexchangeregionregionwatchlistCountwatchlistCounttrendingRanktrendingRankuserIduserIdprofileUrlprofileUrljoinDatejoinDatefollowingfollowingideasideaschangeTypechangeTypechangedFieldschangedFieldsfirstSeenAtfirstSeenAtlastSeenAtlastSeenAtlikeCountlikeCountreplyCountreplyCountreshareCountreshareCountisReshareisReshareisReplyisReplyisDiscussionisDiscussionconversationParentMessageIdconversationParentMessageIdpriceTargetpriceTargetpriceTargetCurrencypriceTargetCurrencypriceTargetDatepriceTargetDatepriceTargetStartDatepriceTargetStartDatepriceTargetStartingPricepriceTargetStartingPricepriceTargetCurrentPricepriceTargetCurrentPricechartUrlchartUrlmediaUrlmediaUrlsourceTitlesourceTitleuserNameuserNameuserAvatarUrluserAvatarUrluserFollowersuserFollowersuserFollowinguserFollowinguserIdeasuserIdeasuserOfficialuserOfficialuserJoinDateuserJoinDatescrapedAtscrapedAtsymbolDisplaysymbolDisplaytitletitleinstrumentClassinstrumentClasslogoUrllogoUrlrankranktrendingScoretrendingScoretrendSummarytrendSummarymarketCapmarketCapsectorsectorindustryindustryusernameusernamenamenameidentityidentityfollowersfollowersofficialofficialExample output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"kind": "message",
"recordId": "m:900000001",
"messageId": 900000001,
"url": "https://stocktwits.com/sampletrader/message/900000001",
"body": "Sample trading note about the sample company. $SAMPLE looking ready for a breakout.",
"createdAt": "2027-01-15T19:30:24Z",
"sentiment": "Bullish",
"likes": 12,
"repliesCount": 3,
"reshares": 0,
"cashtags": [
"SAMPLE"
],
"symbols": [
{
"symbol": "SAMPLE",
"title": "Sample Company Inc",
"exchange": "NYSE"
}
],
"mentionedUsers": [
"othersample"
],
"authorUsername": "sampletrader",
"authorName": "Sample Trader",
"authorFollowers": 420,
"authorIdentity": "User",
"authorOfficial": false,
"sourceLabel": {
"id": 1,
"title": "Sample App",
"url": "https://example.com"
},
"symbolContext": "SAMPLE"
}Ways to use this data
- Sentiment and quant researchers: build a bullish or bearish crowd sentiment series per ticker for signal research or backtesting.
- Community and social teams: track trending symbols and message volume to see what traders are talking about right now.
- Trust and safety reviewers: pull the full public reply thread around one message for moderation or dispute review.
- Growth and influencer tracking: monitor a trader's profile, follower count and idea count over time.
- Alerting and monitoring bots: schedule recurring runs with incremental mode and get only the new or changed messages since last time.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Stocktwits Scraper return?
The documented output for Stocktwits Scraper includes kind, recordid, messageid, url, body, createdat, sentiment and likes. Availability of each field depends on the source page and the selected mode.
How much does Stocktwits Scraper cost?
It costs $2.00 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new or changed messages on a schedule?
Yes. Schedule the actor from the Schedules tab with the same input and turn on Incremental mode. Later runs then return only NEW, UPDATED and REAPPEARED records; unchanged ones are skipped unless you also turn on Emit unchanged.
What is the difference between Threads mode and turning on Fetch reply threads?
Threads mode reads one specific message you name and its public reply thread; no toggle needed, the thread is the surface you asked for. Fetch reply threads is an add on switch for Symbols and Users mode: turn it on and every returned message also gets its own thread read, with its replies added as their own records, at a surcharge.
Why did my run fail instead of returning an empty dataset?
If a run returns no records and at least one read was refused or not found, the run fails with a clear message instead of quietly reporting a dataset with zero records, so "nothing matched" is never confused with "nothing could be read". A message that exists but has no replies is returned on its own (the log notes it has no replies; it is not treated as missing). A ticker, username or message that does not exist is reported in the log and skipped, and the run still succeeds if anything else was returned; but when it is the only target, the run fails, so check the spelling first.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into the apps you authorized.
