Skip to main content
← Back to blog
by Data Team
guidebot-detectionanalytics

How to Detect Fake Followers & Bot Accounts on Twitter/X

The Fake Follower Problem

Fake followers are everywhere on Twitter/X. By some estimates, 5-15% of all Twitter accounts are bots or inactive shells, and certain niches — crypto, forex, dropshipping — are far worse. Some influencer accounts are running with 40-60% fake followers.

Why should you care?

Influencer fraud — Brands pay thousands for "sponsored tweets" to audiences that don't exist. A crypto project paying a KOL with 500K followers might be reaching 50K real people
Inflated social proof — Projects buy followers to appear legitimate. A token with 100K Twitter followers looks safer than one with 2K — but if 95K of those are bots, the project's actual community is tiny
Market manipulation — Coordinated bot networks amplify narratives to pump tokens. If 500 accounts are all tweeting about the same microcap at the same time, that's not organic interest
Due diligence failures — VCs, launchpads, and researchers who rely on social metrics without verifying them make bad investment decisions

The good news: fake followers leave patterns. Once you know what to look for, they're surprisingly easy to spot.

---

Manual Red Flags

Before you touch any tools or APIs, you can catch most fake accounts with a 10-second visual check. Here's what to look for:

Profile Indicators

Default avatar — The generic silhouette or egg avatar. Real users almost always upload a profile picture
No bio — Or a bio that's generic ("crypto enthusiast | trader | investor") with no specific details
Random username pattern — Strings like @john38492847 or @CryptoKing_29384. Real humans pick memorable usernames
No banner image — Combined with the above signals, this strongly suggests a throwaway account
Location mismatch — Bio says "San Francisco" but tweets are all in a language that doesn't match, or the account tweets at 3 AM Pacific time consistently

Content Indicators

Zero original tweets — Account only retweets. No original thoughts, no replies, no engagement
Identical tweets — The exact same message posted across multiple accounts (copy-paste bot networks)
Only tweets at projects — Every tweet is "Great project! To the moon!" on different crypto accounts. Real people have varied interests
No media — Never posted a photo, screenshot, or chart. Real crypto users share charts constantly

Engagement Indicators

Followers but no engagement — An account with 50K followers getting 2 likes per tweet is suspicious. Even accounts with small followings get more engagement than that if the followers are real
Only followed by other suspicious accounts — Click on a few followers. If they all look fake, the account is fake

---

Follower-to-Following Ratio Analysis

The ratio between followers and following reveals a lot:

Ratio PatternWhat It Suggests
High followers, low following (e.g., 100K / 500)Legitimate influential account OR bought followers
Roughly equal (e.g., 5K / 4.8K)Normal organic growth through mutual follows
Low followers, very high following (e.g., 200 / 5K)Follow-for-follow bot or new account mass-following
Very high both (e.g., 80K / 79K)Almost certainly a follow-for-follow scheme

The key insight: a high follower count with suspiciously low engagement is the strongest signal. Real followers engage. Fake ones don't.

A legitimate account with 100K followers should see at least 100-300 likes on a typical tweet. If they're consistently getting under 20, something is off.

---

Account Age vs. Follower Count

This is one of the most reliable heuristics. Growing a real audience takes time.

Normal growth benchmarks (approximate):

1 month old: 50-500 followers
6 months old: 500-5K followers (if active and producing good content)
1 year old: 2K-20K followers
2+ years: varies widely based on niche and content quality

Red flags:

Account created 3 months ago with 80K followers — almost certainly purchased
Account created in 2022 but has only 12 tweets and 45K followers — bought an aged account and added fake followers
Sudden follower spikes visible in growth charts — organic growth is gradual, not step-function

How to Check

Look at the account creation date (visible on their profile). Then check their earliest tweets. If an account was "created in 2020" but their oldest tweet is from last month, they either deleted everything (possible) or bought the account (more likely).

---

