StockTwits Scraper avatar

StockTwits Scraper

Pricing

from $1.00 / 1,000 results

Go to Apify Store
StockTwits Scraper

StockTwits Scraper

Scrape StockTwits messages with likes and replies, 0-100 sentiment scores per symbol, daily sentiment history back to 2018, news per symbol, messages by topic or user, and 7 trending lists incl. crypto. Only-new mode for monitoring. No login or API key.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Sheshinmcfly

Sheshinmcfly

Maintained by Community

Actor stats

1

Bookmarked

4

Total users

1

Monthly active users

a day ago

Last modified

Features

Limited permissions

Share

💬 StockTwits Scraper

Trader sentiment from StockTwits as structured data: messages with likes, replies and charts, 0-100 sentiment scores per symbol, a daily sentiment history back to 2018, news per symbol, messages by topic or user, and every trending list, including crypto. No login, no account, no API key.

StockTwits is where retail traders say what they think about a stock or coin. This actor turns it into clean JSON or CSV. You can pull the latest posts for your tickers or follow specific traders. You can also get one row per symbol with the same sentiment, message-volume and participation scores StockTwits shows on its symbol pages, for now, the last 24 hours and every timeframe from 1 day to all-time. Or you can take the trending, most-bullish, most-active or top-gainer lists, with market data attached.

⚡ FastAbout 5 seconds for 30 posts and about 7-10 seconds for 300. Sentiment for 5 symbols takes about 5 seconds; a full history since 2018 about 15 seconds.
💬 9 data typesMessages by symbol, user, topic or liked by a user, popular messages, sentiment scores, sentiment history, news and trending lists.
📉 Sentiment historyOne row per day (or every 15 minutes for the last day) with sentiment, message volume and participation — back to 2018.
📰 NewsLatest news articles per symbol with source, link and the symbols they mention.
🔔 Only new messagesFor monitoring: each run returns only what was posted since your previous run.
❤️ EngagementLikes, replies, reshares, reply/reshare links, attached chart images and shared links on every post.
📈 Sentiment scores0-100 sentiment, message volume and participation, for now / 24h / 1D / 1W / 1M / 3M / 6M / 1Y / ALL, plus watcher growth (1d / 7d / 30d) and related symbols.
🔥 7 trending listsTrending, most bullish, most bearish, most active, most watched, top gainers and top losers, for all assets, crypto only or equities only.
📅 Date filterOnly posts since a date, or since "24 hours" or "7 days" ago.
🔓 No credentialsNothing to sign up for.

What data does it extract?

Messages (recordType: "message", from symbol, user, topic and liked-by-user streams and popular messages):

  • Post: id, body, createdAt, sentiment (Bullish / Bearish / null), priceAtPost, symbolsMentioned, url
  • Engagement: likesCount, repliesCount, resharesCount, isReply, parentMessageId, inReplyToMessageId, isReshare, resharedMessageId
  • Media and links: chartImageUrl, mediaUrls, links (title + URL), mentionedUsers, postedFrom
  • Author: authorUsername, authorName, authorFollowers, authorFollowing, authorIdeasCount, authorLikeCount, authorJoinDate, authorOfficial, authorAvatarUrl
  • Context: source (symbol / user / topic / liked / popular), querySymbol, queryUsername, queryTopic, scrapedAt

Sentiment scores (recordType: "sentiment", one row per symbol):

  • Now and 24h: sentimentScore (0-100), sentimentLabel, sentimentScore24h, sentimentLabel24h, sentimentChange24h, messageVolumeScore, messageVolumeLabel, messageVolume24h, messageVolumeChange24h
  • Timeframes: timeframes holds an entry for each of 1D, 1W, 1M, 3M, 6M, 1Y and ALL. Each entry has sentimentScore / sentimentLabel / sentimentChange, messageVolumeScore / messageVolume / messageVolumeLabel / messageVolumeChange and participationScore / participationLabel / participationChange.
  • Quote: price, priceChange, priceChangePercent, previousClose, open, high, low, volume, extendedHoursPrice, extendedHoursChangePercent, extendedHoursType, priceTime
  • Watchers: watchersCount, watchersChange1d / watchersChange1dPercent, watchersChange7d / watchersChange7dPercent, watchersChange30d / watchersChange30dPercent
  • Related symbols: relatedSymbols (same-industry symbols with name and watcher count)
  • Topics and identity: trendingTopics (label, description, message count), title, exchange, sector, industry, instrumentClass, isin, cusip, watchlistCount

