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?
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
@john38492847 or @CryptoKing_29384. Real humans pick memorable usernamesContent Indicators
Engagement Indicators
---
Follower-to-Following Ratio Analysis
The ratio between followers and following reveals a lot:
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):
Red flags:
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 × 100Benchmark Ranges
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
Time Pattern Analysis
Plot tweet timestamps across a week. Humans show clear patterns:
Bots show:
Content Patterns
---
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
- 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)?
Interpreting Results
Pro Tips
---
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 datefollowers_count — Total followersfollowing_count — Total followingtweet_count — Total tweets postedverified — Blue checkmark statusPython: Basic Bot Scoring
Here's a practical scoring function that evaluates an account based on multiple signals:
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:
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:
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.