Stocktwits Scraper avatar

Stocktwits Scraper

Pricing

from $0.05 / 1,000 message/symbols

Go to Apify Store
Stocktwits Scraper

Stocktwits Scraper

Collect current public Stocktwits messages, user posts, trending messages, and ranked symbols. Get source sentiment plus author and market context in structured rows. No Stocktwits login or API key is needed.

Pricing

from $0.05 / 1,000 message/symbols

Rating

0.0

(0)

Developer

Maxime Dupré

Maxime Dupré

Maintained by Community

Actor stats

0

Bookmarked

47

Total users

21

Monthly active users

2 days 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, author and market context in structured dataset rows for market research and downstream analysis.

Message rows contain message text, publication time, source sentiment, 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 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, trending-streams, 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
modestringRequired. Choose symbol, user, trending, trending-streams, or trending-symbols. The form prefills symbol; the schema has no default for this field.
symbolsarray of stringsSupplies Stocktwits ticker symbols for symbol mode. The schema default and form prefill are AAPL, TSLA, NVDA, SPY, and MSTR. 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. The default is an empty list.
maxTrendingSymbolsinteger, optionalSets the number of ranked symbols for trending-symbols mode. Minimum 0. Leave it empty or set 0 to return all available results until the public trending source is exhausted.
maxMessagesPerTargetinteger, optionalSets how many matching messages to read per symbol or user, or from the trending feed. A message counts toward each input's limit even if another input already saved it. Each message is saved only once. Minimum 0. The form prefills 9, but there is no schema default. Leave it empty or set 0 to return all available messages until the public feed is exhausted.
sentimentstringFor all message modes, choose all, bullish, or bearish to filter by the author's label. The default is all.
onlyPriceTargetsbooleanFor all message modes, keeps only posts with a source-reported price target when true. The default is false.
newerThanMessageIdinteger, optionalFor all message modes, keeps messages with an ID greater than this Stocktwits message ID. Minimum 1. The named message is excluded. Leave it empty for no newer boundary.
olderThanMessageIdinteger, optionalFor all message modes, keeps messages with an ID less than this Stocktwits message ID. Minimum 1. The named message is excluded. Leave it empty for no older boundary.
includeAuthorReceivedLikesbooleanFor all message modes, adds the number of likes each message author got on their public posts when true. This is charged once per author in each run. The default is false, and both received-like fields are then null.
authorPostsForReceivedLikesintegerSets how many of each author's latest public posts to read when counting received likes. Used only when includeAuthorReceivedLikes is true. The default is 30. Set 0 to read all of the author's posts and get the full total, where available.

For both work limits, leaving the field empty or setting 0 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": 9,
"sentiment": "all",
"onlyPriceTargets": false,
"includeAuthorReceivedLikes": false,
"authorPostsForReceivedLikes": 30
}

🧾 Output

Output fields

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.
matchedInputstring or nullSymbol or username that first found the message.
bodystring or nullFull message text with HTML character codes decoded once. If Stocktwits sends a code that is encoded twice, such as &, the row keeps one layer, such as &.
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.
postingSourcestring or nullApp used to post the message, as reported by Stocktwits.
resharesinteger or nullNumber of message reshares reported by Stocktwits.
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.receivedLikesinteger or nullLikes received on the author's latest public posts, up to the authorPostsForReceivedLikes count. This may be a sample. Null when includeAuthorReceivedLikes is off or the count is unavailable.
author.receivedLikesTotalinteger or nullFull received-like total. Available only when all of the author's public posts were read and the unique post count matches Stocktwits. Otherwise null.
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.
priceTarget.startDatestring or nullStart date of the source-reported price prediction.
priceTarget.statusstring or nullPrediction status reported by Stocktwits, such as active or completed.
priceTarget.isHitboolean or nullWhether the target was hit, as reported by Stocktwits.
priceTarget.finalPricenumber or nullFinal price for the prediction, as reported by Stocktwits.
priceTarget.targetAccuracynumber or nullTarget accuracy value reported by Stocktwits. The Actor does not calculate it.

Genuine message row

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

