Instagram Bot / Fake-Follower Heuristic Analyzer
Pricing
from $3.60 / 1,000 profile analysis results
Instagram Bot / Fake-Follower Heuristic Analyzer
Analyze public Instagram profiles for suspicious audience-quality signals using transparent heuristics. Export flat CSV-friendly bot-risk scores, confidence fields, and reason tags for influencer vetting, creator screening, and manual review.
Pricing
from $3.60 / 1,000 profile analysis results
Rating
0.0
(0)
Developer
Delowar Munna
Actor stats
0
Bookmarked
4
Total users
2
Monthly active users
5 days ago
Last modified
Categories
Share

Analyze public Instagram profiles for suspicious audience-quality signals using transparent, documented heuristics. Returns flat, spreadsheet-ready rows with bot-risk-style scores, confidence, signal flags, and short reason fields so teams can prioritize manual review.
Positioning: This is an authenticity audit aid, not a definitive fraud detector. Every score is heuristic and should be combined with manual review before any partnership decision.
What does this actor do?
For each public Instagram username (or profile URL) you provide, the actor:
- Fetches the profile's public metrics (followers, following, posts, bio, category, verification, business signals).
- Optionally samples a bounded set of recent visible posts/reels and reads their like / comment / view counts.
- Computes derived ratios (engagement rate approximation, comments-to-likes, followers-to-following, etc.).
- Evaluates a set of named, auditable heuristic flags (low engagement for tier, sparse content, high following, low recency, inconsistent performance, suspicious growth proxy, profile completeness, business credibility offset).
- Produces a conservative bot-risk score (0–100), a bucket (
low/moderate/elevated/high/unknown), a confidence score, a manual review priority, and a short reason field — one row per analyzed account.
The output is intentionally flat, CSV-friendly, and designed for analyst review — not for unilateral decisions.
Use cases
- Influencer vetting — pre-screen creators before gifting / sponsorship deals.
- Agency pre-screening — quickly flag profiles needing manual review across a creator shortlist.
- Competitor authenticity benchmarking — compare suspicious-signal patterns across competitor accounts.
- Marketplace and CRM triage — produce a CSV of candidate accounts with risk-style fields.
- Research — structured public-signal exports for authenticity-related studies.
What it is — and isn't
It is a public-signal analyzer, a risk-scoring helper, an authenticity audit support tool.
It is not a verified fraud detector, a replacement for manual review, an official Instagram trust signal, a private-data analyzer, or a tool for follower-by-follower forensics.
Sample inputs
Example 1 — Influencer vetting batch (defaults)
Screen a shortlist of public creator/brand accounts using the default analysis settings.
{"usernames": ["instagram", "therock", "nike"],"includeRecentPostsSample": true,"recentPostsLimit": 9,"includeDerivedSignals": true,"includeProfileContext": true,"minVisiblePostsRequired": 3}
Example 2 — Mixed usernames + URLs with tighter sampling
Combine raw usernames and full profile URLs in a single run, with a smaller recent-posts sample to keep runtime and rate-limit pressure low.
{"usernames": ["google"],"profileUrls": ["https://www.instagram.com/tesla/","https://www.instagram.com/natgeo/"],"includeRecentPostsSample": true,"recentPostsLimit": 6,"includeDerivedSignals": true,"includeProfileContext": true,"minVisiblePostsRequired": 3,"maxConcurrency": 1,"requestTimeoutSecs": 180}
Input reference
| Field | Type | Default | Description |
|---|---|---|---|
usernames | string[] | [] | Public Instagram usernames (without @). |
profileUrls | string[] | [] | Public Instagram profile URLs. Post / reel URLs are rejected. |
includeRecentPostsSample | boolean | true | Sample a small set of recent posts/reels. Disable to keep runs minimal — engagement-based flags will not fire. |
recentPostsLimit | integer | 9 | Max recent posts analyzed per profile (0–24). |
includeDerivedSignals | boolean | true | Compute ratio fields. Score still emitted when disabled, but ratio columns will be null. |
includeProfileContext | boolean | true | Include biography, externalUrl, accountType, categoryName in the row. |
minVisiblePostsRequired | integer | 3 | Threshold used by the confidence score. Profiles with fewer visible posts still produce a row, with lower confidence. |
requestTimeoutSecs | integer | 180 | Timeout per profile. |
maxConcurrency | integer | 1 | Concurrent profile workers. Keep low to reduce rate-limit pressure. |
debugMode | boolean | false | Verbose logging. |
You can mix usernames and profileUrls in the same run — duplicates are deduped automatically.
Output
One JSON object per analyzed profile is pushed to the default dataset. The dataset has a single view named Profile Audit Rows.
Profile Audit Rows — table view

