Instagram Profile Phone & Contact Scraper
Pricing
$19.99/month + usage
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
Maintained by CommunityActor stats
0
Bookmarked
22
Total users
3
Monthly active users
12 days ago
Last modified
Categories
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(fromwa.melinks),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 — pluspagesScanned, the number of pages successfully fetched for that profile, andlinkInBioNote, 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(contactfor an enriched row,errorfor a failure row),inputType,scrapedAt(ISO-8601 UTC), anderror(one row per input, always — invalid inputs and unreachable profiles produce a row withtype: "error"anderrorset 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
| Field | Type | Description |
|---|---|---|
profiles | array | Usernames / @handles / profile URLs / user IDs / post URLs to enrich. Required. |
unwrapLinkInBio | boolean | Follow link aggregators + one hop and scan for contacts. Default true. |
maxLinkInBioPages | integer | Max pages fetched per profile while unwrapping (0–25). Default 5. |
linkInBioTimeoutSec | integer | Per-page fetch timeout in seconds (3–60). Default 15. |
linkInBioTotalBudgetSec | integer | Overall wall-clock budget for one profile's unwrap (0 = auto, up to 300). Default 0 (auto). |
country | string | Optional. Default region used only to parse local (non-+) phone numbers into E.164. |
hasPhoneOnly | boolean | Emit only profiles with a phone (business / bio / WhatsApp / link-in-bio). |
hasEmailOnly | boolean | Emit only profiles with an email (business / bio / link-in-bio). |
businessOnly | boolean | Emit only business accounts. |
verifiedOnly | boolean | Emit only verified accounts. |
minFollowers | integer | Emit only profiles with at least this many followers. |
concurrency, maxRetries, delayMs, proxyConfiguration | — | Advanced 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
- 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.
- The username is fetched through the
web_profile_infoengine: an Instagram HTML page bootstrapsapp_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. - Contact fields are extracted from the payload; bio text is scanned for emails, phones (validated), WhatsApp and Linktree links.
- 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
businessPhoneandbusinessEmailare frequently auth-gated by Instagram for logged-out requests: many public business accounts returnnullfor 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 honestlinkInBioNote("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.