Instagram Lead Qualifier avatar

Instagram Lead Qualifier

Pricing

from $100.00 / 1,000 qualified profiles

Go to Apify Store
Instagram Lead Qualifier

Instagram Lead Qualifier

Qualify Instagram influencers at scale. Input a list of profiles, get lead scores (0-100), engagement rates, follower counts, business emails, and niche matching. Tiered engagement thresholds auto-adjust by influencer size. Perfect for agencies and brand partnership teams.

Pricing

from $100.00 / 1,000 qualified profiles

Rating

5.0

(1)

Developer

Fatih İlhan

Fatih İlhan

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

0

Monthly active users

3.6 days

Issues response

16 days ago

Last modified

Share

Instagram Influencer Lead Qualification Actor

A high-performance Apify Actor that scrapes and qualifies Instagram influencer profiles based on customizable engagement metrics, follower thresholds, and niche relevance.

🎯 Overview

This actor takes a list of Instagram profiles and returns qualified leads with comprehensive engagement data, lead scores, and actionable recommendations. It’s useful for influencer marketing agencies, brand partnership teams, and growth marketers.

✨ Features

  • Multi-method data extraction: Uses Instagram's internal API (feed_user + web_profile_info), HTML parsing, and meta tag fallbacks for maximum reliability.
  • Reel view-count metrics: Captures play_count on video/Reel posts and derives a median view-to-follower ratio — a strong signal for authentic reach.
  • Intelligent lead scoring: 0–100 score based on follower fit, engagement rate, niche match, and business email presence.
  • Tiered engagement thresholds: Automatically adjusts engagement expectations based on influencer tier (nano → mega).
  • Strict qualification gating: Only profiles passing every filter are written to the dataset by default (onlyOutputQualified).
  • Multilingual support: Parses follower counts in English, Turkish, Spanish, French, Indonesian, and more.
  • Configurable throughput: Tune maxConcurrency and maxRequestsPerMinute to trade speed vs. rate-limit risk.
  • Anti-detection: iPhone 14 Pro device emulation with fingerprint randomization.
  • Rate limit handling: Automatic abort after configurable rate limit threshold.
  • Debug tools: Saves HTML dumps and screenshots for failed extractions.

📥 Input

Input schema