Engagement Rate Analysis

Engagement rate is the single most useful metric for detecting fake followers. Here's the formula:

Engagement Rate = (Avg Likes + Avg Replies + Avg Retweets) / Followers × 100

Benchmark Ranges

Engagement RateAssessment
3-6%Excellent — highly engaged, authentic audience
1-3%Normal — healthy account with real followers
0.5-1%Below average — possible mix of real and fake
0.1-0.5%Suspicious — likely has significant fake followers
< 0.1%Almost certainly inflated — vast majority fake
> 15%Also suspicious — might be using engagement pods or bots

Important caveat: Very large accounts (1M+ followers) naturally have lower engagement rates because their content reaches a smaller percentage of their audience. An account with 5M followers and 0.3% engagement isn't necessarily fake — the algorithm just doesn't show their tweets to all 5M people.

Focus this analysis on accounts in the 10K-500K follower range where the signal is clearest.

---

Bot Behavior Patterns

Bots operate differently from humans in predictable ways.

Posting Frequency

Humanly impossible volume — 200+ tweets per day, every day, with no breaks. Even the most active humans max out around 50-80 tweets daily
Perfect intervals — Tweeting exactly every 15 minutes, 24/7. Humans are irregular. Bots are not
No sleep pattern — Real humans have quiet hours. If an account tweets uniformly across all 24 hours with no downtime, it's automated

Time Pattern Analysis

Plot tweet timestamps across a week. Humans show clear patterns:

Active during waking hours in their timezone
Quiet overnight
Slightly different patterns on weekends

Bots show:

Uniform distribution across all hours
Or rigid patterns (exactly on the hour, every hour)
No weekend variation

Content Patterns

Template-based replies — "Great insight! 🔥" or "This is the way 🚀" posted identically across many conversations
Keyword-triggered responses — Bot replies to any tweet containing certain keywords, regardless of context
No conversational depth — Real humans go back and forth in conversations. Bots drop one reply and move on

---

The Follower Audit Method

This is the most reliable manual method. It takes 10-15 minutes but gives you a definitive answer.

Step-by-Step

1. Open the target account's followers list
2. Sample 50 followers at random — scroll down and pick accounts spread across the list, don't just look at the first 50
3. For each follower, quickly check:

- Does it have a real profile picture?

- Does it have a bio with specific details?

- Has it tweeted in the last 30 days?

- Does it have a reasonable follower/following ratio?

- Does it show varied interests (not just crypto spam)?

1. Score each as "real," "suspicious," or "fake"
2. Calculate your ratio

Interpreting Results

Fake/Suspicious %Assessment
0-10%Clean — normal amount of inactive/bot accounts
10-25%Mild inflation — some bought followers or natural bot follows
25-50%Significant inflation — this account has purchased followers
50%+Majority fake — do not trust this account's metrics

Pro Tips

Check followers from the middle of the list, not the top. Recently added followers (shown first) might be the real ones, while purchased followers are often added in batches further down
Look for clusters — if 20 consecutive followers all have similar usernames, creation dates, and no activity, that's a purchased batch
Recheck periodically — Some accounts buy followers in waves. A clean audit today doesn't guarantee next month

---

API-Based Detection

Manual checks don't scale. If you need to audit hundreds of accounts, you need programmatic analysis.

Key Data Points to Pull

For each account you want to evaluate:

created_at — Account creation date
followers_count — Total followers
following_count — Total following
tweet_count — Total tweets posted
verified — Blue checkmark status
Recent tweets with engagement metrics (likes, replies, retweets)

Python: Basic Bot Scoring

Here's a practical scoring function that evaluates an account based on multiple signals:

PYTHON
import requests
import os
from datetime import datetime

API_KEY = os.environ["XCROP_API_KEY"]
BASE_URL = "https://xcrop.io/api/v2"
HEADERS = {"Authorization": "Bearer " + API_KEY}