{
"recordType": "message",
"messageId": 667979647,
"matchedInput": "TSLA",
"body": "$TSLA",
"createdAt": "2026-11-02T23:55:03Z",
"sourceSentiment": "Bearish",
"postingSource": "StockTwits for iOS",
"reshares": null,
"cashtags": [
{
"symbol": "TSLA",
"title": "Tesla Inc",
"exchange": "NASDAQ",
"watchlistCount": 1071863,
"currentPrice": 404.52
}
],
"mentions": [],
"author": {
"username": "Ermergerd",
"name": "Impeccablly Unique Insights",
"avatarUrl": "https://avatars.stocktwits.com/production/10621193/thumb-1761331197.png",
"official": false,
"followers": 34,
"ideas": 1165,
"following": 27,
"likes": 2854,
"watchlistCount": 32,
"joinedAt": "2025-10-24",
"receivedLikes": null,
"receivedLikesTotal": null
},
"media": [
{
"type": "gif",
"url": "https://media2.giphy.com/media/3o85xHi4t2UsuIY9QA/giphy.gif",
"width": 480,
"height": 271
}
],
"chartUrl": null,
"likes": 8,
"conversation": {
"parentMessageId": 667979647,
"inReplyToMessageId": null,
"replies": 1,
"isParent": true
},
"priceTarget": {
"price": 350,
"currency": "USD",
"date": "2026-11-06T16:00:00-05:00",
"startingPrice": 404.52,
"currentPrice": 404.05,
"startDate": "2026-11-02T18:55:03-05:00",
"status": "active",
"isHit": null,
"finalPrice": null,
"targetAccuracy": 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 of the company or asset in US dollars.

Genuine trending-symbol row

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

{
"recordType": "trendingSymbol",
"rank": 1,
"symbol": "PLTR",
"title": "Palantir Technologies Inc",
"exchange": "NASDAQ",
"region": "US",
"instrumentClass": "Stock",
"logoUrl": "https://logos.stocktwits-cdn.com/PLTR.png",
"watchlistCount": 325800,
"sentimentChange": -5.58,
"volumeChange": 128.96,
"trendScore": 13.9625,
"trendSummary": "Palantirs quarterly results beat expectations and lifted its outlook, with rapid U.S. commercial AI growth overtaking government revenue for the first time. The shares nevertheless fell, as traders debated whether strong growth was already priced in given the companys high valuation, while others viewed the selloff as a disconnect from the results.",
"sector": "TechnologyServices",
"industry": "PackagedSoftware",
"marketCap": 442427062459
}

💳 Pricing

This Actor uses pay-per-event pricing. A charge applies when one public message or trending symbol is saved to your dataset. When includeAuthorReceivedLikes is on, a second charge applies once per author in each run when that author's received-like count is added to a saved message. The current rates are 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

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 symbol or username that found a saved message. If another value finds the same message later, that later match is skipped. Trending messages have null because they are not tied to a 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. It is null when no label is present. The Actor does not score message text.

Can I collect posts from a Stocktwits user?

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

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, trending-streams for recent messages from trending tickers, and trending-symbols for the ranked public trending-symbol list.

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, including author-supplied sentiment labels. It does not give trading advice or predict prices.

📝 Changelog

v4.0 (02-11-2026)

  • Author received likes are now off by default, because each author's count costs extra reads and is now charged once per author. Runs that leave includeAuthorReceivedLikes unset now return null for author.receivedLikes and author.receivedLikesTotal. To keep these counts, set includeAuthorReceivedLikes to true. Use authorPostsForReceivedLikes to choose how many posts per author to count.
  • Message text now decodes each HTML character code only once, so text such as < stays as <.
  • Reliability improvements.

v3.0 (25-10-2026)

  • Removed computedSentiment and sentimentScore because the text labels and scores could be wrong. There is no replacement text score or label. Remove these keys from your code and analyze body separately if you need text sentiment. sourceSentiment still gives the author's Bullish or Bearish label when present.
  • Set includeAuthorReceivedLikes to false to skip author received-like counts and the extra author post reads. Both author.receivedLikes and author.receivedLikesTotal are then null.
  • Set maxMessagesPerTarget or maxTrendingSymbols to 0 to collect all available results, just as when the limit is empty.
  • Price targets now include priceTarget.status, priceTarget.isHit, priceTarget.finalPrice, and priceTarget.targetAccuracy when Stocktwits provides them. These values describe the source-reported prediction outcome.
  • Trending-symbol rows now try to include available sentiment-change and volume-change values for every ranked symbol. These fields stay null when the values are unavailable.
  • Reliability improvements.

v2.1 (20-10-2026)

  • Message rows now include likes received on a sample of each author's public posts. Use authorPostsForReceivedLikes to set the sample size. author.receivedLikesTotal stays null unless all public posts were read and their count matches Stocktwits.
  • Symbol searches with newerThanMessageId now continue to later available messages instead of stopping after the first message window.
  • Saved-message logs now name the symbol or username in matchedInput when one is present.
  • Message text now decodes HTML character codes.
  • Cashtag lists now include tags written back to back.
  • Mentioned usernames now omit the leading @.
  • GIF entries now include a media link when Stocktwits supplies a supported GIF ID.
  • Trending-symbol market caps now use US dollars for all instrument types. Unavailable sector and industry values reported as 0 now use null.

v2.0 (09-10-2026)

  • Removed messageUrl, which was a link built from the username and message ID rather than a link returned by Stocktwits. There is no replacement link field. Remove this key from code that reads message rows.
  • Collect recent messages from trending tickers with trending-streams.
  • Filter messages by trader sentiment, price targets, or message ID range.
  • Message rows now include a text sentiment score, posting app, and reshare count.
  • Text sentiment is always included. The includeComputedSentiment input was removed, so includeComputedSentiment: false no longer turns it off. Remove this input from saved run settings.
  • Price targets now include their source start date and use the source-reported prediction currency when available.
  • The paid result label now covers both messages and trending symbols.

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.
  • Reliability improvements.

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é