๐ Instagram Contact & Lead Scraper
Pricing
from $4.99 / 1,000 results
๐ Instagram Contact & Lead 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
from $4.99 / 1,000 results
Rating
0.0
(0)
Developer
API Empire
Maintained by CommunityActor stats
0
Bookmarked
107
Total users
14
Monthly active users
8 hours ago
Last modified
Categories
Share
Instagram Contact Scraper โ Extract Phones, Emails and Leads as JSON
Instagram Contact Scraper turns usernames, profile URLs, post/reel URLs, numeric user IDs, or Google-SERP-discovered profiles into structured contact leads, pulling each one straight from Instagram's own web_profile_info payload. Every lead carries authoritative business phone and email, bio-extracted emails/phones/WhatsApp/Linktree, and profile attributes โ as typed, normalized JSON, no HTML and no selectors to parse. Phone numbers are validated to E.164 format, so follower counts, prices and post IDs are never mistaken for a phone number. Read on for exact input parameters, every output field, and how pay-per-event billing works.
What is Instagram Contact Scraper?
Instagram Contact Scraper is an Apify Actor that enriches Instagram targets โ usernames, profile URLs, post/reel URLs, user IDs, or keyword-discovered profiles โ into one contact-lead row each, using Instagram's authoritative unauthenticated web_profile_info endpoint rather than regex-guessing a rendered page. No Instagram account or login is required to run it: the enrichment requests are unauthenticated, bootstrapping a fresh app_id/csrf_token handshake from the public profile HTML on every attempt.
- Enrich direct usernames,
@handles, profile URLs, post/reel URLs, and numeric user IDs - Discover new candidate profiles by keyword via built-in Google-SERP search
- Extract authoritative business phone/email plus bio-extracted phones, emails, WhatsApp links and Linktree URLs
- Filter leads by phone/email presence, business or verified status, and minimum followers
- Export results as JSON or CSV straight from the Apify dataset
What data does Instagram Contact Scraper collect?
Every lead row blends three kinds of data: authoritative and text-extracted contact details, the underlying profile's identity attributes, and โ for keyword runs โ the Google-SERP context that surfaced the profile.
| Data Type | Key Fields | JSON Field Names |
|---|---|---|
| Contact data | Authoritative business phone/email, E.164-normalized phone, bio-extracted emails/phones, WhatsApp, Linktree | businessPhone, phoneE164, phoneCountry, businessEmail, emailDomain, emailsFromText, phonesFromText, whatsapp, linktree |
| Profile data | Identity, bio, verification/business flags, follower count, external link | username, userId, fullName, profileUrl, biography, categoryName, isBusinessAccount, isVerified, isPrivate, followerCount, externalUrl, bioLinks |
| Discovery data | Google-SERP keyword and result context, present only in discovery mode | keyword, serpTitle, serpSnippet, serpUrl, mode, inputType |
Need more Instagram data?
If you also need a profile's tagged posts, mentions or comment threads rather than contact details, API-Empire's Instagram Tagged & Mentions Posts Scraper covers the tagged feed, a profile's own posts and a mentions approximation, including comments. Run the two Actors side by side when a lead list needs both contact data and content history for the same accounts.
How does Instagram Contact Scraper differ from the official Instagram API?
Meta's Instagram Graph API is built for managing accounts you own or that explicitly authorize your app โ it is not a lookup tool for arbitrary public profiles. Instagram Contact Scraper enriches any public username, profile URL, post URL or user ID you provide, without requiring the profile owner's authorization.
| Feature | Instagram Graph API | Instagram Contact Scraper |
|---|---|---|
| Scope of accessible profiles | Only Instagram professional accounts that have explicitly connected your app via OAuth | Any public Instagram profile, post/reel owner, or user ID you supply |
| Approval process | Requires Meta App Review and, for many permissions, business verification before production access | No approval process โ start a run from the Apify Console with an input list |
| Business contact fields | Not exposed for third-party profiles you do not manage | Returns businessPhone / businessEmail exactly as Instagram serves them, unauthenticated |
| Lead discovery | No keyword-based profile discovery endpoint | Built-in Google-SERP keyword discovery via searchKeywords |
| Setup requirement | Meta developer account, registered app, OAuth flow, access token | Apify account only โ no Instagram login, no Meta app |
| Output shape | Raw paginated Graph API JSON you parse yourself | One flat, typed lead row per target, ready for CSV or JSON export |
The Graph API is the right choice when you manage the Instagram accounts in question and need first-party insights or content management. Instagram Contact Scraper is the right choice when you need contact data for public profiles you don't own or manage โ lead generation, outreach lists, and market research.
Why do developers and teams scrape Instagram for contact data?
For AI engineers and agent builders
An agent tasked with "find and qualify Instagram business leads for X" can call this Actor as a tool, pass in usernames or searchKeywords, and read businessPhone, businessEmail, categoryName and followerCount straight into its context or a vector store โ no HTML parsing step between the tool call and the LLM. Because every row carries the same fixed keys (null when unavailable), an agent's downstream logic doesn't need defensive parsing for missing fields.
For marketers and sales teams
Sales teams building outbound lists for a niche (e.g. "real estate agent london") can set searchKeywords and country, then apply hasPhoneOnly or hasEmailOnly so the dataset only contains leads with a reachable channel. businessOnly and minFollowers narrow the list to accounts worth prioritizing before the first outreach message is ever written.
For researchers and analysts
Academic and market researchers studying how a set of public accounts self-present โ category, verification, business status, follower count โ can feed a fixed list of usernames and compare isBusinessAccount, isVerified and categoryName across the set. The Actor returns only what Instagram serves unauthenticated for public accounts; it does not access private profiles.
For developers building data products
Teams building a lead-enrichment product on top of Apify can schedule this Actor against a growing usernames list, pull results with apify_client, and merge phoneE164 / businessEmail into their own CRM schema, using scrapedAt to track when each lead was last refreshed.
How to scrape Instagram for contact leads (step by step)
- Open Instagram Contact Scraper on its Apify Store listing and open the Console.
- Provide at least one of
usernames(direct targets) orsearchKeywords(keyword discovery) โ the run raises a validation error if both are empty. - Set the lead filters that matter โ
hasPhoneOnly,hasEmailOnly,businessOnly,verifiedOnly,minFollowersโ and pick acountryto localize discovery and phone parsing. - Start the run.
- Download the dataset as JSON or CSV from the Apify Console, or pull it via the API.
What to do when Instagram changes its structure
Instagram Contact Scraper is maintained, and the output schema โ the same fixed set of keys on every row โ stays stable across updates, so integrations built against these field names keep working without code changes on your end.
โฌ๏ธ Input
None of the 13 parameters are required individually, but the run itself requires at least one of usernames or searchKeywords โ an empty run raises a validation error before any request is made.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
usernames | No | array | Direct targets: plain usernames, @handles, profile URLs, post/reel URLs (owner resolved and enriched, emitted as postUrl), or numeric user IDs. Duplicates removed case-insensitively. | ["nike", "@natgeo", "https://www.instagram.com/p/C123abcD/"] |
searchKeywords | No | array | Optional Google-SERP discovery. Each keyword runs site:instagram.com "<dial code>" "<keyword>"; matching profiles are enriched exactly like direct targets. | ["real estate agent"] |
maxProfiles | No | integer | Max candidate profiles discovered per keyword (does not limit direct targets). Minimum 1, maximum 500, default 20. | 20 |
country | No | string | One of 193 country/dial-code pairs. Localizes the SERP query and parses local (non-+) phone numbers into E.164. Default "United Kingdom (+44)". | "United States (+1)" |
hasPhoneOnly | No | boolean | Emit only leads with a business phone or a valid phone extracted from the bio. Default false. | true |
hasEmailOnly | No | boolean | Emit only leads with a business email or an email extracted from the bio. Default false. | true |
businessOnly | No | boolean | Emit only profiles where is_business_account is true. Default false. | true |
verifiedOnly | No | boolean | Emit only verified (blue-tick) profiles. Default false. | false |
minFollowers | No | integer | Emit only profiles with at least this many followers. Minimum 0 (no minimum), default 0. | 1000 |
concurrency | No | integer | Profiles enriched in parallel, each on a fresh proxy IP and fresh Chrome-TLS client. Minimum 1, maximum 10, default 2. | 2 |
maxRetries | No | integer | Retry attempts per profile before recording an error row. Minimum 1, maximum 10, default 3. | 3 |
delayMs | No | integer | Base delay (ms) used for per-profile jitter and retry back-off. Minimum 0, maximum 60000, default 2000. | 2000 |
proxyConfiguration | No | object | Proxy for enrichment requests. RESIDENTIAL strongly recommended โ Instagram blocks most datacenter IPs. A fresh IP is used per profile. SERP discovery always uses Apify's GOOGLE_SERP proxy group regardless of this setting. | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} |
Example JSON input
{"usernames": ["nike", "@natgeo", "https://www.instagram.com/p/C123abcD/"],"searchKeywords": ["real estate agent"],"maxProfiles": 20,"country": "United Kingdom (+44)","hasPhoneOnly": false,"hasEmailOnly": false,"businessOnly": false,"verifiedOnly": false,"minFollowers": 0,"concurrency": 2,"maxRetries": 3,"delayMs": 2000,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
Common pitfall: leaving both usernames and searchKeywords empty ends the run immediately with a validation error โ provide at least one before starting.
โฌ๏ธ Output
Every result is typed, normalized JSON โ one row per target, success or error, with the identical set of keys either way (unavailable fields are null, never a fabricated zero). Export as JSON or CSV directly from the Apify dataset. The default dataset view surfaces 31 of these fields as table columns; the pushed row additionally carries inputRaw (the original input string), which the view does not display but which is present in the raw dataset.
Scraped lead
{"inputRaw": "nike","inputType": "username","mode": "direct","username": "nike","userId": "13460080","fullName": "Nike","profileUrl": "https://www.instagram.com/nike","postUrl": null,"postShortcode": null,"keyword": null,"businessPhone": null,"phoneE164": null,"phoneCountry": null,"businessEmail": null,"emailDomain": null,"externalUrl": "https://www.nike.com/","whatsapp": null,"linktree": null,"emailsFromText": [],"phonesFromText": [],"bioLinks": [{ "title": "Shop", "url": "https://www.nike.com/" }],"biography": "Just Do It.","categoryName": "Athletic apparel company","isBusinessAccount": true,"isVerified": true,"isPrivate": false,"followerCount": 302000000,"serpTitle": null,"serpSnippet": null,"serpUrl": null,"scrapedAt": "2026-07-26T12:00:00Z","error": null}
An error row keeps the same 32 keys, with contact and profile fields null and error set to a message such as "Profile not found", "could not resolve a username to enrich", or a timeout/auth message from the enrichment layer.
How does Instagram Contact Scraper compare to other Instagram scrapers?
| Feature | Instagram Contact Scraper | Generic alternative |
|---|---|---|
| Input targeting | Username, @handle, profile URL, post/reel URL, user ID, or SERP keyword discovery in one run | caprolok/instagram-leads-generator's documented input is a required keyword plus optional location and max_leads โ no direct username, profile URL or post URL targeting, as observed on the Apify Store on 2026-07-26 |
| Phone extraction | Authoritative businessPhone/phoneE164 plus E.164-validated bio/SERP phones | caprolok/instagram-leads-generator's documented output fields are emails, keyword, name, user_link, user_thumbnail, username, following, posts โ no phone field is documented, as observed on the Apify Store on 2026-07-26 |
| Platform focus | Instagram-only, built directly on Instagram's own web_profile_info payload | ryanclinton/website-contact-scraper and automation-lab/website-contact-finder are website/domain-first contact finders, not Instagram profile scrapers, as observed on the Apify Store on 2026-07-26 |
| False-positive rejection | Phones parsed and validated with phonenumbers/libphonenumber rules; prices, follower counts, years and post IDs are rejected rather than reported as phones | Not documented by the three competitors reviewed |
| Row-level error handling | Every input yields exactly one row โ success or a filled error field with all other keys still present | Not documented by the three competitors reviewed |
If you're building an AI agent or RAG pipeline, the input-targeting and output-consistency rows are the decision-maker โ parsing an inconsistent or HTML-based response inside an agent loop is a reliability failure mode, not a feature.
How many leads can you scrape with Instagram Contact Scraper?
There is no hard cap in the Actor itself on the number of direct usernames you list. Discovery mode is bounded by maxProfiles per keyword โ minimum 1, maximum 500, default 20 โ and the SERP crawler stops after 10 result pages or 3 consecutive empty pages per keyword, whichever comes first, so each keyword can surface at most roughly 100 raw Google results before candidates are filtered down to Instagram profile/post URLs. Direct targets and keyword-discovered targets are globally deduplicated by resolved username, user ID, or URL before enrichment, so the same profile is never billed twice within one run.
Integrate Instagram Contact Scraper and automate your workflow
Instagram Contact Scraper works with any language or tool that can send an HTTP request through the Apify API.
REST API integration
from apify_client import ApifyClientclient = ApifyClient("<APIFY_API_TOKEN>")run = client.actor("instagram-contact-lead-scraper").call(run_input={"usernames": ["nike", "@natgeo"],"searchKeywords": ["real estate agent"],"country": "United Kingdom (+44)","hasEmailOnly": True,})for lead in client.dataset(run["defaultDatasetId"]).iterate_items():print(lead["username"], lead["phoneE164"], lead["businessEmail"])
Works in Python, Node.js, Go, Ruby, cURL โ any HTTP client authenticated with an Apify API token.
MCP for AI agents
Instagram Contact Scraper is reachable through Apify's own MCP gateway, which exposes any Actor as a callable tool. Point an MCP-compatible client (Claude Desktop, Claude Code, or any MCP client) at https://mcp.apify.com with an Authorization: Bearer <APIFY_TOKEN> header, or run it locally via npx @apify/actors-mcp-server with the APIFY_TOKEN environment variable set, then call the instagram-contact-lead-scraper Actor as a tool.
Automation platforms (n8n, Make, LangChain)
Apify's official n8n node and Make module let you add an "Apify" step, select Run Actor, and target instagram-contact-lead-scraper by ID โ no custom code needed to fetch leads into a downstream workflow. LangChain and LlamaIndex both ship an Apify Actor tool/loader (langchain_apify / Apify's LlamaIndex integration) that calls an Actor by ID and returns its dataset items directly into a chain or agent.
Is it legal to scrape Instagram contact data?
Yes โ Instagram Contact Scraper only accesses and returns data that Instagram's own unauthenticated web_profile_info endpoint serves for public profiles; private accounts are never accessed, and a private target returns a row with isPrivate: true and limited fields rather than bypassed data. Because the output includes personal contact details (phone numbers, emails) tied to identifiable individuals or businesses, GDPR and CCPA โ and any lawful-basis requirement for storing and using that personal data โ apply to how you use the results, not to the act of reading a public profile. Consult legal counsel for commercial use cases involving bulk personal data.
โ Frequently asked questions
Does Instagram Contact Scraper work without an Instagram account?
Yes. Enrichment requests are unauthenticated โ the Actor bootstraps a fresh app_id/csrf_token handshake from each target's public profile HTML rather than logging in. No Instagram account, session cookie, or password is ever required.
How often is the scraped data updated?
Every run fetches live data directly from Instagram at request time โ nothing is cached between runs. Each target is enriched fresh from the current web_profile_info response.
What happens if a profile doesn't exist or is private?
A non-existent username or user ID returns an error row with error set to "Profile not found" (or a similar message) and all contact/profile fields null. A private profile still returns a normal row with isPrivate: true and whatever limited public fields Instagram exposes for it โ private data is never bypassed.
Can I scrape private Instagram content?
No. Only publicly accessible profile data returned by Instagram's own unauthenticated endpoint is collected. Private accounts are represented by an isPrivate: true row with limited fields, never with their gated content.
How is Instagram Contact Scraper billed?
It uses Apify's pay-per-event pricing, charged under a single row_result event โ each row pushed to the dataset (a successful lead or an error row) charges one row_result event. Rows removed by your filters (hasPhoneOnly, hasEmailOnly, businessOnly, verifiedOnly, minFollowers) are dropped before being pushed and are not charged. Exact per-event pricing is set on the Actor's Apify Store page.
Does Instagram Contact Scraper work for AI agent workflows and LLM pipelines?
Yes โ it's callable as an Apify Actor through the REST API or Apify's MCP gateway (mcp.apify.com or @apify/actors-mcp-server), so any agent framework can invoke it as a tool. Every response is typed JSON with a fixed key set, so there's no HTML or free text to parse before passing results to an LLM.
How does Instagram Contact Scraper handle Instagram's anti-bot system?
Each enrichment attempt runs on a fresh proxy IP (residential recommended) with a fresh Chrome-TLS-impersonation client and a fresh app_id/csrf_token bootstrap handshake, because Instagram's logged-out anti-bot response varies per IP rather than per account. Failed attempts retry with exponential backoff and jitter, up to maxRetries, and a per-profile time budget bounds how long any single target can stall the batch.
How does Instagram Contact Scraper compare to other Instagram scrapers?
caprolok/instagram-leads-generator, as observed on the Apify Store on 2026-07-26, targets by keyword/location only and documents no direct-username or phone-number output. ryanclinton/website-contact-scraper and automation-lab/website-contact-finder, also as observed on 2026-07-26, are website/domain-first contact finders rather than Instagram profile scrapers. Instagram Contact Scraper is the only one of the three that combines direct username/profile/post/user-ID targeting, SERP keyword discovery, and authoritative Instagram business phone/email in one Actor.
Does Instagram Contact Scraper return data in a format LLMs can use directly?
Yes. Typed, normalized JSON with stable field names on every row. Pass it directly into an LLM's context window, index it into a vector store, or route it through an agent tool call โ no parsing step required.
Can I use Instagram Contact Scraper without managing proxies?
Yes. Enrichment uses Apify Proxy โ the proxyConfiguration input is prefilled with the RESIDENTIAL group, and a fresh IP is assigned per profile automatically. SERP discovery always uses Apify's GOOGLE_SERP proxy group regardless of your proxy settings. You don't need your own proxy infrastructure.
What happens when Instagram changes its structure or blocks the scraper?
The Actor is maintained, and its output schema โ the fixed set of field names and types on every row โ stays stable, so downstream integrations don't need code changes on your end when Instagram's page structure shifts.
๐ฌ Your feedback
Found a bug or missing a field? We want to know. Open an issue on this Actor's Issues tab on the Apify Store, or reach out through the Apify Console โ reports are how the enrichment logic and the underlying web_profile_info extraction stay current.