{
"profiles": ["username1", "username2", "https://instagram.com/username3"],
"sessionId": "YOUR_INSTAGRAM_SESSION_ID",
"minFollowers": 4500,
"maxFollowers": 500000,
"minEngagementRate": 1.5,
"minViewToFollowerRatio": 30,
"requireBusinessEmail": false,
"nicheKeywords": ["fitness", "health", "wellness"],
"onlyOutputQualified": true,
"maxProfilesPerRun": 50,
"maxConcurrency": 2,
"maxRequestsPerMinute": 30,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

Input parameters

ParameterTypeRequiredDefaultDescription
profilesarray-Instagram usernames (without @) or full profile URLs
sessionIdstring-Instagram session cookie (supports URL-encoded format)
minFollowersinteger1000Minimum follower threshold
maxFollowersintegernullMaximum follower threshold
minEngagementRatenumber1.5Minimum engagement rate as percentage (e.g., 1.5 = 1.5%)
minViewToFollowerRationumber0Minimum median Reel view count as percentage of followers (e.g., 30 = views ≥ 30% of followers). Set to 0 to disable.
requireBusinessEmailbooleanfalseOnly qualify profiles with an email in bio
nicheKeywordsarray[]Keywords to match in profile bio
onlyOutputQualifiedbooleantrueOnly write profiles that pass all filters to the dataset. Disable to inspect every profile with its skipReason.
maxProfilesPerRuninteger50Maximum profiles to process per run
maxConcurrencyinteger2Parallel profile scrapes. Raise for speed, lower if rate-limited.
maxRequestsPerMinuteinteger30Global rate cap for Instagram page loads.
proxyConfigurationobjectRESIDENTIALApify proxy configuration

📤 Output

Successful profile item

{
"username": "fitness_influencer",
"profileUrl": "https://www.instagram.com/fitness_influencer/",
"followers": 125000,
"following": 892,
"posts": 1247,
"bio": "🏋️ Certified Personal Trainer | 📧 collab@fitness.com",
"externalUrl": "https://linktr.ee/fitness_influencer",
"isVerified": false,
"profilePicUrl": "https://instagram.com/...",
"recentPosts": [
{
"shortcode": "ABC123xyz",
"likeCount": 4521,
"commentCount": 89,
"timestamp": "2024-01-15T10:30:00.000Z",
"displayUrl": "https://...",
"isVideo": true,
"viewCount": 38420,
"productType": "clips"
}
],
"avgLikes": 4200,
"medianLikes": 4100,
"avgComments": 85,
"engagementRate": 0.0343,
"engagementRatePct": 3.43,
"postingFrequency": 0.85,
"postingFrequencyLabel": "0.9 posts/day",
"medianViewCount": 38420,
"viewToFollowerRatio": 0.3074,
"viewToFollowerRatioPct": 30.74,
"businessEmail": "collab@fitness.com",
"nicheMatchScore": 0.67,
"leadScore": 78.5,
"recommendation": "contact",
"qualified": true,
"skipReason": null,
"score_explanation": {
"avg_likes_last_12": 4200,
"engagement_rate": 0.0343,
"engagement_rate_pct": 3.43,
"engagement_formula": "engagement_rate = (median_likes + avg_comments) / followers",
"follower_count": 125000,
"tier": "macro",
"expected_engagement": 1.0,
"posting_frequency_per_day": 0.85,
"posting_frequency_formula": "posts_per_day = post_count / (days_between_oldest_and_newest_post)",
"posts_sampled": 12,
"median_view_count": 38420,
"view_to_follower_ratio_pct": 30.74,
"reason_summary": "Engagement: 3.43% | Expected for macro: 1.0% | Followers: 125,000 | Tier: macro | Posts/day: 0.85 (from 12 recent posts) | Median views: 38,420 (30.7% of followers)"
},
"inputType": "profileUrl",
"source": "https://www.instagram.com/fitness_influencer/",
"success": true,
"scrapedAt": "2024-01-20T14:32:00.000Z"
}

Failed profile item

{
"username": "private_account",
"profileUrl": "https://www.instagram.com/private_account/",
"success": false,
"error": "LOGIN_REQUIRED",
"errorCode": "LOGIN_REQUIRED",
"errorMessage": "Redirected to Login.",
"scrapedAt": "2024-01-20T14:33:00.000Z"
}

📊 Lead Scoring System

Score components (0–100)

ComponentWeightDescription
Follower Fit40%How well follower count matches target range
Engagement Rate25%Engagement relative to tier-adjusted threshold
Niche Match20%Bio keyword matches / total keywords
Business Email10%Has public email in bio
Verified Badge5%Instagram verification status

Recommendations

Score rangeRecommendationAction
70–100contactHigh priority lead, reach out immediately
40–69reviewModerate fit, manual review recommended
0–39skipDoes not meet qualification criteria

Influencer tiers & engagement thresholds

The actor automatically adjusts engagement expectations based on follower count:

TierFollowersBase threshold multiplierExample (1.5% base)
Nano<1K1.0x1.5%
Micro1K–10Kmax(base, 5%)5.0%
Mid10K–100K1.0x1.5%
Macro100K–1M0.67x1.0%
Mega1M+0.33x0.5%

🧮 How metrics are computed

All metrics are derived from the 12 most-recent posts returned by Instagram's feed_user endpoint.

MetricFormulaNotes
engagementRate(medianLikes + avgComments) / followersMedian likes are used instead of mean to reduce skew from viral outliers.
postingFrequencypostCount / daysBetween(oldestPost, newestPost)Expressed as posts per day. postingFrequencyLabel auto-formats as posts/day, /week, or /month based on magnitude.
medianViewCountmedian(playCount) across video/Reel posts onlyOnly posts where media_type === 2 (Reels/video) contribute. null if no videos in the sample.
viewToFollowerRatiomedianViewCount / followersStrong authenticity signal — accounts with inflated followers typically get much lower ratios.
nicheMatchScorematchedKeywords / totalKeywordsBio keyword overlap. 0.5 when no keywords configured.

View-to-follower ratio filter

Set minViewToFollowerRatio: 30 to only qualify profiles where the median Reel view count ≥ 30% of followers. This is one of the most reliable signals for filtering out bought-follower accounts.

  • Profiles with no video posts in the sample will be skipped with skipReason: "no_video_view_data" when this filter is active.
  • Set to 0 to disable the filter entirely.

🔐 Getting Your Session ID

  1. Open Instagram in Chrome and log in.
  2. Press F12 to open DevTools.
  3. Go to ApplicationCookieshttps://www.instagram.com.
  4. Find the sessionid cookie and copy its value.
  5. Paste into the sessionId input field.

Note: Session IDs can be either URL-encoded (with %3A) or decoded (with :). Both formats are supported.

⚠️ Error Codes

CodeDescriptionResolution
LOGIN_REQUIREDRedirected to Instagram loginProvide a valid sessionId
ACCESS_DENIEDRate limited or blockedReduce maxRequestsPerMinute, use residential proxies
PARSE_ERRORFailed to extract profile dataCheck debug HTML in the Key-Value Store

Skip reasons (present on unqualified profiles)

skipReasonMeaning
below_min_followersFollower count under minFollowers
above_max_followersFollower count over maxFollowers
below_min_engagementEngagement rate below tier-adjusted threshold
missing_business_emailrequireBusinessEmail set but no email found in bio
no_niche_matchNone of nicheKeywords match the bio
no_video_view_dataminViewToFollowerRatio set but profile has no Reels in sample
below_min_view_to_follower_ratioMedian Reel views are under the required % of followers

🛠️ Configuration Defaults

const DEFAULT_MAX_PROFILES = 50;
const DEFAULT_MAX_CONCURRENCY = 2;
const DEFAULT_MAX_REQUEST_RETRIES = 2;
const DEFAULT_MAX_REQUESTS_PER_MIN = 30;
const MAX_RATE_LIMIT_HITS = 3;

All of these can be overridden via input. If you see ACCESS_DENIED failures, drop maxConcurrency to 1 and maxRequestsPerMinute to 15.

📁 Debug Outputs

When extraction fails, the actor saves debug data to the Key-Value Store:

  • debug-html-{username}-{timestamp} - Full page HTML
  • screenshot-{username}-{label}-{timestamp} - Page screenshot

Labels include: LOGIN_REDIRECT, BLOCKED_HARD, PARSE_FAIL, PARSE_ERROR.

🚀 Usage Example

Via Apify Console

  1. Navigate to the Actor in Apify Console.
  2. Fill in the input form with your profiles and session ID.
  3. Click Start.
  4. Download results from the Dataset tab.

Via API

curl -X POST "https://api.apify.com/v2/acts/YOUR_ACTOR_ID/runs?token=YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"profiles": ["therock", "cristiano", "kyliejenner"],
"sessionId": "YOUR_SESSION_ID",
"minFollowers": 100000,
"minEngagementRate": 1.0,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}'

Via JavaScript SDK

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('YOUR_ACTOR_ID').call({
profiles: ['therock', 'cristiano'],
sessionId: 'YOUR_SESSION_ID',
minFollowers: 100000,
proxyConfiguration: {
useApifyProxy: true,
apifyProxyGroups: ['RESIDENTIAL']
}
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

📋 Best Practices

  • Use residential proxies: Required for reliable Instagram access.
  • Tune concurrency carefully: Default 2 is a good balance. Raise toward 4 only with a fresh residential session; drop to 1 if you see repeated ACCESS_DENIED.
  • Batch appropriately: Process 25–50 profiles per run.
  • Monitor session ID: Refresh if you see LOGIN_REQUIRED errors.
  • Respect rate limits: Actor auto-aborts after 3 consecutive rate limit hits.
  • Use view-to-follower ratio for filtering: minViewToFollowerRatio: 30 is a very effective authenticity filter — bought-follower accounts rarely hit 30%.

📄 License

Private - Internal use only.