Instagram Phone Number Scraper avatar

Instagram Phone Number Scraper

Pricing

$19.99/month + usage

Go to Apify Store
Instagram Phone Number Scraper

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

API Empire

Maintained by Community

Actor stats

0

Bookmarked

66

Total users

6

Monthly active users

2 days ago

Last modified

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 keeps postUrl + postShortcode)
    • numeric user IDs: 173560420
  • 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:

FieldMeaning
countryDial code used to localize the discovery query and to parse local (non-+) phone numbers into E.164.
maxProfilesMax candidate profiles discovered per keyword (does not cap direct targets).
hasPhoneOnly / hasEmailOnly / businessOnly / verifiedOnly / minFollowersLead filters. Error rows are always kept.
concurrency / maxRetries / delayMsEnrichment tuning.
proxyConfigurationProxy 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).

FieldDescription
inputTypeusername / profileUrl / postUrl / userId / invalid.
modedirect (from your usernames list) or discovery (found via keyword SERP).
username, userId, fullName, profileUrlProfile identity.
postUrl, postShortcodeSet when the input was a post/reel URL.
keyword, serpTitle, serpSnippet, serpUrlDiscovery context.
businessPhoneAuthoritative phone from web_profile_info (business/contact/public phone).
phoneE164, phoneCountryNormalized + validated phone and its country.
businessEmail, emailDomainAuthoritative email and its domain.
externalUrl, whatsapp, linktree, bioLinksLinks/contacts from the profile.
emailsFromText, phonesFromTextDeterministic extraction from bio + SERP snippet (phones E.164-validated).
biography, categoryName, isBusinessAccount, isVerified, isPrivate, followerCountProfile attributes.
scrapedAtISO-8601 UTC timestamp.
errorReason 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/429 that 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 fresh app_id/csrf bootstrap 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 at maxRetries: 3. It does not reach 100% (Instagram can block every IP tried within the budget). Raising maxRetries trades run time for a higher hit rate. Unreachable targets return an honest error row (never fabricated data).
  • businessPhone / businessEmail are 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 frequently null. Lead value in that case comes from the E.164-validated phones/emails/WhatsApp/Linktree extracted from the bio, bio_links and (in discovery) the SERP snippet. null here is honest absence, not a bug.
  • Private and non-existent profiles produce a clean row (private accounts enrich with isPrivate: true and limited fields; non-existent ones return an error row) rather than fabricated data.
  • The userId input mode depends on Instagram's i.instagram.com/users/{id}/info endpoint, 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 error row); 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.