Instagram Bot / Fake-Follower Heuristic Analyzer avatar

Instagram Bot / Fake-Follower Heuristic Analyzer

Pricing

from $3.60 / 1,000 profile analysis results

Go to Apify Store
Instagram Bot / Fake-Follower Heuristic Analyzer

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

Delowar Munna

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

2

Monthly active users

5 days ago

Last modified

Share

Instagram Bot / Fake-Follower Heuristic Analyzer — Apify Actor banner

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:

  1. Fetches the profile's public metrics (followers, following, posts, bio, category, verification, business signals).
  2. Optionally samples a bounded set of recent visible posts/reels and reads their like / comment / view counts.
  3. Computes derived ratios (engagement rate approximation, comments-to-likes, followers-to-following, etc.).
  4. 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).
  5. 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

FieldTypeDefaultDescription
usernamesstring[][]Public Instagram usernames (without @).
profileUrlsstring[][]Public Instagram profile URLs. Post / reel URLs are rejected.
includeRecentPostsSamplebooleantrueSample a small set of recent posts/reels. Disable to keep runs minimal — engagement-based flags will not fire.
recentPostsLimitinteger9Max recent posts analyzed per profile (0–24).
includeDerivedSignalsbooleantrueCompute ratio fields. Score still emitted when disabled, but ratio columns will be null.
includeProfileContextbooleantrueInclude biography, externalUrl, accountType, categoryName in the row.
minVisiblePostsRequiredinteger3Threshold used by the confidence score. Profiles with fewer visible posts still produce a row, with lower confidence.
requestTimeoutSecsinteger180Timeout per profile.
maxConcurrencyinteger1Concurrent profile workers. Keep low to reduce rate-limit pressure.
debugModebooleanfalseVerbose 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

Profile Audit Rows table view — one row per analyzed Instagram account, with risk bucket, confidence, flags, and reason fields

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

FlagTrigger (default thresholds)
lowEngagementFlagEngagement rate < 0.5% and followers ≥ 1k
highFollowerLowEngagementFlagEngagement rate < 0.3% and followers ≥ 50k
highFollowingFlagFollowing > 5000 and followers/following < 1
sparseContentFlagPosts < 5 and followers ≥ 1k
lowRecencyFlagNo visible post in the last 90 days
inconsistentPerformanceFlagHigh variance (CV ≥ 1.5) across recent like counts
suspiciousGrowthProxyFlagFollowers ≥ 10k, posts < 20, AND lowEngagementFlag is true
profileCompletenessFlagNo bio, no external link, no category
businessCredibilitySignalBusiness / 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

botRiskBucketRange
low0–24
moderate25–49
elevated50–69
high≥ 70
unknownPrivate / 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 clear botRiskReason — they do not stop the crawler.
  • When the recent-posts feed is unavailable, ratio fields are null and engagementVarianceHint is null. 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 actor
npm install
npm start # uses INPUT.json
npm 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 recentPostsLimit and maxConcurrency modest.