Threads Brand Monitor
Pricing
from $3.00 / 1,000 results
Threads Brand Monitor
Monitor Threads for brand mentions, competitor posts, keyword activity, and alerts with scheduled Apify runs.
Pricing
from $3.00 / 1,000 results
Rating
0.0
(0)
Developer
DigitalNomadPH
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 days ago
Last modified
Categories
Share
Track brand mentions, competitor posts, and keyword activity on Threads from scheduled Apify runs — without needing a Threads account or API access.
What does Threads Brand Monitor do?
Threads Brand Monitor fetches recent posts from Threads handles and keyword searches, normalises them into structured records, and emits per-group summaries and alerts. You configure one or more watchlists — each watchlist is a named group of handles and/or keywords — and the actor produces:
- Post records for every matched Threads post
- Profile records with follower counts, bios, and verification status for each monitored handle
- Summary records per watchlist group with volume, engagement, sentiment breakdown, and change vs. the previous run
- Alert records when thresholds are crossed (risk keyword hit, mention spike, high-engagement post)
- A run summary with totals and timing
Run it on a schedule (daily or hourly) to track how a brand, competitor, or campaign evolves on Threads over time.
Why use Threads Brand Monitor?
- No Threads account required — works with publicly accessible Threads pages
- Scheduled monitoring — pair with Apify's built-in scheduler for daily or hourly reports
- Delta mode — on repeat runs, only new posts since the last run are flagged
is_new_since_last_run: true, avoiding duplicates in downstream tools - Multi-group watchlists — track your brand, competitors, and campaign hashtags in a single run, each with its own summary
- Alerts included — get notified when a risk keyword appears, volume spikes, or a post goes viral
- Structured output — clean JSON records ready for Google Sheets, BigQuery, Zapier, or any webhook
How to use
- Open the actor on Apify Console and click Try for free
- Configure your watchlists — add at least one group with handles or keywords to monitor (see Input section below)
- Set your risk keywords — words that trigger alert records when found in post text (e.g.
outage,refund,bug) - Enable Delta Mode if you plan to run on a schedule — this flags only new posts on each run
- Click Start — the actor runs and saves results to the default dataset
- Export or connect — download as CSV/JSON from the Output tab, or connect via Apify's API or integrations
For scheduled monitoring:
- Go to Schedules → Create schedule → select this actor
- Run daily at 08:00 UTC for a morning brand briefing
- Enable Delta Mode so each run only surfaces new activity
Input
| Field | Type | Default | Description |
|---|---|---|---|
watchlists | array | — | Required. One or more named groups to monitor. Each group has a name, type, and lists of handles and/or keywords. |
maxPostsPerHandle | integer | 25 | Max posts to collect per handle per run. Threads embeds ~4–8 posts in the initial page load. |
maxPostsPerKeyword | integer | 50 | Max posts to collect per keyword search. |
includeReplies | boolean | false | Include reply posts from handle timelines. |
includeProfileStats | boolean | true | Emit a profile record per handle with follower count, bio, and verification status. |
deltaMode | boolean | false | Only flag posts newer than the last run as is_new_since_last_run: true. Recommended for scheduled runs. |
riskKeywords | array | ["outage","refund","bug",...] | Posts containing these words trigger negative_post alert records. |
minEngagement | integer | 0 | Skip posts with fewer total interactions (likes + replies + reposts). Applies to handle posts only; keyword results always pass through. |
alertThresholds | object | {mentionSpikeMultiplier: 3, minEngagementForAlert: 100} | Controls when mention_spike and new_high_engagement_post alerts fire. |
proxyConfiguration | object | Apify residential | Residential proxies are recommended for keyword search. Threads may block datacenter IPs on search routes. |
Example input
{"watchlists": [{"name": "Our Brand","type": "brand","keywords": ["our-product-name", "#ourhashtag"],"handles": ["our-threads-handle"]},{"name": "Competitors","type": "competitor","handles": ["competitor-a", "competitor-b"],"keywords": []},{"name": "Campaign — Launch Week","type": "campaign","keywords": ["#launchweek", "product launch"],"handles": []}],"maxPostsPerHandle": 25,"maxPostsPerKeyword": 50,"deltaMode": true,"riskKeywords": ["outage", "bug", "refund", "broken", "cancel", "scam"],"alertThresholds": {"mentionSpikeMultiplier": 3,"minEngagementForAlert": 500}}
Output
All records land in the actor's default dataset. Each record has a record_type field to distinguish them.
Record types
record_type | One row per | Key fields |
|---|---|---|
post | Each matched Threads post | text, author_handle, published_at, like_count, reply_count, repost_count, risk_flags, sentiment_direction, is_new_since_last_run |
profile | Each monitored handle | handle, display_name, follower_count, bio, verified_status |
summary | Each watchlist group | total_posts_seen, new_posts, top_post_url, risk_post_count, volume_change_vs_previous_run |
alert | Each threshold crossed | alert_type, severity, message, trigger_value, post_url |
run_summary | Entire run | total_posts_returned, new_posts_returned, alerts_generated, run_started_at, run_finished_at |
Sample post record
{"record_type": "post","group_name": "Our Brand","group_type": "brand","match_type": "keyword","query": "our-product-name","platform": "threads","post_id": "3906263078447871896","post_url": "https://www.threads.net/@someuser/post/3906263078447871896","author_handle": "someuser","author_name": "Some User","text": "Just tried our-product-name for the first time and it's great!","published_at": "2026-05-27T11:54:28.000Z","like_count": 42,"reply_count": 7,"repost_count": 3,"risk_flags": [],"sentiment_direction": "positive","is_new_since_last_run": true}
Sample summary record
{"record_type": "summary","group_name": "Our Brand","group_type": "brand","new_posts": 12,"total_posts_seen": 12,"unique_authors": 9,"total_likes": 847,"total_replies": 134,"top_post_url": "https://www.threads.net/@topuser/post/...","risk_post_count": 1,"positive_post_count": 7,"negative_post_count": 1,"neutral_post_count": 4,"volume_change_vs_previous_run": 4,"summary_generated_at": "2026-05-27T12:03:11.000Z"}
Sample alert record
{"record_type": "alert","alert_type": "negative_post","severity": "medium","group_name": "Our Brand","trigger_value": 1,"threshold": 1,"post_url": "https://www.threads.net/@user/post/...","message": "1 post(s) matched risk keywords for \"Our Brand\"","generated_at": "2026-05-27T12:03:11.000Z"}
Pricing and cost estimation
This actor is billed per dataset item. Results include post, profile, summary, alert, and run_summary records. The estimates below assume pay-per-result pricing around $1 per 1,000 dataset items and typical runs where most items are post records.
| Scenario | Approx. dataset items per run | Estimated cost |
|---|---|---|
| 1 brand + 2 competitors, 3 keywords, daily | ~50-170 items | ~$0.05-$0.17/run |
| 5 watchlist groups, 10 keywords, hourly | ~300-650 items | ~$0.30-$0.65/run |
| Large campaign with 20 keywords | ~500-1,050 items | ~$0.50-$1.05/run |
Residential proxy usage (recommended for keyword search) adds a small additional cost per run. Enable delta mode on scheduled runs to minimise volume — each run only surfaces new activity.
Tips
Recommended schedule for brand monitoring:
- Daily at 08:00 UTC — morning briefing cadence
- Enable
deltaMode: trueto avoid re-processing the same posts - Set
includeProfileStats: trueto track follower count changes over time
Keyword search quality:
- Threads keyword search returns posts by relevance, not recency — results vary between runs
- Common keywords return more spam; use specific brand names or product handles for cleaner signal
- Hashtags (e.g.
#yourhashtag) work as keywords
Proxy configuration:
- Residential proxies are pre-selected and recommended — Threads blocks datacenter IPs on search routes
- Handle-based monitoring works without proxies; keyword search benefits most from residential IPs
Connecting results to other tools:
- Use Apify's Google Sheets integration to append each run's posts to a tracking sheet
- Use the webhook trigger to POST alert records to Slack or a CRM when
severity: "high" - Filter the dataset by
record_type: "summary"for a quick daily briefing
FAQ
Does this require a Threads login? No. The actor accesses public Threads pages only. Private accounts and login-gated content are not accessible.
How many posts does it return per handle?
Threads embeds 4–8 posts in the initial page load per handle. Setting maxPostsPerHandle higher than this will not return more posts — the limit is what Threads serves in the public page, not a parameter we control.
Why are engagement metrics null for keyword search results? Keyword search uses Playwright to render the search results page. Engagement counts (likes, replies) are not reliably extractable from the rendered DOM without brittle class selectors. Handle-based posts include full engagement metrics from Threads' embedded JSON.
What languages does it support?
All languages. Threads is a global platform and search results include posts in any language. Sentiment detection uses English keyword matching only — non-English posts will return sentiment_direction: null.
Does delta mode work across platform runs? Yes. Delta state is stored in Apify Key-Value Store, which persists between runs of the same actor. Each handle and keyword feed has its own anchor (last seen post ID and timestamp).
What happens if a handle doesn't exist or is private? The actor logs a warning and skips that handle. Other handles and keywords in the same watchlist group continue processing normally.
Support
Found a bug or have a feature request? Use the Issues tab on the actor page, or contact via the Apify Console support chat.