Stocktwits Sentiment Scraper avatar

Stocktwits Sentiment Scraper

Pricing

from $0.01 / 1,000 message/symbols

Go to Apify Store
Stocktwits Sentiment Scraper

Stocktwits Sentiment Scraper

Collect current public Stocktwits messages for symbols and users, plus trending messages and symbols. Get source sentiment, text sentiment, author details, market context, and direct links in a structured dataset. No Stocktwits login or API key is needed.

Pricing

from $0.01 / 1,000 message/symbols

Rating

0.0

(0)

Developer

Maxime Dupré

Maxime Dupré

Maintained by Community

Actor stats

0

Bookmarked

24

Total users

6

Monthly active users

a day ago

Last modified

Share

📈 Stocktwits data for market research

Stocktwits Scraper helps traders, analysts, and researchers collect current public Stocktwits messages, user posts, and ranked trending symbols. It returns source sentiment, a separate text sentiment label, author and market context, and direct source links in structured dataset rows for market research and downstream analysis.

Message rows contain message text, publication time, source sentiment, a text-based sentiment label, cashtags, mentions, public author fields, media, conversation details, and optional price-target fields. Trending-symbol rows contain ranked symbol identity, watchlist context, source trend fields, and market classification.

Some source values can be null or empty when Stocktwits does not provide them. When the same message is found through more than one submitted symbol or username, the Actor saves the first eligible match and skips later matches. matchedInput shows the symbol or username that first found that saved message.

🚀 Run Stocktwits Scraper

  1. Open the Input tab.
  2. Choose symbol, user, trending, or trending-symbols in Result type.
  3. Add ticker symbols or public usernames when the chosen mode needs them.
  4. Set a work limit, or leave it empty to collect all available results until the relevant public source is exhausted.
  5. Start the Actor and open the dataset.

A Stocktwits login or API key is not needed for this public data.

⚙️ Input

The selected mode controls which public rows the run requests. Fields for another mode are ignored.

Input fields

FieldTypeWhat it does
modestringChooses symbol messages, user posts, trending messages, or trending symbols.
symbolsarray of stringsSupplies Stocktwits ticker symbols for symbol mode. Crypto symbols use the .X suffix, such as BTC.X or ETH.X.
usernamesarray of stringsSupplies public Stocktwits usernames without the @ sign for user mode.
maxTrendingSymbolsinteger, optionalSets the number of ranked symbols for trending-symbols mode. Leave it empty to return all available results until the public trending source is exhausted.
maxMessagesPerTargetinteger, optionalSets the number of recent messages for each submitted symbol or username in symbol or user mode. Leave it empty to return all available messages until the public feed is exhausted.

For both work limits, leaving the field empty returns all available results until the relevant source is exhausted.

Example input

This is the public input from a successful hosted QA default-input run on the current beta build:

{
"mode": "symbol",
"symbols": [
"AAPL",
"TSLA",
"NVDA",
"SPY",
"MSTR"
],
"usernames": [],
"maxMessagesPerTarget": 30
}

🧾 Output

Each dataset row is either a message or a trending symbol.

Message rows

FieldTypeWhat it does
recordTypestringIdentifies a message row as message.
messageIdinteger or nullStocktwits message ID.
messageUrlstring or nullDirect link to the Stocktwits message.
matchedInputstring or nullSubmitted symbol or username that first found the message.
bodystring or nullMessage text.
createdAtdate-time string or nullTime the message was posted in ISO 8601 format.
sourceSentimentstring or nullStocktwits Bullish or Bearish label, or null when none is present.
computedSentimentstring or nullPositive, neutral, or negative label based on the message text.
cashtagsobject[]Cashtags found in the message.
cashtags[].symbolstring or nullCashtag symbol.
cashtags[].titlestring or nullCompany or asset name.
cashtags[].exchangestring or nullExchange name.
cashtags[].watchlistCountinteger or nullStocktwits watchlist count for the cashtag.
cashtags[].currentPricenumber or nullPrice shown with the message.
mentionsstring[]Stocktwits usernames named in the message.
authorobject or nullPublic facts about the author.
author.usernamestring or nullAuthor username.
author.namestring or nullAuthor display name.
author.avatarUrlstring or nullAuthor profile image URL.
author.officialboolean or nullWhether Stocktwits marks the author as official.
author.followersinteger or nullAuthor follower count.
author.followinginteger or nullNumber of accounts the author follows.
author.ideasinteger or nullAuthor idea count shown by Stocktwits.
author.likesinteger or nullNumber of posts the author has liked.
author.watchlistCountinteger or nullNumber of symbols on the author's watchlist.
author.joinedAtstring or nullDate the author joined Stocktwits.
mediaobject[]Media attached to the message.
media[].typestring or nullMedia type.
media[].urlstring or nullMedia URL.
media[].widthinteger or nullMedia width in pixels.
media[].heightinteger or nullMedia height in pixels.
chartUrlstring or nullLink to a chart attached to the message.
likesinteger or nullNumber of likes on the message.
conversationobject or nullReply details from Stocktwits.
conversation.parentMessageIdinteger or nullParent message ID.
conversation.inReplyToMessageIdinteger or nullMessage ID this post replies to.
conversation.repliesinteger or nullReply count.
conversation.isParentboolean or nullWhether this is a parent message.
priceTargetobject or nullPrice-target details from Stocktwits when present.
priceTarget.pricenumber or nullTarget price.
priceTarget.currencystring or nullTarget currency.
priceTarget.datestring or nullTarget date.
priceTarget.startingPricenumber or nullStarting price for the target.
priceTarget.currentPricenumber or nullCurrent price shown for the target.

