Instagram Phone Number Scraper
Pricing
$19.99/month + usage
Instagram Phone Number Scraper
Automate phone number extraction from Instagram with Instagram Phone Number Scraper. The actor scans profiles and external links to pull available contact numbers into structured datasets for CRM enrichment.
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
API Empire
Maintained by CommunityActor stats
0
Bookmarked
66
Total users
6
Monthly active users
2 days ago
Last modified
Categories
Share
Instagram Contact & Lead Scraper
Enrich Instagram profiles into structured contact leads. For every target this actor fetches Instagram's authoritative web_profile_info payload and emits the profile's real contact data — business phone, business email, external URL, and bio-extracted emails / phones / WhatsApp / Linktree — together with profile attributes (category, verified & business flags, follower count).
It replaces snippet-regex guessing with authoritative profile data: phone numbers are validated and normalized to E.164, so prices, follower counts, years and post IDs are rejected instead of being reported as phones.
Input
Provide at least one of:
- usernames (array) — direct targets. Accepts:
- plain usernames:
natgeo @handles:@natgeo- profile URLs:
https://instagram.com/natgeo - post/reel URLs:
https://instagram.com/p/CXXXXXX/(the post owner is resolved and enriched; the row keepspostUrl+postShortcode) - numeric user IDs:
173560420
- plain usernames:
- searchKeywords (array) — optional Google-SERP discovery. Each keyword runs
site:instagram.com "<dial code>" "<keyword>", then every candidate profile is enriched exactly like a direct target.
Other parameters:
| Field | Meaning |
|---|---|
country | Dial code used to localize the discovery query and to parse local (non-+) phone numbers into E.164. |
maxProfiles | Max candidate profiles discovered per keyword (does not cap direct targets). |
hasPhoneOnly / hasEmailOnly / businessOnly / verifiedOnly / minFollowers | Lead filters. Error rows are always kept. |
concurrency / maxRetries / delayMs | Enrichment tuning. |
proxyConfiguration | Proxy for enrichment requests (RESIDENTIAL recommended; a fresh IP per profile). SERP discovery always uses the Apify GOOGLE_SERP proxy. |
Example input
{"usernames": ["nike", "@natgeo"],"searchKeywords": ["real estate agent"],"country": "United States (+1)","hasPhoneOnly": false,"businessOnly": false,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
Output
One row per target (success or error). Unavailable values are null (never a fabricated 0 or a false-positive number).
| Field | Description |
|---|---|
inputType | username / profileUrl / postUrl / userId / invalid. |
mode | direct (from your usernames list) or discovery (found via keyword SERP). |
username, userId, fullName, profileUrl | Profile identity. |
postUrl, postShortcode | Set when the input was a post/reel URL. |
keyword, serpTitle, serpSnippet, serpUrl | Discovery context. |
businessPhone | Authoritative phone from web_profile_info (business/contact/public phone). |
phoneE164, phoneCountry | Normalized + validated phone and its country. |
businessEmail, emailDomain | Authoritative email and its domain. |
externalUrl, whatsapp, linktree, bioLinks | Links/contacts from the profile. |
emailsFromText, phonesFromText | Deterministic extraction from bio + SERP snippet (phones E.164-validated). |
biography, categoryName, isBusinessAccount, isVerified, isPrivate, followerCount | Profile attributes. |
scrapedAt | ISO-8601 UTC timestamp. |
error | Reason string when a target could not be enriched (not-found, private, auth-gated, etc.). |
Notes on coverage
- Reachability (anti-bot reality). Instagram's logged-out anti-bot returns an intermittent
401/403/429that is variance per IP — the same account can fail on one residential IP and enrich cleanly on another. To counter this, each retry runs on a fresh residential proxy IP with a fresh Chrome-TLS client and a freshapp_id/csrfbootstrap handshake, with exponential backoff + jitter. This materially raises reachability versus retrying on one IP: on a fixed 18-account benchmark, reachability rose from 12/18 (66.7%) with same-IP retries to 17/18 (94.4%) with fresh-IP retries atmaxRetries: 3. It does not reach 100% (Instagram can block every IP tried within the budget). RaisingmaxRetriestrades run time for a higher hit rate. Unreachable targets return an honest error row (never fabricated data). businessPhone/businessEmailare only present when the account has published them and Instagram returns them unauthenticated. Instagram gates these behind login for logged-out requests on most accounts, so they are frequentlynull. Lead value in that case comes from the E.164-validated phones/emails/WhatsApp/Linktree extracted from the bio,bio_linksand (in discovery) the SERP snippet.nullhere is honest absence, not a bug.- Private and non-existent profiles produce a clean row (private accounts enrich with
isPrivate: trueand limited fields; non-existent ones return an error row) rather than fabricated data. - The
userIdinput mode depends on Instagram'si.instagram.com/users/{id}/infoendpoint, which is auth-gated and blocked from Apify's datacenter network — it returns a clean error row. - Every input produces exactly one row (success or an
errorrow); one bad profile never aborts the batch. Every network call is bounded by a timeout and each profile by a total time budget. - Dedup is global (by resolved username / user ID / URL) across direct and discovery targets.
Compliance
Use only for publicly available data and in accordance with Instagram's terms and applicable data-protection law. Private profiles are not accessed.