Row groups
- Identity:
inputUsername,profileUsername,profileUrl,instagramUserId,fullName,isVerified,isPrivate,accountType,categoryName - Public metrics:
followersCount,followingCount,postsCount,followersToFollowingRatio,followersBucket,biography,externalUrl,hasExternalUrl - Recent content sample:
recentPostsAnalyzed,avgLikesRecent,avgCommentsRecent,avgViewsRecent,medianLikesRecent,medianCommentsRecent,maxLikesRecent,maxCommentsRecent,latestPostTimestamp,daysSinceLatestPost,recentActivitySignal - Derived ratios:
engagementRateApprox,commentsToFollowersRatio,likesToFollowersRatio,viewsToFollowersRatio,commentsToLikesRatio,engagementVarianceHint - Heuristic flags:
lowEngagementFlag,highFollowerLowEngagementFlag,highFollowingFlag,sparseContentFlag,lowRecencyFlag,inconsistentPerformanceFlag,suspiciousGrowthProxyFlag,profileCompletenessFlag,businessCredibilitySignal - Scores:
botRiskScore,botRiskBucket,confidenceScore,confidenceBucket,signalCount,scoreVersion - Explanation:
botRiskReason,topFlags(pipe-delimited),manualReviewPriority - Utility:
scrapedAt,runId,sourceActorVersion
Example row — full record (Profile Audit Rows view)
A real row produced by the actor for @instagram. Every column listed in the row groups above is included, with null where Instagram does not expose a value publicly.
{"inputUsername": "instagram","profileUsername": "instagram","profileUrl": "https://www.instagram.com/instagram/","instagramUserId": "25025320","fullName": "Instagram","isVerified": true,"isPrivate": false,"accountType": "creator","categoryName": null,"followersCount": 701007049,"followingCount": 175,"postsCount": 8425,"followersToFollowingRatio": 4005754.5657,"followersBucket": "mega","biography": "Discover what's new on Instagram 🔎✨","externalUrl": "http://help.instagram.com/","hasExternalUrl": true,"recentPostsAnalyzed": 9,"avgLikesRecent": 467919,"avgCommentsRecent": 8293,"avgViewsRecent": 12428912,"medianLikesRecent": 280584,"medianCommentsRecent": 6843,"maxLikesRecent": 1032374,"maxCommentsRecent": 17160,"latestPostTimestamp": "2026-05-01T18:58:25.000Z","daysSinceLatestPost": 2,"recentActivitySignal": "active","engagementRateApprox": 0.000679,"commentsToFollowersRatio": 0.000012,"likesToFollowersRatio": 0.000667,"viewsToFollowersRatio": 0.01773,"commentsToLikesRatio": 0.0177,"engagementVarianceHint": "low","lowEngagementFlag": true,"highFollowerLowEngagementFlag": true,"highFollowingFlag": false,"sparseContentFlag": false,"lowRecencyFlag": false,"inconsistentPerformanceFlag": false,"suspiciousGrowthProxyFlag": false,"profileCompletenessFlag": false,"businessCredibilitySignal": true,"botRiskScore": 25,"botRiskBucket": "moderate","confidenceScore": 100,"confidenceBucket": "high","signalCount": 2,"scoreVersion": "1.0.0","botRiskReason": "Engagement rate is below typical baselines for this follower tier. High follower count with consistently weak visible engagement across recent posts. Some credibility signals are present, which partially offsets the risk. Review manually before partnership.","topFlags": "lowEngagementFlag|highFollowerLowEngagementFlag","manualReviewPriority": "medium","scrapedAt": "2026-05-04T06:03:17.942Z","runId": "cqJ7sg359cbIn9KvH","sourceActorVersion": "1.0"}
Heuristic flags
| Flag | Trigger (default thresholds) |
|---|---|
lowEngagementFlag | Engagement rate < 0.5% and followers ≥ 1k |
highFollowerLowEngagementFlag | Engagement rate < 0.3% and followers ≥ 50k |
highFollowingFlag | Following > 5000 and followers/following < 1 |
sparseContentFlag | Posts < 5 and followers ≥ 1k |
lowRecencyFlag | No visible post in the last 90 days |
inconsistentPerformanceFlag | High variance (CV ≥ 1.5) across recent like counts |
suspiciousGrowthProxyFlag | Followers ≥ 10k, posts < 20, AND lowEngagementFlag is true |
profileCompletenessFlag | No bio, no external link, no category |
businessCredibilitySignal | Business / creator account, OR has both external URL and category (this reduces risk) |
All thresholds live in a single THRESHOLDS constant in src/instagramExtractor.js so they can be audited and tuned without searching the codebase. Bumping the heuristic logic must also bump SCORE_VERSION.
Score buckets
botRiskBucket | Range |
|---|---|
low | 0–24 |
moderate | 25–49 |
elevated | 50–69 |
high | ≥ 70 |
unknown | Private / unreachable / no public data |
Confidence ranges: low (< 40), moderate (40–69), high (≥ 70).
A high-risk score on a low-confidence row is not the same as a high-risk score on a high-confidence row. Always read both columns together.
Graceful degradation
- Private accounts emit a row with
isPrivate: true,botRiskBucket: "unknown", and confidence near 0. - Unreachable / non-existent usernames emit a row with
botRiskBucket: "unknown"and a clearbotRiskReason— they do not stop the crawler. - When the recent-posts feed is unavailable, ratio fields are
nullandengagementVarianceHintisnull. The score is still computed using the available signals, but flags that depend on engagement won't fire.
Pricing
Pay-per-event:
profile-analysis-result— charged once per analyzed profile row.
The actor respects user spending limits — when the configured limit is reached, the run stops gracefully without further charges.
Local development
cd actornpm installnpm start # uses INPUT.jsonnpm run dev # local storage only
The default INPUT.json analyzes a single well-known public profile so first runs are quick.
Limitations
- All signals are heuristic and based only on public profile data. The actor does not, and cannot, prove fake followers.
- Instagram's public surface evolves; some metric fields can be missing for some accounts. The actor handles this by lowering the confidence score rather than failing.
- Aggressive sampling will trigger Instagram rate limits — keep
recentPostsLimitandmaxConcurrencymodest.