Back to Blog
Tutorial

How to Monitor Brand Mentions on Threads Automatically

April 2, 2026
8 min read
S
By SociaVault Team
ThreadsBrand MonitoringSocial ListeningAutomationAPI

How to Monitor Brand Mentions on Threads Automatically

People are talking about your brand on Threads. You just don't know about it.

Unlike Twitter/X, Threads doesn't have a notifications feature for brand keywords. There's no "mention alerts" toggle. No built-in search monitoring. If someone posts "SociaVault is incredible" or "SociaVault sucks" — you won't see it unless you manually search every day.

For small brands, that's annoying. For brands with reputation management needs, it's a liability. And for social media managers tracking multiple brands, it's impossible to do manually.

This guide shows you how to build automated brand monitoring for Threads — search for mentions, analyze sentiment, track mention volume over time, and get alerted when someone talks about your brand.


What You Can Monitor

Threads search gives you access to:

Search TypeWhat You GetUse Case
Brand name searchPosts mentioning your brandReputation monitoring
Product name searchPosts about specific productsProduct feedback
Competitor searchPosts mentioning competitorsCompetitive intelligence
Industry keyword searchPosts about your spaceTrend awareness
User searchFind accounts talking about youInfluencer discovery

Both post search and user search are available, giving you full coverage.


Start by pulling all recent mentions of your brand:

const axios = require('axios');

const API_KEY = process.env.SOCIAVAULT_API_KEY;
const BASE_URL = 'https://api.sociavault.com';

async function searchBrandMentions(brandName) {
  const response = await axios.get(`${BASE_URL}/v1/scrape/threads/search`, {
    params: { query: brandName },
    headers: { 'X-API-Key': API_KEY }
  });

  const posts = response.data.data?.posts || [];

  console.log(`\n=== BRAND MENTIONS: "${brandName}" ===`);
  console.log(`Found ${posts.length} mentions\n`);

  posts.forEach((post, i) => {
    const text = post.caption?.text || '[no text]';
    const likes = post.like_count || 0;
    const replies = post.text_post_app_info?.direct_reply_count || 0;
    const reposts = post.text_post_app_info?.reshare_count || 0;
    const author = post.user?.username || 'unknown';

    console.log(`${i + 1}. @${author} (${likes} likes, ${replies} replies, ${reposts} reposts)`);
    console.log(`   "${text.substring(0, 150)}${text.length > 150 ? '...' : ''}"`);
    console.log('');
  });

  return posts;
}

await searchBrandMentions('SociaVault');

Cost: 1 credit per search.


Sentiment Analysis on Mentions

Knowing someone mentioned your brand isn't enough — you need to know if they're happy or angry:

import requests
import os
import re

API_KEY = os.getenv('SOCIAVAULT_API_KEY')
BASE_URL = 'https://api.sociavault.com'
headers = {'X-API-Key': API_KEY}