The scores are the ones StockTwits shows on its symbol pages. Each one compares today's reading with that symbol's own history, from 0 (extremely bearish / extremely low) to 100 (extremely bullish / extremely high).

Sentiment history (recordType: "sentimentHistory", one row per point):

  • symbol, range, date
  • sentimentScore (0-100) and sentimentLabel, plus sentimentRaw (share of bullish messages) and sentimentRawLabel
  • messageVolume, messageVolumeScore (0-100), messageVolumeLabel
  • participationRatio, participationScore (0-100), participationLabel

Ranges: 1D (15-minute points), 1W, 1M, 3M, 6M, 1Y, 5Y and ALL (daily since 2018-01-01).

News (recordType: "news"): symbol, id, headline, summary, publishedAt, source, url, imageUrl, author, primarySymbol, symbolsMentioned.

Trending lists (recordType: "trending"):

  • list, trendingRank, symbol, title, instrumentClass, trendingScore, watchlistCount, trends (rank breakdown plus StockTwits' summary of why the symbol is trending)
  • Market data: marketCap (USD), peRatio, eps, beta, high52Week, low52Week, movingAverage50Day, avgDailyVolume1M, dividendRate, isin, cusip, sector, industry, exchange

Who uses this, and for what

  • Sentiment signals: track the 0-100 sentiment and message-volume score of a watchlist every hour, and flag sudden spikes in chatter before a move.
  • Earnings and news reactions: pull every post since the announcement with the date filter, the news that moved it, and the bullish/bearish split.
  • Backtesting sentiment: daily sentiment and message volume since 2018 for any symbol, ready to join with prices.
  • Monitoring: run every hour with Only new messages and receive just the new posts for your watchlist, topics or traders.
  • Crypto research: get the most-bullish, most-active or top-gainer crypto lists, or the posts for BTC.X, ETH.X and other coins.
  • Influencer tracking: follow specific traders' posts and see which of them get the most likes and replies.
  • Screening ideas: start from top gainers, most watched or most active, then dig into the sentiment of each name.
  • NLP and research datasets: get labelled (Bullish/Bearish) financial text with the price at the time of posting.

Quick start: copy an input and run

Latest posts for your tickers

{ "dataType": "messages", "symbols": ["AAPL", "TSLA", "BTC.X"], "maxResultsPerSymbol": 100 }

Only bullish posts from the last 24 hours

{ "dataType": "messages", "symbols": ["NVDA"], "maxResultsPerSymbol": 500, "sinceDate": "24 hours", "sentimentFilter": "Bullish" }

Sentiment scores for a watchlist

{ "dataType": "sentiment", "symbols": ["AAPL", "SPY", "BTC.X", "ETH.X"] }

Daily sentiment history for the last year

{ "dataType": "sentimentHistory", "symbols": ["TSLA", "BTC.X"], "historyRange": "1Y" }

Latest news for your tickers

{ "dataType": "news", "symbols": ["AAPL", "NVDA"], "maxResultsPerSymbol": 50 }

Only new posts since the previous run (for scheduled runs)

{ "dataType": "messages", "symbols": ["AAPL", "TSLA"], "maxResultsPerSymbol": 200, "onlyNew": true }

Posts about a topic

{ "dataType": "topicMessages", "topics": ["earnings", "options"], "maxResultsPerSymbol": 100 }

Posts from specific traders

{ "dataType": "userMessages", "usernames": ["howardlindzon"], "maxResultsPerSymbol": 60 }

Most-engaged posts for a symbol (or leave symbols empty for the whole platform)

{ "dataType": "popularMessages", "symbols": ["AAPL"], "maxResultsPerSymbol": 40 }

Most bullish crypto right now

{ "dataType": "trending", "trendingList": "most_bullish", "assetClass": "crypto", "maxTrendingResults": 50 }

How to use

  1. Pick a Data type.
  2. Add Symbols for messages, sentiment, sentiment history, news or per-symbol popular messages. Add Usernames for user messages or messages a user liked, and Topics for topic messages. Tickers, $TICKER, @user, #topic and StockTwits URLs all work. Crypto uses the .X suffix (BTC.X).
  3. Optionally limit results with Only messages since, Sentiment filter and Only new messages since the previous run, and cap them with Max results per symbol / user / topic. For sentiment history, choose the Sentiment history range.
  4. For trending, choose the Trending list, the Asset class and Max trending results.
  5. Run, then export as JSON, CSV, Excel or via API. The dataset has a ready-made table view for each data type.

Input parameters

FieldTitleDescription
dataTypeData typemessages, userMessages, popularMessages, sentiment, sentimentHistory, news, topicMessages, likedMessages or trending.
symbolsSymbolsStock or crypto tickers (AAPL, BTC.X). Required for messages, sentiment, sentiment history and news; optional for popular messages.
usernamesUsernamesStockTwits usernames for userMessages and likedMessages.
topicsTopicsTopics or hashtags for topicMessages (earnings, options).
maxResultsPerSymbolMax results per symbol / user / topicMessages (or news, up to 100) per symbol, user or topic (default 30).
sinceDateOnly messages sinceYYYY-MM-DD, an ISO date-time, or 24 hours / 7 days / 2 weeks. Also applies to news and sentiment history.
historyRangeSentiment history range1D, 1W, 1M (default), 3M, 6M, 1Y, 5Y or ALL.
onlyNewOnly new messages since the previous runReturns only messages newer than what your account received before for the same symbol, user or topic.
sentimentFilterSentiment filterBullish or Bearish only. Leave it empty for all posts.
trendingListTrending listtrending, most_bullish, most_bearish, most_active, top_watched, top_gainers or top_losers.
assetClassAsset classall, crypto or equities, for trending lists.
maxTrendingResultsMax trending resultsSymbols to return from the list (default 30).

Output example

Message

{
"recordType": "message",
"source": "symbol",
"id": 667505060,
"querySymbol": "SPY",
"body": "$SPY $QQQ $SLV.X $USO 27$ Brett tank loading.. as long as Bibi not in power.. wohoo! $APP",
"createdAt": "2026-10-28T02:36:06Z",
"sentiment": "Bullish",
"priceAtPost": 769.99,
"symbolsMentioned": ["SPY", "QQQ", "SLV.X", "USO", "APP"],
"likesCount": 2,
"repliesCount": 0,
"resharesCount": 0,
"isReply": false,
"isReshare": false,
"chartImageUrl": "https://media.stocktwits-cdn.com/api/3/media/15291186/original.png",
"links": [],
"postedFrom": "StockTwits Web",
"url": "https://stocktwits.com/MomentumWins/message/667505060",
"authorUsername": "MomentumWins",
"authorFollowers": 965,
"authorIdeasCount": 40484,
"authorJoinDate": "2015-01-26"
}

Sentiment scores (timeframes shortened)

{
"recordType": "sentiment",
"symbol": "AAPL",
"title": "Apple Inc",
"isin": "US0378331005",
"watchlistCount": 998778,
"sentimentScore": 25,
"sentimentLabel": "BEARISH",
"sentimentScore24h": 22,
"sentimentLabel24h": "EXTREMELY_BEARISH",
"sentimentChange24h": -12,
"messageVolumeLabel": "NORMAL",
"messageVolume24h": 49131,
"messageVolumeChange24h": 1.8868,
"timeframes": {
"1W": {
"sentimentScore": 21, "sentimentLabel": "EXTREMELY_BEARISH", "sentimentChange": -16,
"messageVolumeScore": 53, "messageVolume": 49080, "messageVolumeLabel": "NORMAL",
"participationScore": 19, "participationLabel": "EXTREMELY_LOW", "participationChange": 18.75
}
},
"price": 347.1,
"priceChangePercent": 0.928,
"previousClose": 343.91,
"extendedHoursType": "PostMarket",
"priceTime": "2026-10-27T20:00:00Z",
"trendingTopics": [
{ "label": "📱 CrackGate", "description": "Users are reporting widespread hardware failures and hinge-line cracking on the new foldable smartphone launch, sparking debates over durability.", "messageCount": 82 }
]
}

Sentiment history point

{
"recordType": "sentimentHistory",
"symbol": "AAPL",
"range": "1M",
"date": "2026-11-11T20:00:00Z",
"sentimentScore": 45,
"sentimentLabel": "NEUTRAL",
"sentimentRaw": 0.63,
"messageVolume": 40825,
"messageVolumeScore": 43,
"messageVolumeLabel": "LOW",
"participationRatio": 0.43,
"participationScore": 49,
"participationLabel": "NORMAL"
}

Trending list

{
"recordType": "trending",
"list": "trending",
"trendingRank": 2,
"symbol": "HOOD",
"title": "Robinhood Markets Inc",
"instrumentClass": "Stock",
"trendingScore": 12.3978,
"watchlistCount": 101836,
"marketCap": 85017216797,
"peRatio": 41.87,
"beta": 2.7306,
"high52Week": 150.47,
"low52Week": 63.515,
"sector": "Finance",
"url": "https://stocktwits.com/symbol/HOOD"
}

Performance & cost

JobTypical time
30 posts for 1 symbol~5 s
60 posts each for 3 symbols~7 s
300 posts for 1 symbol~7-10 s
Sentiment scores for 5 symbols~5 s
Sentiment history, 1 month for 2 symbols~6 s
Sentiment history since 2018 (3,200+ days)~15 s
News, 50 articles each for 3 symbols~5 s
A trending list (30 to 100 symbols)~5-7 s

Large watchlists stay fast. With a date filter or Only new messages you only wait for, and pay for, the posts you need.

Pricing

Pay per result: $0.001 per result. A result is one message, one symbol's sentiment row, one day (or 15-minute point) of sentiment history, one news article, or one symbol from a trending list. One year of daily sentiment history for a symbol is about 365 results ($0.37).

ResultsEstimated cost
100$0.10
1,000$1.00
10,000$10.00

Symbols and users that don't exist on StockTwits are skipped and not charged. The run's status message names them. The Apify Free plan includes $5 of free usage to get started.


FAQ

Do I need a StockTwits account or API key? No. Nothing to sign up for.

Does it work for crypto? Yes. Use the .X suffix (BTC.X, ETH.X, SOL.X) for messages and sentiment, and set Asset class to crypto for trending lists.

Why do most posts have sentiment: null? Tagging a post Bullish or Bearish is optional on StockTwits, and most people don't. Use Sentiment filter to keep only tagged posts, or the Sentiment scores data type for the aggregate reading.

What does a sentiment score of 25 mean? The score runs from 0 to 100 and compares the current reading with that symbol's own history. 25 means more bearish than usual for that symbol. The label (EXTREMELY_BEARISH … EXTREMELY_BULLISH) is the same reading in words.

How far back can I go? Symbol and user streams go back as far as you ask, page by page. Busy tickers produce thousands of posts a day, so pair a large limit with Only messages since. The sentiment history goes back to January 2018.

How does "Only new messages" work? Your account remembers the newest message it received for each symbol, user or topic. The next run with the option on returns only messages posted after it (and the status says when there was nothing new). The first run returns the latest messages as usual.

Why is a field null? Because StockTwits has no value for it: a coin has no P/E, an ETF has no ISIN on some lists, a new symbol may have no timeframe history yet. Nothing is invented to fill the gap.


Keywords

stocktwits scraper, stocktwits api, stock sentiment data, stock sentiment history, historical sentiment data, stocktwits news, trader sentiment api, social sentiment score, stocktwits sentiment, trending stocks scraper, most bullish stocks, top gainers list, crypto sentiment, retail trader chatter, social trading data, stock market sentiment, financial nlp dataset.

More actors

Browse all my scrapers on my Apify profile.

Disclaimer

This actor collects only publicly visible StockTwits data. It does not access private or authenticated content. Use the data responsibly, in line with StockTwits' terms and applicable law. You are responsible for how you use it. Nothing here is investment advice.

Changelog

VersionDateChanges
1.32026-11-11New data types: sentiment history (daily since 2018, or every 15 minutes for the last day), news per symbol, messages by topic and messages liked by a user. New "Only new messages since the previous run" option for monitoring. Sentiment rows now include watcher growth (1d / 7d / 30d) and related symbols. Faster runs (300 posts: ~17 s → ~7-10 s).
1.22026-11-05Clearer run summary: if StockTwits stops answering partway, the status message names every symbol or user that came back incomplete, and what was collected is still delivered. Same input, same fields.
1.12026-10-28New data types: messages by user, popular messages, sentiment scores (0-100, now/24h/1D-ALL, plus quote and trending topics) and 7 trending lists with crypto/equities filter and market data. Messages now include likes, replies, reshares, chart images and links. New "only messages since" filter. Message links now open the post correctly. Faster runs.
1.02026-07-14Initial release: messages with sentiment and trending symbols.
⌂ 换网址