Genuine message row

This genuine row is from a successful run on the current beta build:

{
"recordType": "message",
"messageId": 664878825,
"messageUrl": "https://stocktwits.com/RaisingGainz/message/664878825",
"matchedInput": "AAPL",
"body": "$AAPL $BTC.X $ETH.X \n\nTHE NEW iOS UPDATE SUCKS. \nWTF iOS 27 GOT MY PHONE BATTERY DRAINING 3x AS QUICK",
"createdAt": "2026-09-23T06:08:38Z",
"sourceSentiment": null,
"computedSentiment": "neutral",
"cashtags": [
{
"symbol": "AAPL",
"title": "Apple Inc",
"exchange": "NASDAQ",
"watchlistCount": 994571,
"currentPrice": 339.89
},
{
"symbol": "BTC",
"title": "Bitcoin",
"exchange": "CRYPTO",
"watchlistCount": 681354,
"currentPrice": null
},
{
"symbol": "ETH",
"title": "Ethereum",
"exchange": "CRYPTO",
"watchlistCount": 338039,
"currentPrice": null
}
],
"mentions": [],
"author": {
"username": "RaisingGainz",
"name": "Nate",
"avatarUrl": "https://avatars.stocktwits.com/production/6032403/thumb-1635365145.png",
"official": false,
"followers": 73,
"ideas": 2848,
"following": 19,
"likes": 3987,
"watchlistCount": 4,
"joinedAt": "2021-10-27"
},
"media": [],
"chartUrl": null,
"likes": null,
"conversation": null,
"priceTarget": null
}

Trending-symbol rows

FieldTypeWhat it does
recordTypestringIdentifies a trending-symbol row as trendingSymbol.
rankinteger or nullTrending rank, starting at one.
symbolstring or nullTrending Stocktwits symbol.
titlestring or nullCompany or asset name.
exchangestring or nullExchange name.
regionstring or nullRegion code.
instrumentClassstring or nullType of market item.
logoUrlstring or nullSymbol logo image URL.
watchlistCountinteger or nullStocktwits watchlist count.
sentimentChangenumber or nullSentiment change supplied by Stocktwits.
volumeChangenumber or nullDiscussion-volume change supplied by Stocktwits.
trendScorenumber or nullTrend score supplied by Stocktwits.
trendSummarystring or nullTrend summary supplied by Stocktwits.
sectorstring or nullMarket sector.
industrystring or nullMarket industry.
marketCapnumber or nullMarket value supplied for the company.

Genuine trending-symbol row

This genuine row is from a successful trending-symbols run on the current beta build:

{
"recordType": "trendingSymbol",
"rank": 1,
"symbol": "XRP.X",
"title": "Ripple",
"exchange": "CRYPTO",
"region": "X",
"instrumentClass": "CRYPTO",
"logoUrl": "https://logos.stocktwits-cdn.com/XRP.X.webp",
"watchlistCount": 238827,
"sentimentChange": 7.28,
"volumeChange": -13.75,
"trendScore": 9.55271,
"trendSummary": "XRPs sharp rally and push through resistance are driving attention, with traders attributing part of the move to short covering and liquidations. Bulls see a breakout taking shape, while skeptics argue the advance is squeeze-driven and could fade without stronger catalysts.",
"sector": "Miscellaneous",
"industry": "InvestmentTrustsOrMutualFunds",
"marketCap": 98756.735248
}

💳 Pricing

This Actor uses pay-per-event pricing. A charge applies when one public message or trending symbol is saved to your dataset. The current rate is shown in the pricing panel.

🔌 Integrations

  • Run the Actor through the Apify API from Python or JavaScript.
  • Set an Apify schedule for repeat runs.
  • Export the dataset as JSON, CSV, or Excel.
  • Use Apify webhooks to send run events to another service.

❓ FAQ

Which mode should I choose?

Use symbol for current public messages for submitted tickers, user for current public posts from submitted usernames, trending for current market-wide trending messages, and trending-symbols for the ranked public trending-symbol list.

What happens when I leave a work limit empty?

The Actor returns all available messages or trending symbols until the relevant public source is exhausted.

What does matchedInput mean?

It is the first submitted symbol or username that found a saved message. If another submitted value finds the same message later, that later match is skipped. Trending messages have null because they are not tied to a submitted symbol or username.

What happens when Stocktwits leaves out a value?

The field can be null or empty. The Actor does not invent missing source facts.

Does source sentiment appear on every message?

No. sourceSentiment is present when the author added a Bullish or Bearish label. computedSentiment is a separate positive, neutral, or negative label based on the message text.

Can I collect posts from a Stocktwits user?

Yes. Choose user and enter public usernames without the @ sign.

Does this provide a full Stocktwits archive?

No. It collects current public data exposed by the chosen Stocktwits source. It does not promise a full historical archive.

Is the data a trading recommendation?

No. The Actor returns source data and text sentiment. It does not give trading advice or predict prices.

📝 Changelog

v1.1 (22-09-2026)

  • Collect trending messages and ranked trending symbols with richer market details.
  • Save richer message rows with author, media, conversation, price target, and sentiment data.
  • Leave source limits empty to collect all available results.
  • Normal runs no longer print package startup commands, while result and failure logs remain available.

v1.0

  • Added message rows, computed sentiment, author and market context, and ranked trending-symbol details.

v0.0

  • Initial release.

🆘 Support

For issues, questions, or feature requests, file a ticket and I'll fix or implement it in less than 24h 🫡

Made with ❤️ by Maxime Dupré