StockTwits Ticker Sentiment & Trending Symbol Feed
Reads StockTwits' public message stream for any ticker or user, the market-wide trending-symbols list with trend summaries, and ticker search, including each post's self-tagged sentiment.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | What to fetch from StockTwits. |
symbols | array | optional | Tickers to fetch, e.g. AAPL, TSLA, BTC.X, BRK.B, SHOP.TSX. Accepts $cashtags and StockTwits symbol URLs. Use .X for crypto. |
usernames | array | optional | StockTwits usernames without @, or profile URLs, e.g. KirRoyalTrader, https://stocktwits.com/Fibonaccino. |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | What to fetch from StockTwits. |
symbols | array | optional | Tickers to fetch, e.g. AAPL, TSLA, BTC.X, BRK.B, SHOP.TSX. Accepts $cashtags and StockTwits symbol URLs. Use .X for crypto. |
usernames | array | optional | StockTwits usernames without @, or profile URLs, e.g. KirRoyalTrader, https://stocktwits.com/Fibonaccino. |
searchQueries | array | optional | Company names, tickers, or trader names to search for, e.g. tesla, apple, TraderLion. |
searchType | string | optional | What to return from each query. |
streamFilter | string | optional | All = newest first, Top = StockTwits ranking, Trending = curated high-engagement posts for the ticker (up to 100). |
contentFilter | string | optional | Keep only messages with this attachment. Videos are rare; All keeps every message. |
sentimentFilter | string | optional | Keep posts by the author's self-tagged sentiment. Most posts are untagged; Any keeps all. |
onlyPriceTargets | boolean | optional | Keep only messages where the author attached a StockTwits price prediction (price target). |
feedType | string | optional | Trending = market-wide trending posts; Suggested = posts from StockTwits' curated suggested traders; All = public market-wide firehose (deep, chronological). |
trendingAssetClass | string | optional | Which trending instruments to keep. All includes stocks, ETFs, crypto, ADRs, commodities, and other classes. |
sentimentRange | string | optional | Now = current sentiment across 15m, 24h, now, 1D–ALL. Other values return the daily/intraday history for that window. |
chartZoom | string | optional | Intraday windows use 5-minute (1D) or 30-minute (1W) bars; other windows use daily/weekly bars. |
includeUserProfile | boolean | optional | Add one profile record per username before that trader's posts. |
includeRelatedSymbols | boolean | optional | Add StockTwits' related-industry tickers to each symbol record. |
newerThanMessageId | integer | optional | Only keep messages with an ID greater than this. Useful for incremental scheduled runs. |
olderThanMessageId | integer | optional | Start from messages at or below this ID and page further back. |
messageIds | array | optional | Message IDs or StockTwits message URLs whose parent + reply thread should be fetched. |
maxItems | integer | optional | Per ticker/username/query/thread for target modes; total for trending and market feeds; max points or bars for history modes. |
Download the published input schema
View complete JSON
{
"description": "Scrape StockTwits messages, aggregate sentiment and its history, trending tickers, quotes, fundamentals, price bars, profiles, search, and reply threads.",
"properties": {
"chartZoom": {
"default": "1M",
"description": "Intraday windows use 5-minute (1D) or 30-minute (1W) bars; other windows use daily/weekly bars.",
"editor": "select",
"enum": [
"1D",
"1W",
"1M",
"3M",
"6M",
"YTD",
"1Y",
"5Y",
"ALL"
],
"enumTitles": [
"1 day",
"1 week",
"1 month",
"3 months",
"6 months",
"Year to date",
"1 year",
"5 years",
"All (2016+)"
],
"title": "Price history window (mode=priceHistory)",
"type": "string"
},
"contentFilter": {
"default": "all",
"description": "Keep only messages with this attachment. Videos are rare; All keeps every message.",
"editor": "select",
"enum": [
"all",
"links",
"charts",
"videos"
],
"enumTitles": [
"All messages",
"With links",
"With charts",
"With videos"
],
"prefill": "all",
"title": "Content filter (message modes)",
"type": "string"
},
"feedType": {
"default": "trending",
"description": "Trending = market-wide trending posts; Suggested = posts from StockTwits' curated suggested traders; All = public market-wide firehose (deep, chronological).",
"editor": "select",
"enum": [
"trending",
"suggested",
"all"
],
"enumTitles": [
"Trending posts",
"Suggested trader posts",
"All public posts (market-wide, v3)"
],
"title": "Market feed (mode=marketMessages)",
"type": "string"
},
"includeRelatedSymbols": {
"default": false,
"description": "Add StockTwits' related-industry tickers to each symbol record.",
"prefill": false,
"title": "Include related tickers (mode=symbolOverview)",
"type": "boolean"
},
"includeUserProfile": {
"default": false,
"description": "Add one profile record per username before that trader's posts.",
"prefill": false,
"title": "Include trader profile (mode=userMessages)",
"type": "boolean"
},
"maxItems": {
"default": 30,
"description": "Per ticker/username/query/thread for target modes; total for trending and market feeds; max points or bars for history modes.",
"maximum": 5000,
"minimum": 1,
"prefill": 3,
"title": "Max records",
"type": "integer"
},
"messageIds": {
"default": [],
"description": "Message IDs or StockTwits message URLs whose parent + reply thread should be fetched.",
"editor": "stringList",
"items": {
"type": "string"
},
"title": "Message IDs (mode=conversation)",
"type": "array"
},
"mode": {
"default": "symbolMessages",
"description": "What to fetch from StockTwits.",
"editor": "select",
"enum": [
"symbolMessages",
"userMessages",
"trendingSymbols",
"marketMessages",
"symbolSentiment",
"symbolOverview",
"priceHistory",
"search",
"conversation",
"trendingMessages",
"symbolSearch"
],
"enumTitles": [
"Ticker messages",
"Trader posts",
"Trending tickers",
"Market-wide posts",
"Ticker sentiment (now or history)",
"Ticker quote & fundamentals",
"Price history (OHLCV)",
"Search tickers & traders",
"Message thread & replies",
"Market-wide trending posts (legacy alias)",
"Search tickers (legacy alias)"
],
"prefill": "symbolMessages",
"title": "Mode",
"type": "string"
},
"newerThanMessageId": {
"description": "Only keep messages with an ID greater than this. Useful for incremental scheduled runs.",
"minimum": 0,
"title": "Newer than message ID (message modes)",
"type": "integer"
},
"olderThanMessageId": {
"description": "Start from messages at or below this ID and page further back.",
"minimum": 0,
"title": "Older than message ID (message modes)",
"type": "integer"
},
"onlyPriceTargets": {
"default": false,
"description": "Keep only messages where the author attached a StockTwits price prediction (price target).",
"prefill": false,
"title": "Only price predictions (message modes)",
"type": "boolean"
},
"searchQueries": {
"default": [],
"description": "Company names, tickers, or trader names to search for, e.g. tesla, apple, TraderLion.",
"editor": "stringList",
"items": {
"type": "string"
},
"title": "Search queries (mode=search)",
"type": "array"
},
"searchType": {
"default": "all",
"description": "What to return from each query.",
"editor": "select",
"enum": [
"all",
"symbols",
"users"
],
"enumTitles": [
"Everything (tickers + traders)",
"Tickers only",
"Traders only"
],
"title": "Search type (mode=search)",
"type": "string"
},
"sentimentFilter": {
"default": "any",
"description": "Keep posts by the author's self-tagged sentiment. Most posts are untagged; Any keeps all.",
"editor": "select",
"enum": [
"any",
"bullish",
"bearish",
"tagged"
],
"enumTitles": [
"Any (no filter)",
"Bullish only",
"Bearish only",
"Any tagged sentiment"
],
"prefill": "any",
"title": "Sentiment filter (message modes)",
"type": "string"
},
"sentimentRange": {
"default": "now",
"description": "Now = current sentiment across 15m, 24h, now, 1D–ALL. Other values return the daily/intraday history for that window.",
"editor": "select",
"enum": [
"now",
"1D",
"1W",
"1M",
"3M",
"6M",
"1Y",
"5Y",
"ALL"
],
"enumTitles": [
"Current snapshot (10 timeframes)",
"1 day history",
"1 week history",
"1 month history",
"3 month history",
"6 month history",
"1 year history",
"5 year history",
"All history (2018+)"
],
"title": "Sentiment range (mode=symbolSentiment)",
"type": "string"
},
"streamFilter": {
"default": "all",
"description": "All = newest first, Top = StockTwits ranking, Trending = curated high-engagement posts for the ticker (up to 100).",
"editor": "select",
"enum": [
"all",
"top",
"trending"
],
"enumTitles": [
"All (newest first)",
"Top (ranked stream)",
"Trending (curated top 100)"
],
"prefill": "all",
"title": "Message sort (mode=symbolMessages)",
"type": "string"
},
"symbols": {
"default": [
"AAPL"
],
"description": "Tickers to fetch, e.g. AAPL, TSLA, BTC.X, BRK.B, SHOP.TSX. Accepts $cashtags and StockTwits symbol URLs. Use .X for crypto.",
"editor": "stringList",
"items": {
"type": "string"
},
"prefill": [
"AAPL"
],
"title": "Tickers (mode=symbolMessages / symbolSentiment / symbolOverview / priceHistory)",
"type": "array"
},
"trendingAssetClass": {
"default": "all",
"description": "Which trending instruments to keep. All includes stocks, ETFs, crypto, ADRs, commodities, and other classes.",
"editor": "select",
"enum": [
"all",
"stocks",
"etf",
"crypto",
"adr",
"commodity"
],
"enumTitles": [
"All asset classes",
"Stocks",
"ETFs",
"Crypto",
"ADRs",
"Commodities"
],
"title": "Asset class (mode=trendingSymbols)",
"type": "string"
},
"usernames": {
"default": [],
"description": "StockTwits usernames without @, or profile URLs, e.g. KirRoyalTrader, https://stocktwits.com/Fibonaccino.",
"editor": "stringList",
"items": {
"type": "string"
},
"title": "Usernames (mode=userMessages)",
"type": "array"
}
},
"required": [
"mode"
],
"schemaVersion": 1,
"title": "StockTwits Scraper Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
records | string | optional | Dataset containing all scraped StockTwits records, keyed by recordType. |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "StockTwits messages, trader profiles, ticker sentiment snapshots and history, trending symbols with prices and fundamentals, quotes, OHLCV bars, search results, and reply threads.",
"properties": {
"records": {
"description": "Dataset containing all scraped StockTwits records, keyed by recordType.",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"title": "StockTwits records",
"type": "string"
}
},
"title": "StockTwits Ticker Sentiment & Trending Symbol Feed Output"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"views": {
"overview": {
"display": {
"component": "table",
"properties": {}
},
"title": "StockTwits records",
"transformation": {
"fields": [
"recordType",
"symbol",
"title",
"sentiment",
"sentimentScore",
"priceLast",
"pricePercentChange",
"body",
"username",
"rank",
"createdAt",
"stocktwitsUrl"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
StockTwits Ticker Sentiment & Trending Symbol Feed
StockTwits is where retail traders post real-time, self-tagged Bullish/Bearish takes on stocks, ETFs, and crypto. This actor reads that public data for any ticker or trader: message streams, aggregate sentiment snapshots, daily sentiment history back to 2018, the full trending-symbols list with prices and fundamentals, current quotes, OHLCV price bars, search results, and reply threads — all without a login or API key.
What this actor does
- Nine modes: ticker messages, trader posts, trending tickers, market-wide posts (trending / suggested / all), ticker sentiment, ticker overview, price history, search, and message threads.
- Multi-target inputs: up to 50 tickers or traders per run, with per-target record limits.
- Sentiment: per-message Bullish/Bearish tags plus StockTwits' own aggregate gauge and historical daily series.
- Trending depth: up to 573 trending instruments (not just the top 30), including price, fundamentals, and trend summaries where StockTwits provides them.
- Deep archive: v2 for recent filtered streams, automatic v3 continuation when the 12-month boundary is reached (AAPL back to 2009 in probes).
- Filters: newest/top/curated-trending sort, links/charts/videos, self-tagged sentiment, and message-ID bounds for incremental runs.
- No credentials, no browser, no proxy setup. Empty fields are omitted from each record.
Output per record type
Every row has a recordType and scrapedAt.
Message (recordType: "message")
messageId,body,createdAt,isDiscussion,sentiment— post identity and the author's optional Bullish/Bearish tagsymbol,symbols,cashtags— the ticker and every cashtag, with title, exchange, watchlist count, price, sentiment change, and volume changepriceAtPost,prices— price snapshot(s) attached to the postpriceTarget,priceTargetDate,priceTargetDateTime,priceTargetStartingPrice,priceTargetCurrentPrice,priceTargetPercentChange— StockTwits' source-reported price prediction, when the author attached onepriceTargetStatus,priceTargetSentiment,priceTargetType,priceTargetIsHit,priceTargetAccuracy— prediction status and outcome metadatapriceTargetFinalPrice,priceTargetFinalPriceChange,priceTargetFinalPriceChangePercent,priceTargetCreatedAt,priceTargetSymbol— final result and provenancelikeCount,reshareCount,replyCount— engagementisReply,isReshare,conversationParentMessageId,conversationInReplyToMessageId,isConversationParent,conversationRole— thread contextuserId,username,userDisplayName,userFollowers,userFollowing,userIdeas,userJoinDate,userOfficial,userIdentity,userClassification,userBadges,userHomeCountry,userLikeCount,userWatchlistCount,userTradeStatus— author detailsuserAvatarUrl,userAvatarUrlOriginal,stocktwitsUserUrlmediaUrls,media,chartUrl,links,mentionedUsersresharedMessageId,resharedBody,resharedUsername,resharedCreatedAtsource,sourceUrl,stocktwitsUrl
Symbol (recordType: "symbol")
symbol,symbolId,symbolDisplay,symbolMic,title,exchange,region,instrumentClass,logoUrl,watchlistCount,hasPricing,tradeStatus,liveEvent,aliases,cusip,isinsector,industry,rank,isTrending,trendingScore,trendSummary,trendSummaryAt,trendRanks,featurespriceLast,priceChange,pricePercentChange,priceOpen,priceHigh,priceLow,pricePreviousClose,priceVolume,priceCurrency,priceAsOf,extendedHoursPrice,extendedHoursChange,extendedHoursPercentChange,combinedPrice,combinedChange,combinedPercentChangemarketCap,peRatio,eps,dividendRate,beta,sharesOutstanding,floatShares,revenue,grossMargin,totalCash,totalDebt,totalAssets,totalLiabilities,bookValuePerShare,priceToBook,revenuePerEmployee,revenueToAssets,avgDailyVolume1M,avgDailyVolume3M,high52Week,low52Week,fiftyDayMovingAverage,institutionalOwnership,earningsGrowth,employees,businessDescription,fiscalPeriodEnd,fundamentalsUpdatedAt. Monetary fundamentals are in USD; share counts are share counts.relatedSymbols(when enabled),matchedQuery(search),stocktwitsUrl
Trader (recordType: "user")
userId, username, userDisplayName, userAvatarUrl, userAvatarUrlOriginal, userJoinDate, userOfficial, userIdentity, userClassification, userBadges, userHomeCountry, userFollowers, userFollowing, userIdeas, userWatchlistCount, userLikeCount, userTradeStatus, optional pinnedMessageId/pinnedMessageBody/pinnedMessageCreatedAt, stocktwitsUrl, and search-only premium, verified, companyRepresentative, matchedQuery.
Sentiment snapshot (recordType: "sentiment")
One row per ticker with a timeframes object keyed 15m, 24h, now, 1D, 1W, 1M, 3M, 6M, 1Y, and ALL. Each timeframe carries:
sentimentValue,sentimentLabel,sentimentScore,sentimentScoreLabel,sentimentChangemessageVolume,messageVolumeLabel,messageVolumeScore,messageVolumeScoreLabel,messageVolumeChangeparticipationRatio,participationLabel,participationScore,participationScoreLabel,participationChangewhere available
Sentiment history (recordType: "sentimentPoint")
One row per date/time: symbol, dateTime, sentimentValue, sentimentLabel, sentimentScore, sentimentScoreLabel, messageVolume, messageVolumeLabel, messageVolumeScore, messageVolumeScoreLabel, participationRatio, participationLabel, participationScore, participationScoreLabel.
Price bar (recordType: "priceBar")
symbol, date, startTime, endTime, dateTime, open, high, low, close, last, volume, trades, vwap, twap, utcOffset.
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode |
string (select) | symbolMessages |
symbolMessages, userMessages, trendingSymbols, marketMessages, symbolSentiment, symbolOverview, priceHistory, search, conversation. Legacy aliases trendingMessages and symbolSearch are still accepted. |
symbols |
array | ["AAPL"] |
Tickers for symbol modes. Accepts AAPL, $TSLA, BTC.X, BRK.B, SHOP.TSX, or symbol URLs. |
usernames |
array | – | Traders for userMessages, without @; profile URLs accepted. |
searchQueries |
array | – | Names or tickers for search. |
searchType |
string (select) | all |
all, symbols, or users. |
streamFilter |
string (select) | all |
all (newest), top (ranked), trending (curated top 100 per ticker). |
contentFilter |
string (select) | all |
all, links, charts, videos. |
sentimentFilter |
string (select) | any |
any, bullish, bearish, tagged. |
onlyPriceTargets |
boolean | false |
Keep only messages with a source-reported price prediction. |
feedType |
string (select) | trending |
trending, suggested, or all (public market-wide chronological stream). |
trendingAssetClass |
string (select) | all |
all, stocks, etf, crypto, adr, commodity. |
sentimentRange |
string (select) | now |
now, 1D, 1W, 1M, 3M, 6M, 1Y, 5Y, ALL. |
chartZoom |
string (select) | 1M |
1D, 1W, 1M, 3M, 6M, YTD, 1Y, 5Y, ALL. |
includeUserProfile |
boolean | false |
Add a trader profile record in userMessages. |
includeRelatedSymbols |
boolean | false |
Add related tickers in symbolOverview. |
newerThanMessageId |
integer | – | Keep messages newer than this StockTwits message ID. |
olderThanMessageId |
integer | – | Start at or below this message ID and page further back. |
messageIds |
array | – | Message IDs or URLs for conversation. |
maxItems |
integer | 30 |
Per ticker/trader/query/thread for target modes; total for feeds; max points/bars for history modes. 1–5000. |
Example: latest tagged sentiment on several tickers
{
"mode": "symbolMessages",
"symbols": ["AAPL", "TSLA", "NVDA"],
"streamFilter": "all",
"sentimentFilter": "tagged",
"maxItems": 50
}
Example: daily sentiment history for a watchlist
{
"mode": "symbolSentiment",
"symbols": ["AAPL", "MSFT", "SPY", "BTC.X"],
"sentimentRange": "ALL",
"maxItems": 500
}
Example: trending crypto with prices and fundamentals
{
"mode": "trendingSymbols",
"trendingAssetClass": "crypto",
"maxItems": 74
}
Example: quote, fundamentals, and related tickers
{
"mode": "symbolOverview",
"symbols": ["NVDA", "AMD", "ASML"],
"includeRelatedSymbols": true,
"maxItems": 3
}
Example: a trader's posts plus their profile
{
"mode": "userMessages",
"usernames": ["KirRoyalTrader"],
"includeUserProfile": true,
"maxItems": 100
}
Example: a message thread
{
"mode": "conversation",
"messageIds": ["https://stocktwits.com/TalkMarkets/message/666869978"],
"maxItems": 30
}
Use cases
- Sentiment research — compare self-tagged Bullish/Bearish posts with StockTwits' aggregate gauge and daily history.
- Trading dashboards — feed message volume, participation, sentiment scores, and trending ranks into a live dashboard.
- Scheduled monitoring — use
newerThanMessageIdto collect only posts published since the last run. - Trend discovery — scan the full trending list, filter to stocks, ETFs, or crypto, and read StockTwits' why-it-is-trending summaries.
- Trader research — export a public trader's post history, profile stats, and replies for influence analysis.
- Quant datasets — join ticker messages, quotes, fundamentals, and OHLCV bars in one run for model training or backtesting.
FAQ
Does this need a StockTwits login or API key? No. It reads the same public JSON endpoints the StockTwits website uses when you browse logged out. No cookies, API key, or proxy setup is required.
How far back do messages go?
Recent filtered streams use StockTwits' 12-month v2 window. When that walk reaches the boundary, the actor continues through StockTwits' v3 stream API: probes reached 2009 for AAPL and 2022 across 38/38 diverse tickers, with user archives varying by account. streamFilter=top stays on the recent ranked window; the archive continuation is chronological. Older v3 rows can omit fields the current source no longer serializes (for example links or reply context). Sentiment history goes back to 2018, and price bars go back to 2016 where the ticker has data.
Why is sentiment missing from many messages?
Tagging a post Bullish or Bearish is optional. Untagged posts simply omit the field. Use sentimentFilter=tagged, or use the symbolSentiment mode for StockTwits' aggregate gauge, which is not limited to tagged posts.
What do sentimentScore and sentimentScoreLabel mean?
They are StockTwits' normalized 0–100 score and label (for example "Extremely Bearish"). sentimentValue is the underlying raw value, which can be negative. The normalized pair is what the StockTwits website displays. Snapshot mode returns one row per ticker with a timeframes object containing all ten timeframes; history mode returns one row per date/time.
Why are some trending tickers missing prices or fundamentals? StockTwits publishes richer data for equities than for some ETFs and crypto. AI trend summaries are generated by StockTwits only for the top of the trending list, not for every symbol. Fields the source does not provide are omitted rather than filled with placeholder values.
Does every ticker have price history?
Most US, Canadian, ETF, and crypto symbols do. A few valid message-stream symbols — often very thinly traded or foreign listings such as some .TSX names — have no chart data; the actor skips them and continues, while symbolOverview can still return their quote.
Can I get more than 30 trending tickers?
Yes. The trending mode walks StockTwits' enhanced list, which currently returns up to about 573 instruments (about 74 for crypto). marketMessages with feedType=all reads the public market-wide stream instead. Search is separate and capped by StockTwits at 12 symbol or 15 user results per query.
Can I collect messages for a specific trader and ticker together?
StockTwits' combined user+ticker endpoint requires authentication, so it is not used. You can fetch a trader's posts and filter the cashtags/symbols fields client-side.
Why do links to stocktwits.com sometimes fail in scripts? StockTwits protects its website pages with a browser challenge. The links are valid and open normally in a browser; this affects page navigation, not the actor's data.
Does the actor invent price targets or text sentiment?
No. It returns StockTwits' own source-reported price predictions when an author attached one (priceTarget* fields) and never generates targets or model-based text sentiment. Empty fields are omitted rather than returned as null.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build e7mFmdFkY1PvZoBtw. Documentation is regenerated from the default published build; private drafts are not included.