def analyze_mention_sentiment(brand_name):
    """Search for brand mentions and analyze sentiment"""
    response = requests.get(
        f'{BASE_URL}/v1/scrape/threads/search',
        params={'query': brand_name},
        headers=headers
    )
    posts = response.json().get('data', {}).get('posts', [])

    positive_words = [
        'love', 'amazing', 'great', 'best', 'awesome', 'excellent', 'perfect',
        'recommend', 'incredible', 'fantastic', 'beautiful', 'helpful', 'worth',
        'impressed', 'game changer', 'lifesaver', 'obsessed', 'chef\'s kiss'
    ]
    negative_words = [
        'hate', 'terrible', 'worst', 'awful', 'bad', 'broken', 'scam', 'trash',
        'waste', 'disappointed', 'sucks', 'overpriced', 'buggy', 'frustrating',
        'annoying', 'useless', 'avoid', 'ripoff', 'rip off'
    ]

    results = {'positive': [], 'negative': [], 'neutral': []}

    for post in posts:
        text = (post.get('caption', {}).get('text', '') or '').lower()
        author = post.get('user', {}).get('username', 'unknown')
        likes = post.get('like_count', 0)

        pos_count = sum(1 for w in positive_words if w in text)
        neg_count = sum(1 for w in negative_words if w in text)

        entry = {
            'author': author,
            'text': text[:150],
            'likes': likes,
            'replies': post.get('text_post_app_info', {}).get('direct_reply_count', 0)
        }

        if pos_count > neg_count:
            results['positive'].append(entry)
        elif neg_count > pos_count:
            results['negative'].append(entry)
        else:
            results['neutral'].append(entry)

    total = len(posts)
    print(f'\n=== SENTIMENT REPORT: "{brand_name}" ({total} mentions) ===\n')
    print(f'Positive: {len(results["positive"])} ({len(results["positive"])/max(total,1)*100:.0f}%)')
    print(f'Negative: {len(results["negative"])} ({len(results["negative"])/max(total,1)*100:.0f}%)')
    print(f'Neutral:  {len(results["neutral"])} ({len(results["neutral"])/max(total,1)*100:.0f}%)')

    if results['negative']:
        print('\n⚠️  NEGATIVE MENTIONS (respond to these):')
        for m in results['negative']:
            print(f'  @{m["author"]} ({m["likes"]} likes): "{m["text"]}..."')

    if results['positive']:
        print('\n✅ POSITIVE MENTIONS (amplify/thank these):')
        for m in results['positive'][:5]:
            print(f'  @{m["author"]} ({m["likes"]} likes): "{m["text"]}..."')

    return results

analyze_mention_sentiment('Nike')

The keyword-based approach isn't as accurate as proper NLP, but it catches 80% of clearly positive or negative mentions. If you need higher accuracy, pipe the text through an LLM for classification.


Monitor Multiple Brands + Competitors

Track your brand alongside competitors in one sweep:

async function competitiveMonitoring(brands) {
  const report = {};

  for (const brand of brands) {
    const response = await axios.get(`${BASE_URL}/v1/scrape/threads/search`, {
      params: { query: brand },
      headers: { 'X-API-Key': API_KEY }
    });

    const posts = response.data.data?.posts || [];

    // Calculate mention metrics
    const totalLikes = posts.reduce((s, p) => s + (p.like_count || 0), 0);
    const totalReplies = posts.reduce((s, p) =>
      s + (p.text_post_app_info?.direct_reply_count || 0), 0
    );
    const avgEngagement = posts.length > 0
      ? Math.round(totalLikes / posts.length)
      : 0;

    // Find most-engaged mention
    const topMention = posts.sort((a, b) =>
      (b.like_count || 0) - (a.like_count || 0)
    )[0];

    report[brand] = {
      mentionCount: posts.length,
      totalLikes,
      totalReplies,
      avgEngagement,
      topMention: topMention ? {
        author: topMention.user?.username,
        text: topMention.caption?.text?.substring(0, 100),
        likes: topMention.like_count
      } : null
    };
  }

  console.log('\n=== COMPETITIVE MENTION REPORT ===\n');
  Object.entries(report).forEach(([brand, data]) => {
    console.log(`"${brand}": ${data.mentionCount} mentions | ${data.totalLikes} total likes | avg ${data.avgEngagement} likes/mention`);
    if (data.topMention) {
      console.log(`  Top: @${data.topMention.author} (${data.topMention.likes} likes) "${data.topMention.text}..."`);
    }
  });

  return report;
}

// Monitor your brand vs competitors
await competitiveMonitoring(['Nike', 'Adidas', 'New Balance', 'Puma']);

Find Influential Users Discussing Your Brand

Sometimes the most important insight isn't what's being said, but who's saying it. Use user search to find accounts related to your brand:

def find_brand_advocates(brand_name):
    """Find users who discuss or relate to your brand"""
    response = requests.get(
        f'{BASE_URL}/v1/scrape/threads/search-users',
        params={'query': brand_name},
        headers=headers
    )
    users = response.json().get('data', {}).get('users', [])

    print(f'\n=== USERS RELATED TO "{brand_name}" ===\n')

    for user in users:
        username = user.get('username', 'unknown')
        full_name = user.get('full_name', '')
        followers = user.get('follower_count', 0)
        verified = user.get('is_verified', False)
        bio = user.get('biography', '')

        badge = '✓' if verified else ' '
        print(f'{badge} @{username}{full_name}')
        print(f'  {followers:,} followers')
        if bio:
            print(f'  Bio: {bio[:100]}')
        print('')

    return users