def get_bot_score(username):
    """Score an account from 0 (human) to 100 (bot)."""
    score = 0
    reasons = []

    # Fetch user profile
    resp = requests.get(
        BASE_URL + "/users/" + username,
        headers=HEADERS
    )
    user = resp.json()["data"]

    followers = user.get("followers", 0)
    following = user.get("following", 0)
    tweets = user.get("tweets", 0)
    created = user.get("created_at", "")

    # 1. Account age vs followers
    if created:
        created_date = datetime.fromisoformat(
            created.replace("Z", "+00:00")
        )
        age_days = (datetime.now(created_date.tzinfo) - created_date).days
        if age_days > 0:
            followers_per_day = followers / age_days
            if followers_per_day > 500:
                score += 30
                reasons.append(
                    "Gaining " + str(int(followers_per_day))
                    + " followers/day — abnormal growth"
                )

    # 2. Follower/following ratio
    if following > 0:
        ratio = followers / following
        if 0.9 < ratio < 1.1 and followers > 10000:
            score += 15
            reasons.append(
                "Follower/following ratio ~1:1 with "
                + str(followers) + " followers — follow-back scheme"
            )

    # 3. Tweet frequency
    if created:
        if age_days > 0:
            tweets_per_day = tweets / age_days
            if tweets_per_day > 100:
                score += 25
                reasons.append(
                    str(int(tweets_per_day))
                    + " tweets/day — likely automated"
                )
            elif tweets_per_day < 0.1 and followers > 10000:
                score += 20
                reasons.append(
                    "Very low activity but high followers"
                    + " — possible purchased account"
                )

    # 4. No profile picture
    if user.get("avatar", "").endswith("default_profile_normal.png"):
        score += 15
        reasons.append("Default avatar")

    # 5. No bio
    if not user.get("bio") or len(user.get("bio", "")) < 5:
        score += 10
        reasons.append("No bio or very short bio")

    # 6. Engagement rate check
    tweet_resp = requests.get(
        BASE_URL + "/users/" + username + "/tweets",
        headers=HEADERS,
        params={"count": 10}
    )
    tweet_data = tweet_resp.json().get("data", [])

    if tweet_data and followers > 100:
        total_engagement = sum(
            t.get("likes", 0) + t.get("replies", 0)
            + t.get("retweets", 0)
            for t in tweet_data
        )
        avg_engagement = total_engagement / len(tweet_data)
        engagement_rate = (avg_engagement / followers) * 100

        if engagement_rate < 0.05:
            score += 25
            reasons.append(
                "Engagement rate: "
                + str(round(engagement_rate, 3))
                + "% — extremely low"
            )
        elif engagement_rate < 0.2:
            score += 15
            reasons.append(
                "Engagement rate: "
                + str(round(engagement_rate, 2))
                + "% — below average"
            )

    return {
        "username": username,
        "bot_score": min(score, 100),
        "risk_level": (
            "high" if score >= 60
            else "medium" if score >= 30
            else "low"
        ),
        "reasons": reasons,
        "followers": followers,
        "following": following,
        "tweets": tweets
    }

# Example: audit a single account
result = get_bot_score("some_crypto_account")
print("Bot score: " + str(result["bot_score"]) + "/100")
print("Risk: " + result["risk_level"])
for r in result["reasons"]:
    print("  - " + r)

Batch Auditing Followers

To audit an account's followers at scale, you can sample their follower list and score each one:

