Stocktwits Watchlist Sentiment Monitor avatar

Stocktwits Watchlist Sentiment Monitor

Pricing

from $1.50 / 1,000 watchlist results

Go to Apify Store
Stocktwits Watchlist Sentiment Monitor

Stocktwits Watchlist Sentiment Monitor

Monitor Stocktwits watchlists for bullish and bearish sentiment shifts, reversals, and message-volume spikes. Get compact, alert-ready signals for stocks and crypto.

Pricing

from $1.50 / 1,000 watchlist results

Rating

0.0

(0)

Developer

FetchFinch

FetchFinch

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Turn a Stocktwits watchlist into alert-ready sentiment signals instead of another raw message feed.

This Apify Actor keeps rolling state between scheduled runs, measures Stocktwits' user-tagged bullish/bearish sentiment, and emits records only when something material changes:

  • SENTIMENT_REVERSAL — sentiment crossed from meaningfully bullish to bearish, or vice versa.
  • SENTIMENT_SHIFT — sentiment moved by the configured number of points.
  • MENTION_SPIKE — rolling message volume exceeded its previous level by the configured multiplier.
  • BASELINE — the first successful snapshot for a symbol.
  • ERROR — a symbol failed while the rest of the watchlist continued.

The Actor is designed for Apify schedules, webhooks, Make, Zapier, Slack workflows, dashboards, and research pipelines.

Why this Actor is different

Most Stocktwits Actors export messages. This one maintains a bounded rolling observation window in a named key-value store, incrementally fetches new messages, and produces compact symbol-level events with evidence.

Sentiment is transparent and reproducible:

sentimentScore = 100 × (bullish tagged messages − bearish tagged messages)
/ all tagged messages

The score ranges from -100 (all bearish) to 100 (all bullish). Untagged messages count toward volume but not toward the sentiment score. minTaggedMessages prevents small samples from creating sentiment alerts.

Quick start

Use input such as:

{
"symbols": ["AAPL", "TSLA", "NVDA", "BTC.X"],
"monitorId": "growth-and-crypto",
"windowMinutes": 60,
"maxMessagesPerSymbol": 300,
"outputMode": "signalsOnly",
"thresholds": {
"sentimentShiftPoints": 20,
"reversalMinScore": 15,
"mentionSpikeMultiplier": 2,
"minMessagesForSpike": 10,
"minTaggedMessages": 5
}
}

The first run creates state and normally emits BASELINE. Schedule subsequent runs every 10–15 minutes using the same monitorId. A run with no material changes can intentionally have an empty dataset when outputMode is signalsOnly; its OUTPUT key-value record still contains the run summary.

Use a different monitorId for each independent task or watchlist. Reusing an ID intentionally reuses its rolling history.

Example signal

{
"eventType": "SENTIMENT_REVERSAL",
"eventTypes": ["SENTIMENT_REVERSAL", "MENTION_SPIKE"],
"symbol": "AAPL",
"observedAt": "2026-08-01T10:15:00.000Z",
"windowMinutes": 60,
"messageCount": 84,
"previousMessageCount": 39,
"messageCountDelta": 45,
"volumeRatio": 2.15,
"newMessages": 31,
"taggedCount": 28,
"bullishCount": 9,
"bearishCount": 19,
"bullishPercent": 32.14,
"sentimentScore": -35.71,
"previousSentimentScore": 27.27,
"sentimentChangePoints": -62.98,
"uniqueContributors": 66,
"collectionCapped": false,
"topMessages": [],
"sourceUrl": "https://stocktwits.com/symbol/AAPL",
"errorMessage": null
}

eventType contains the highest-priority event for simple filters. eventTypes preserves every threshold crossed in the same run.

Input guidance

  • symbols: Up to 50 stock or crypto symbols. Remove $; use Stocktwits' .X convention where applicable for crypto.
  • monitorId: Persistent-state namespace. Keep it stable across scheduled runs.
  • windowMinutes: Rolling aggregation window, from 5 minutes to 7 days.
  • maxMessagesPerSymbol: Fetch and state cap. Increase it when collectionCapped is true.
  • outputMode: signalsOnly for alerts or allSnapshots for time-series collection.
  • topMessages: Number of high-engagement public messages attached as evidence.
  • resetState: Starts a new baseline for the selected monitorId.
  • proxyConfiguration: Optional Apify Proxy settings.

Persistent state

State is stored in a named key-value store:

stocktwits-monitor-<monitorId>

Each symbol retains only normalized messages inside the current rolling window, bounded by maxMessagesPerSymbol. A failed symbol does not overwrite its last good state. When at least one symbol succeeds, successful state updates are committed for the next run.

Symbols removed from the watchlist are also removed from that monitor's state on the next partially or fully successful run.

Stocktwits access and proxies

The Actor uses Stocktwits' public web data endpoint and does not require a Stocktwits API key. That endpoint is undocumented for third-party automation and may change or apply Cloudflare protection without notice.

Direct requests are attempted unless proxy use is enabled. If output contains an HTTP 403/Cloudflare error, enable Apify Proxy. Residential proxy traffic is generally more reliable, but it costs more; begin with a small watchlist and conservative concurrency.

Local development

npm install
npm test
apify validate-schema
apify run --input-file INPUT.json

Local direct requests may be blocked even if cloud or residential-proxy runs work. Unit tests use deterministic fixtures and do not contact Stocktwits.

  1. Create an Apify Task with a unique monitorId.
  2. Run it once and inspect the baseline, tagged-message sample size, and collectionCapped flag.
  3. Tune thresholds for the watchlist's normal activity.
  4. Schedule it every 10–15 minutes.
  5. Connect successful-run output to an integration, or call the dataset API from your automation.

Responsible use

Stocktwits messages are public user-generated content. Sentiment labels are self-selected by authors, are not verified, and are not trading recommendations. Comply with Stocktwits' terms, applicable law, and your data-retention obligations. This Actor is not affiliated with Stocktwits and does not provide financial advice.