Instagram Profile Phone & Contact Scraper avatar

Instagram Profile Phone & Contact Scraper

Pricing

$19.99/month + usage

Go to Apify Store
Instagram Profile Phone & Contact Scraper

Instagram Profile Phone & Contact Scraper

Instagram Profile Phone Number Scraper collects phone contact data to support audience research and outreach. Analyze niches, regions, or trends while identifying direct contact points efficiently.

Pricing

$19.99/month + usage

Rating

0.0

(0)

Developer

SimpleAPI

SimpleAPI

Maintained by Community

Actor stats

0

Bookmarked

22

Total users

3

Monthly active users

12 days ago

Last modified

Share

Instagram Profile Contact Enricher (with Link-in-Bio Unwrapping)

Bring your own list of Instagram profiles and turn it into a contact sheet. This Instagram scraper takes a list of usernames, @handles, profile URLs, user IDs, or post/reel URLs and enriches each one from Instagram's authoritative web_profile_info payload — no keyword guessing, no fabricated data.

Its distinguishing feature is link-in-bio unwrapping: when a profile's external URL or a bio link points at a link aggregator (Linktree, Beacons, Stan.store, Carrd, Koji, Milkshake, Taplink, and more), the actor fetches that page and one hop of its destination links, then scans them for phone numbers, emails, and social handles that are not visible on the Instagram profile itself.

Keywords: instagram scraper, instagram profile scraper, instagram contact scraper, instagram email scraper, instagram phone number extractor, lead generation, linktree scraper, link in bio scraper, beacons scraper, business email finder, instagram lead scraper, b2b leads, contact enrichment, e164 phone validation, instagram business account data.

What it does

For every profile in your list it emits one row containing:

  • Authoritative profile data (from web_profile_info): fullName, biography, externalUrl, categoryName, isBusinessAccount, isVerified, isPrivate, followerCount, userId, profileUrl.
  • Business contact fields (when Instagram exposes them): businessPhone, businessEmail, emailDomain.
  • Bio-extracted contacts: emailsFromBio, phonesFromBio (E.164-validated), whatsapp (from wa.me links), linktree, bioLinks.
  • Validated phone: phoneE164 + phoneCountry — parsed and validated with libphonenumber so follower counts, years, prices and post IDs are rejected rather than emitted as fake phone numbers.
  • Link-in-bio unwrapping: linkInBioContacts — a list of { url, emails[], phones[], socials[] } for each aggregator/destination page that was actually fetched and yielded contacts — plus pagesScanned, the number of pages successfully fetched for that profile, and linkInBioNote, a human-readable note when a page was fetched but yielded nothing (for example a JS-rendered aggregator that needs a browser render).
  • Data-quality fields: type (contact for an enriched row, error for a failure row), inputType, scrapedAt (ISO-8601 UTC), and error (one row per input, always — invalid inputs and unreachable profiles produce a row with type: "error" and error set rather than being silently dropped).

Every value comes from the real Instagram payload or a page that was really fetched. When something is unavailable it is null (or an empty list) — never a fabricated value and never a fake 0.

Input

FieldTypeDescription
profilesarrayUsernames / @handles / profile URLs / user IDs / post URLs to enrich. Required.
unwrapLinkInBiobooleanFollow link aggregators + one hop and scan for contacts. Default true.
maxLinkInBioPagesintegerMax pages fetched per profile while unwrapping (0–25). Default 5.
linkInBioTimeoutSecintegerPer-page fetch timeout in seconds (3–60). Default 15.
linkInBioTotalBudgetSecintegerOverall wall-clock budget for one profile's unwrap (0 = auto, up to 300). Default 0 (auto).
countrystringOptional. Default region used only to parse local (non-+) phone numbers into E.164.
hasPhoneOnlybooleanEmit only profiles with a phone (business / bio / WhatsApp / link-in-bio).
hasEmailOnlybooleanEmit only profiles with an email (business / bio / link-in-bio).
businessOnlybooleanEmit only business accounts.
verifiedOnlybooleanEmit only verified accounts.
minFollowersintegerEmit only profiles with at least this many followers.
concurrency, maxRetries, delayMs, proxyConfigurationAdvanced run settings. RESIDENTIAL proxy recommended.

Example input

{
"profiles": ["nike", "@natgeo", "https://www.instagram.com/p/C123abcD/"],
"unwrapLinkInBio": true,
"maxLinkInBioPages": 5,
"hasEmailOnly": false,
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}

How it works

  1. Each input is parsed to a target (username / profile URL / post URL / user ID). Post URLs and user IDs are resolved to a username first.
  2. The username is fetched through the web_profile_info engine: an Instagram HTML page bootstraps app_id/csrf, then the JSON API is called with Chrome TLS impersonation, with a four-layer HTML fallback if the API is unavailable. A fresh residential proxy IP is used per profile.
  3. Contact fields are extracted from the payload; bio text is scanned for emails, phones (validated), WhatsApp and Linktree links.
  4. If enabled, link-in-bio unwrapping fetches any aggregator link from the bio and one hop of the destination links it lists, scanning each for contacts.

Notes on coverage and limits

  • businessPhone and businessEmail are frequently auth-gated by Instagram for logged-out requests: many public business accounts return null for these two fields even though the account displays a contact button in the app. The bio-extracted and link-in-bio contacts are the reliable recovery path in that case. This is an Instagram limitation, not a bug.
  • Instagram rate-limits and blocks datacenter IPs; use a RESIDENTIAL proxy. Reachability varies per IP, so some profiles in a large list may return an auth/rate-limit error row on a given run. Each profile fetch retries with exponential backoff, jitter, and a fresh proxy IP per retry to smooth this out, but reachability is never guaranteed to be 100 %.
  • Only the listed known aggregator domains are followed, and only one hop of their destination links — the crawl is deliberately bounded by page count, a per-page timeout, and an overall time budget.
  • Server-rendered vs JS-rendered aggregators. Link-in-bio unwrapping reads the HTML that the server returns. Server-rendered aggregators (Linktree, Beacons, Carrd-class, and most in the list) expose their links and contacts in that HTML and are unwrapped fully. A minority of aggregators (for example visitstore.bio, empli.fi) render their links entirely client-side with JavaScript; an HTTP-only fetch of those returns an empty app shell. The actor fetches them, detects the JS shell, and records an honest linkInBioNote ("requires a headless browser render") rather than inventing contacts. No headless browser is bundled, so those pages yield no contacts by design.

Output

One dataset row per input profile. Successful enriched rows are billed via the row_result pay-per-event; error rows (invalid input, profile not found, auth/rate-limit failures) are not charged. Open the dataset's default table view to see every column, including linkInBioContacts and pagesScanned.

Compliance

Scrapes only publicly available data. Respect Instagram's Terms of Service and applicable data-protection law (GDPR/CCPA) when processing contact data.