PYTHON
def audit_followers(target_username, sample_size=50):
    """Audit a sample of an account's followers."""
    # Get follower list
    resp = requests.get(
        BASE_URL + "/users/" + target_username + "/followers",
        headers=HEADERS,
        params={"count": sample_size}
    )
    followers = resp.json().get("data", [])

    # Batch lookup for efficiency
    usernames = [f["username"] for f in followers if f.get("username")]

    scores = []
    for username in usernames:
        try:
            result = get_bot_score(username)
            scores.append(result)
        except Exception:
            continue

    # Calculate summary
    high_risk = sum(1 for s in scores if s["risk_level"] == "high")
    medium_risk = sum(1 for s in scores if s["risk_level"] == "medium")
    low_risk = sum(1 for s in scores if s["risk_level"] == "low")
    total = len(scores)

    fake_pct = ((high_risk + medium_risk * 0.5) / total * 100) if total > 0 else 0

    print("Follower Audit: @" + target_username)
    print("Sample size: " + str(total))
    print("High risk (likely bots): " + str(high_risk))
    print("Medium risk: " + str(medium_risk))
    print("Low risk (likely real): " + str(low_risk))
    print("Estimated fake follower %: " + str(round(fake_pct, 1)) + "%")

    return {
        "target": target_username,
        "sample_size": total,
        "high_risk": high_risk,
        "medium_risk": medium_risk,
        "low_risk": low_risk,
        "estimated_fake_pct": round(fake_pct, 1)
    }

---

Common Bot Network Patterns

Beyond individual accounts, bots often operate in coordinated networks. Here's what to watch for:

Follow Trains

A group of 500-5000 accounts that all follow each other. Every account in the network has a similar follower count (because they're all following the same list). These networks are used to inflate follower counts cheaply.

Detection: Pick 10 followers of a suspicious account. Check if they all follow each other. Real followers of the same account rarely follow each other unless the account is very small and niche.

Coordinated Amplification

Multiple bot accounts all retweet or reply to the same tweet within minutes. This is used to game Twitter's algorithm and push content into "trending" or "recommended" feeds.

Detection: Check who's retweeting. If 200 retweets came from accounts that were all created in the same month, have similar follower counts, and share no other common interests, it's a bot network.

Astroturfing

Bot accounts that post seemingly organic opinions about a token, project, or narrative. Each account has a slightly different avatar and bio, but they all push the same talking points using varied wording.

Detection: Search for the project name and look at who's posting about it. If dozens of accounts with no previous crypto history suddenly all love the same obscure token, that's astroturfing.

Reply Bot Spam

Accounts that reply to popular tweets with scam links, fake giveaways, or impersonation attempts. These are the most visible bots on the platform.

Detection: Usually obvious — but the speed at which they appear (within seconds of a popular tweet) is a giveaway. No human refreshes Elon Musk's profile waiting to drop a reply the instant he tweets.

---

Putting It All Together

A comprehensive fake follower analysis combines multiple signals:

1. Start with engagement rate — It's the fastest signal. If engagement is healthy, the account is probably fine
2. Check account age vs. growth — Quick sanity check on whether the numbers make sense
3. Sample followers manually — 50 random followers gives you a reliable estimate
4. Run automated scoring if you need to check multiple accounts — The bot scoring script above catches most patterns
5. Look for network patterns — Especially important when evaluating crypto projects or KOLs

No single signal is definitive. An account with a default avatar might be a privacy-conscious whale. An account with low engagement might just be shadowbanned. But when multiple signals align — default avatar, no bio, random username, low engagement, new account with high followers — the conclusion is clear.

---

Scaling Your Analysis

Manual auditing works for checking individual accounts, but real-world use cases demand scale. Whether you're a VC evaluating a project's community, a brand assessing an influencer, or a researcher studying bot networks, you need to check hundreds or thousands of accounts efficiently.

XCROP's User Profile and Batch endpoints let you pull detailed profile data for up to 100 accounts in a single API call — including creation dates, follower counts, tweet counts, and engagement metrics. Combined with the Followers endpoint for sampling an account's audience, you can build automated follower audit pipelines that run continuously and flag suspicious accounts the moment they appear.

Ready to automate this end-to-end? See [Build a Twitter Bot Monitor](/blog/twitter-bot-monitor-api) for a full working scoring script, batch follower auditing, and creation-date cluster detection.