find_brand_advocates('Notion')

This surfaces brand accounts, fan accounts, reviewers, and influencers who talk about the brand — all potential outreach targets.


Automated Daily Monitoring Script

Put it all together into a daily monitoring pipeline:

const fs = require('fs');

async function dailyBrandMonitor(config) {
  const { brands, competitors, keywords, outputFile } = config;
  const timestamp = new Date().toISOString();
  const report = { timestamp, brands: {}, competitors: {}, keywords: {} };

  // Monitor own brands
  for (const brand of brands) {
    const response = await axios.get(`${BASE_URL}/v1/scrape/threads/search`, {
      params: { query: brand },
      headers: { 'X-API-Key': API_KEY }
    });
    const posts = response.data.data?.posts || [];

    report.brands[brand] = {
      mentions: posts.length,
      totalEngagement: posts.reduce((s, p) =>
        s + (p.like_count || 0) + (p.text_post_app_info?.direct_reply_count || 0), 0
      ),
      posts: posts.slice(0, 5).map(p => ({
        author: p.user?.username,
        text: p.caption?.text?.substring(0, 200),
        likes: p.like_count || 0
      }))
    };
  }

  // Monitor competitors
  for (const comp of competitors) {
    const response = await axios.get(`${BASE_URL}/v1/scrape/threads/search`, {
      params: { query: comp },
      headers: { 'X-API-Key': API_KEY }
    });
    const posts = response.data.data?.posts || [];
    report.competitors[comp] = { mentions: posts.length };
  }

  // Monitor industry keywords
  for (const kw of keywords) {
    const response = await axios.get(`${BASE_URL}/v1/scrape/threads/search`, {
      params: { query: kw },
      headers: { 'X-API-Key': API_KEY }
    });
    const posts = response.data.data?.posts || [];
    report.keywords[kw] = { mentions: posts.length };
  }

  // Append to log
  let history = [];
  if (fs.existsSync(outputFile)) {
    history = JSON.parse(fs.readFileSync(outputFile, 'utf-8'));
  }
  history.push(report);
  fs.writeFileSync(outputFile, JSON.stringify(history, null, 2));

  // Print summary
  console.log(`\n📊 Daily Brand Monitor — ${timestamp.split('T')[0]}\n`);
  Object.entries(report.brands).forEach(([brand, data]) => {
    console.log(`${brand}: ${data.mentions} mentions, ${data.totalEngagement} total engagement`);
  });
  console.log('\nCompetitor mention counts:');
  Object.entries(report.competitors).forEach(([comp, data]) => {
    console.log(`  ${comp}: ${data.mentions}`);
  });

  return report;
}

// Run daily
await dailyBrandMonitor({
  brands: ['YourBrand'],
  competitors: ['Competitor1', 'Competitor2', 'Competitor3'],
  keywords: ['social media analytics', 'influencer marketing'],
  outputFile: 'threads-brand-monitor.json'
});

Schedule this with a cron job or a workflow automation tool like Make.com. After a week of data, you'll see trends in mention volume and can spot PR crises or viral moments early.


What to Do With Brand Mention Data

ScenarioAction
Positive mention from large accountThank publicly, ask to reshare
Negative mention with valid complaintRespond with fix/solution within 2 hours
Competitor criticism threadMonitor — don't pile on, but note the pain points
Question about your productAnswer directly — it's free customer support
Influencer praising your product organicallyDM to explore partnership
Trending industry keywordCreate content responding to the trend

The speed of response matters more than the response itself. Accounts that respond to mentions within 1 hour get 3x more positive sentiment in follow-up posts.


Get Started

Sign up free — start monitoring brand mentions on Threads today.

Full Threads API docs: docs.sociavault.com/api-reference/threads


Found this helpful?

Share it with others who might benefit

Ready to Try SociaVault?

Start extracting social media data with our powerful API. No credit card required.