πΈ Instagram B2B Lead & Contact Scraper
Pricing
$19.99/month + usage
πΈ Instagram B2B Lead & Contact Scraper
π± Instagram B2B Phone Number Scraper finds publicly listed business phone numbers on Instagram Business profiles for compliant lead gen. π Export to CSV/CRM, power sales & marketing outreach. β Uses only public data and consent-first workflows.
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
Scraper Engine
Maintained by CommunityActor stats
1
Bookmarked
9
Total users
3
Monthly active users
15 days ago
Last modified
Categories
Share
Instagram B2B Lead Scraper β Emails, Phones and Business Contacts
Instagram B2B Lead & Contact Scraper turns a keyword search or a list of @handles / profile URLs into structured B2B leads, pulling each one from Instagram's own web_profile_info payload plus a genuine email and validated phone extracted from the bio and linked website. Every row carries username, email, phoneE164, category, followerCount and a 0β100 leadScore β typed JSON, no HTML to parse. Phone numbers are checked with the phonenumbers library, so a follower count or user ID is 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 B2B Lead & Contact Scraper?
Instagram B2B Lead & Contact Scraper is an Apify Actor that discovers Instagram business and creator accounts β by Google-indexed keyword search or by direct @handle / profile URL β and enriches each one into a lead row with identity, business attributes, and a genuine contact channel. No Instagram account or login is required to run it: profile enrichment calls Instagram's web_profile_info endpoint unauthenticated by default. Supplying an optional sessionId cookie unlocks Instagram's structured public_email / business_email / public_phone_number fields, which Instagram strips from logged-out responses. It's built for sales teams, agencies and marketers building outreach lists, and for developers wiring lead data into a CRM or agent pipeline.
What Instagram profile data is publicly available to scrape without login?
Instagram serves identity, bio and metric fields to any unauthenticated web_profile_info request, but strips its structured contact fields unless the caller is logged in.
| Data Category | Publicly available (no login) | Restricted |
|---|---|---|
| Username, full name, canonical profile URL | Yes | β |
| Biography text and linked external URL | Yes | β |
| Category, city, verified / business account flags | Yes | β |
| Follower, following and media counts | Yes | β |
public_email, business_email, public_phone_number, contact_phone_number | No | Only returned to a request carrying a logged-in Instagram sessionId cookie |
| Full follower/following lists, Stories, Direct Messages | No | Not returned by this Actor at any setting β requires the account owner's own login |
| Private-account content | No | Private profiles return no enrichable data |
Instagram B2B Lead & Contact Scraper only returns what a logged-out visitor (or, if you provide your own sessionId, a logged-in one) can see β nothing from Stories, DMs, or a private account's gated content.
What data can I extract with Instagram B2B Lead & Contact Scraper?
Every lead row blends identity data pulled from web_profile_info, a unified contact record built from up to three sources, and the discovery context that surfaced the row.
| Data Type | What it covers | JSON Field Names |
|---|---|---|
| Identity & profile data | Username, name, canonical URL, bio, category, city, external link, post/reel identifiers | type, username, fullName, url, shortcode, title, description, category, cityName, biography, externalUrl, externalUrlResolved, profilePicUrl, userId |
| Contact & lead data | Best unified email/phone, every raw contact source with its confidence, business flags, reach, and the derived lead score | email, emailSource, publicEmail, businessEmail, snippetEmail, emailDomain, emailType, phoneE164, phoneNational, phoneRegion, phoneSource, phoneConfidence, businessContactMethod, contactSource, contactConfidence, isBusinessAccount, isProfessional, isVerified, isPrivate, followerCount, followingCount, mediaCount, leadScore, hasContact |
| Discovery & run metadata | Which keyword or direct input surfaced the row, its Google rank, and whether enrichment succeeded | keyword, serpRank, serpPage, inputMode, country, dialCode, profileFetched, scrapedAt |
Identity and profile fields
username, fullName, url and userId identify the account; category and cityName come straight from Instagram's business profile fields; biography and externalUrl carry the raw bio text and the linked site, with externalUrlResolved holding the actual page the Actor landed on after expanding a Linktree/Beacons-style aggregator. shortcode, title and description are populated only for Posts/Reels discovered via search (Google's title and snippet text for that result). The Actor pushes 46 fields per row; the dataset's default view surfaces 38 of them as table columns. shortcode, title, description, inputMode, dialCode, isProfessional, isPrivate and phoneNational are written to every row but are not shown as view columns by default β open a row's JSON or pull it via the API/apify_client to see them.
Contact and lead fields
email and phoneE164/phoneNational are the best contact found across sources, resolved in priority order β an authenticated session's public_email/business_email first, then a bio-extracted contact, then one harvested from the external site, then (email only) a SERP-snippet match. emailSource and phoneSource record which of profile_api, bio, external_site or serp_snippet won; phoneConfidence is high for an authenticated-session number, medium for an international-format bio/site number or a tel: link, low for a national-format number matched to the selected country's region. contactSource concatenates the winning email and phone sources (e.g. bio+external_site); contactConfidence is high if either source is profile_api, medium if either is bio or external_site, else low. leadScore (0β100) is a simple points sum: +30 for any email, +30 for a validated phone, +15 for a business/professional account, +10 for verified, plus +15/+10/+5 for 100k+/10k+/1k+ followers, capped at 100. hasContact is true whenever any email or phone field is populated.
Discovery and run metadata
keyword and serpRank/serpPage record which search term and Google position produced the row (null for direct @handle/URL input); inputMode is "search" or "direct". country and dialCode echo the selected country and its dial code. profileFetched is true only when web_profile_info returned a real profile record.
π€ Add-on: Need additional Instagram data?
If a lead list also needs a profile's posted content or reach signals, Scraper-Engine's Instagram Reel Virality Intelligence Scraper and Instagram Tagged Posts Scraper (Scrape Comments, Media & Metadata) cover engagement and post-level detail for the same accounts. For a broader follower/following graph on a shortlisted account, run Instagram Followers And Following Scraper with AI Enrichment alongside this Actor.
How does Instagram B2B Lead & Contact Scraper differ from the official Instagram API?
Meta's Instagram Graph API is built for managing Instagram professional accounts that have explicitly connected your app through OAuth β it is not a lookup tool for arbitrary public accounts you don't own. Instagram B2B Lead & Contact Scraper enriches any public username, @handle or profile URL you supply, or discovers new candidates by keyword, without the profile owner's authorization.
| Feature | Instagram Graph API | Instagram B2B Lead & Contact Scraper |
|---|---|---|
| Scope of accessible profiles | Only professional accounts that have connected your app via OAuth | Any public Instagram profile, post or reel you supply, or that a keyword search surfaces |
| Approval process | Requires Meta App Review and, for many permissions, business verification | No approval process β start a run from the Apify Console |
| Lead discovery | No keyword-based profile discovery endpoint | Built-in Google-SERP discovery via keywords |
| Setup requirement | Meta developer account, registered app, OAuth flow, access token | Apify account only; an optional sessionId cookie to raise contact yield |
| Output shape | Raw paginated Graph API JSON you parse yourself | One flat, typed lead row per target, ready for JSON or CSV export |
The Graph API is the right choice when you manage the accounts in question and need first-party account insights. Instagram B2B Lead & Contact Scraper is the right choice when you need contact data for public accounts you don't own β lead generation, outreach lists, and prospecting.
How to use Instagram B2B Lead & Contact Scraper
Get leads flowing in a few minutes, no Instagram login required to start.
- Open Instagram B2B Lead & Contact Scraper on its Apify Store listing and open the Console.
- Provide at least one entry in
keywordsβ a bare word/phrase runs a Google search, while an@handleorinstagram.comprofile URL is fetched directly.countryis required but pre-filled with"United Kingdom (+44)", so change it only if you want a different dial code and phone region. - Set the filters that matter β
requireEmail,requirePhone,onlyBusinessAccounts,minFollowers/maxFollowersβ and decide whetherfollowBioLinksshould follow external sites for extra contacts. - Start the run.
- Download the dataset as JSON or CSV from the Apify Console, or pull it with
apify_client.
How to scale to bulk lead extraction
keywords is an array, so one run can mix any number of search phrases and direct @handles/URLs β each keyword is paginated independently up to maxResultsPerKeyword, and maxResults caps the total rows emitted across the whole run. There's no separate bulk-input mode: add more entries to the same keywords array rather than chaining runs.
What can you do with Instagram B2B lead data?
- π A sales development rep building an outbound list sets
keywordsto a niche + city (e.g. "personal trainer London") andonlyBusinessAccountsto true, then filters the dataset onhasContactandleadScoreto prioritize the accounts with the highest-confidence contact before the first outreach message. - π’ A marketing agency prospecting for new clients uses
categoryandcityNameto segment leads by vertical and location, then readsemailTypeto route freemail-domain leads differently from business-domain ones. - π€ An AI agent or RAG pipeline calls this Actor as a tool with
keywordsor a fixed@handlelist, and readsemail,phoneE164,biographyandleadScorestraight into its context β the fixed key set means no defensive parsing for missing fields. - π A recruiter or talent scout searches a niche keyword and filters on
minFollowersto shortlist accounts with real reach before reviewingbiographyandexternalUrlResolvedfor a personal fit. - π A market researcher studying a vertical's self-presentation feeds a fixed list of
@handlesand comparesisBusinessAccount,isVerifiedandfollowerCountacross the set, using only what Instagram serves for public accounts.
β οΈ How does Instagram B2B Lead & Contact Scraper handle rate limits and blocking?
Google discovery and profile enrichment run on separate Apify Proxy groups: SERP requests always use the GOOGLE_SERP group regardless of your proxyConfiguration, while profile and contact-page fetches use the group you configure (defaulting to RESIDENTIAL, since Instagram TLS-fingerprint-blocks most datacenter IPs). Every enrichment and contact-harvest request goes through curl_cffi with Chrome impersonation. Profile fetches run with bounded concurrency (4 at a time) rather than all at once. A SERP page that looks blocked or returns zero results is retried with a fresh proxy URL up to 3 consecutive times before the Actor moves on to the next keyword; a profile whose web_profile_info response has no user data is recorded as soft-blocked and left with null profile fields rather than a guessed value. Contact harvesting from an external site is bounded: the Actor fetches the linked URL once, follows one outbound link if it's a link-in-bio aggregator (Linktree, Beacons and similar), and tries up to five candidate contact-page paths (/contact, /contact-us, /contacts, /kontakt, /about) on the resolved domain, stopping as soon as both an email and a phone are found.
β¬οΈ Input
country is the only schema-required parameter, but it ships with a default ("United Kingdom (+44)"), so a run only fails if keywords is also left empty β the Actor logs "No usable input" and exits without discovering anything.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
keywords | No | array | Each entry is a search keyword (builds the Google dork site:instagram.com "<dialcode>" "<keyword>") or a direct profile reference β an @handle or an instagram.com profile URL. | ["real estate agency", "@nike"] |
country | Yes | string (enum, 193 values) | The dial code added to the Google dork and used as the region for validating national-format snippet/bio phone numbers. Authenticated web_profile_info phone numbers carry their own country code and are validated as-is. Default "United Kingdom (+44)". | "United States (+1)" |
resultType | No | string (enum) | Which Instagram result types to keep: Profiles (default, recommended β enrichable), All, Posts (/p/, snippet only), Reels (/reel/, snippet only). | "Profiles" |
fetchProfileInfo | No | boolean | Fetch each discovered profile's web_profile_info for genuine category/city/followers/external URL/biography/verified/business data. Default true. | true |
followBioLinks | No | boolean | Extract email/phone from the bio and follow the external URL (aggregators expanded, /contact tried) to harvest a contact. Default true. | true |
sessionId | No | string (secret) | Your logged-in Instagram sessionid cookie. When set, web_profile_info is called authenticated, populating public_email/business_email/public_phone_number. Use a throwaway account; treated as a credential. | "58012345678%3A..." |
maxResultsPerKeyword | No | integer (1β10000, default 20) | Stop paginating a keyword's Google results after this many unique candidate rows are discovered, before enrichment/filters. | 20 |
maxResults | No | integer (min 0, default 0) | Hard cap on total rows emitted across all keywords + profiles in the run. 0 = unlimited. | 100 |
requireEmail | No | boolean | Emit only rows with a genuine public/business/snippet email. Default false. | true |
requirePhone | No | boolean | Emit only rows with a genuine, phonenumbers-validated phone. Default false. | false |
onlyBusinessAccounts | No | boolean | Emit only accounts flagged is_business_account or is_professional_account. Requires fetchProfileInfo. Default false. | true |
minFollowers | No | integer (min 0, default 0) | Drop profiles with fewer followers than this. 0 = no minimum. Requires fetchProfileInfo. | 1000 |
maxFollowers | No | integer (min 0, default 0) | Drop profiles with more followers than this. 0 = no maximum. Requires fetchProfileInfo. | 0 |
proxyConfiguration | No | object (proxy editor) | Proxy for web_profile_info and contact-page fetches. Default {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}. SERP fetches always use GOOGLE_SERP regardless of this setting. | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} |
Example input
{"keywords": ["real estate agency", "@nike"],"country": "United Kingdom (+44)","resultType": "Profiles","fetchProfileInfo": true,"followBioLinks": true,"maxResultsPerKeyword": 20,"maxResults": 0,"requireEmail": false,"requirePhone": false,"onlyBusinessAccounts": true,"minFollowers": 1000,"maxFollowers": 0,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
Common pitfall: leaving keywords completely empty ends the run immediately with a "No usable input" log message β country alone doesn't give the Actor anything to search or fetch.
β¬οΈ Output
Every result is typed, normalized JSON β one row per discovered or directly-supplied target. Fields the Actor couldn't resolve are null, never a guessed value. Export as JSON or CSV directly from the Apify dataset, or read the identical data through the API. Enriched profile rows are additionally mirrored into a per-run profiles-<runId> dataset.
Example output
{"type": "profile","username": "exampleagency","fullName": "Example Agency","url": "https://www.instagram.com/exampleagency/","isBusinessAccount": true,"isProfessional": false,"isVerified": false,"isPrivate": false,"category": "Real Estate Agent","cityName": "London","email": "hello@exampleagency.com","emailSource": "bio","publicEmail": null,"businessEmail": null,"snippetEmail": null,"emailDomain": "exampleagency.com","emailType": "business","phoneE164": "+442071234567","phoneNational": "020 7123 4567","phoneRegion": "GB","phoneSource": "external_site","phoneConfidence": "medium","businessContactMethod": null,"contactSource": "bio+external_site","contactConfidence": "medium","externalUrl": "https://exampleagency.com","externalUrlResolved": "https://exampleagency.com/contact","followerCount": 4210,"followingCount": 812,"mediaCount": 340,"biography": "Chartered surveyors and estate agents in London.","profilePicUrl": "https://instagram.fxyz1-1.fna.fbcdn.net/v/...","userId": "7841203099","leadScore": 75,"hasContact": true,"profileFetched": true,"keyword": "real estate agency","serpRank": 3,"serpPage": 1,"country": "United Kingdom","scrapedAt": "2026-07-26T10:00:00Z"}
How does it work?
For each search keyword, the Actor builds a Google dork (site:instagram.com "<dialcode>" "<keyword>") and paginates results through the Apify GOOGLE_SERP proxy; @handles and profile URLs skip Google and are queued directly. Results are de-duplicated across pages and keywords on the canonical username or URL. Each unique profile is then fetched from Instagram's web_profile_info endpoint through a Chrome-impersonating client routed over RESIDENTIAL proxy β soft-blocked accounts are left with null profile fields rather than invented data. For each enriched profile, the Actor extracts a genuine contact from the biography and, when enabled, from the linked external site, expanding link-in-bio aggregators along the way. Every phone candidate is validated with the phonenumbers library before it's accepted. The output schema β the same fixed set of keys on every row β stays stable regardless of changes to Instagram's page layout, since the Actor reads a JSON API response, not rendered HTML.
Integrations
Instagram B2B Lead & Contact Scraper works with any language or tool that can call the Apify API.
Calling Instagram B2B Lead & Contact Scraper programmatically
from apify_client import ApifyClientclient = ApifyClient("<APIFY_API_TOKEN>")run = client.actor("instagram-b2b-lead-contact-scraper").call(run_input={"keywords": ["real estate agency", "@nike"],"country": "United Kingdom (+44)","onlyBusinessAccounts": True,})for lead in client.dataset(run["defaultDatasetId"]).iterate_items():print(lead["username"], lead["email"], lead["phoneE164"])
Works in Go, Ruby, Node.js, cURL β any language that can make an HTTP request.
MCP integration for AI agents
Instagram B2B Lead & Contact Scraper is reachable through Apify's 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 npx @apify/actors-mcp-server locally with APIFY_TOKEN set, then call instagram-b2b-lead-contact-scraper as a tool.
No-code tools (n8n, Make, LangChain)
In n8n or Make, add an Apify step, choose Run Actor, and target instagram-b2b-lead-contact-scraper β no custom code needed to pull leads into a downstream workflow. LangChain and LlamaIndex both ship an Apify Actor tool/loader that calls an Actor by ID and returns its dataset items directly into a chain or agent.
Is it legal to scrape Instagram B2B leads?
Scraping publicly available data is generally lawful, and Instagram B2B Lead & Contact Scraper only accesses and returns data Instagram's own web_profile_info endpoint serves β logged-out by default, or logged-in only when you supply your own sessionId; private accounts are never bypassed. Because the output includes personal contact details (emails, phone numbers) tied to identifiable individuals or businesses, GDPR and CCPA β and any lawful-basis requirement for storing and using that personal data β govern how you use the results, not the act of reading a public profile or bio. Consult legal counsel before bulk-storing or using this data for outreach at scale.
β Frequently asked questions
What Instagram lead fields does Instagram B2B Lead & Contact Scraper return?
The top fields are username, email, phoneE164, category and leadScore β see the data fields section above for the full list of 46 fields the Actor pushes per row.
Does Instagram B2B Lead & Contact Scraper require an Instagram account or login?
No. Profile enrichment calls web_profile_info unauthenticated by default. Supplying your own sessionId cookie is optional and only raises contact yield by unlocking Instagram's structured contact fields.
How many leads can I extract in one run?
There's no fixed row cap in the Actor itself. maxResultsPerKeyword bounds discovery per keyword (1β10,000, default 20), and maxResults can cap the total across the whole run (0 = unlimited); each keyword's Google pagination also stops after 3 consecutive empty result pages.
What happens if a profile is private, doesn't exist, or Instagram soft-blocks the fetch?
The row is still emitted with its Google-derived (or direct-input) identity, but profileFetched stays false and every profile/contact field stays null rather than a guessed value β a data-less web_profile_info response is treated as a soft block, not an error.
Can I scrape multiple Instagram leads at once?
Yes. keywords is an array β mix any number of search phrases with @handle/profile-URL entries in a single run; each keyword is discovered and enriched independently.
Does Instagram B2B Lead & Contact Scraper work with Claude, ChatGPT, and other AI agent tools?
Yes β it's callable through Apify's MCP gateway (mcp.apify.com or @apify/actors-mcp-server) or as a plain HTTP endpoint via the Apify API, so any agent framework can invoke it as a tool.
How does Instagram B2B Lead & Contact Scraper compare to other Instagram lead scrapers?
contacts-api/instagram-b2b-lead-generator-email-scraper, as observed on the Apify Store on 2026-07-26, documents only 7 output fields (searchTerm, email, title, description, url, source_region, country) and no phone field or validation. khadinakbar/universal-lead-finder, also observed 2026-07-26, sources leads from Yellow Pages rather than Instagram and documents no phone-validation library. alizarin_refrigerator-owner/company-contact-enricher, observed the same date, requires the caller to supply their own Apollo.io/Hunter.io/Anthropic/Firecrawl API keys (BYOK) and enriches company websites, not Instagram profiles. Instagram B2B Lead & Contact Scraper is Instagram-specific, validates every phone with the phonenumbers library, accepts both keyword discovery and direct @handle/URL input in one run, and needs no third-party API keys.
Does Instagram B2B Lead & Contact Scraper return data in a format LLMs can use directly?
Yes. Typed, normalized JSON with a fixed key set on every row. Pass it directly into an LLM's context, index it into a vector store, or route it through an agent tool call β no HTML parsing step required.
What happens when Instagram changes its layout or anti-bot system?
The Actor is maintained, and the output schema β the same fixed set of field names on every row β stays stable, because enrichment reads Instagram's web_profile_info JSON API response rather than parsing rendered HTML.
Can I use Instagram B2B Lead & Contact Scraper without managing proxies?
Yes. Enrichment and contact-page fetches use Apify Proxy β proxyConfiguration is pre-filled with the RESIDENTIAL group β and Google discovery always uses Apify's GOOGLE_SERP group. You don't need your own proxy infrastructure.
Which fields work best for AI training data and RAG indexing?
For RAG, index biography (free text) alongside username, fullName and category for retrieval context. For structured training/feature data, followerCount, isBusinessAccount, isVerified, hasContact and leadScore are the most consistently populated numeric/boolean fields β every field returns as a typed primitive (string, number, boolean, or null), never a nested blob.
π Related scrapers
| Scraper | What it extracts |
|---|---|
| Instagram Followers And Following Scraper with AI Enrichment | A profile's follower and following graph |
| Instagram Reel Virality Intelligence Scraper | Reel performance and virality signals |
| Instagram Tagged Posts Scraper (Scrape Comments, Media & Metadata) | Tagged posts, comments and media metadata for a profile |
| LinkedIn Lead & Contact Finder (pay-per-events) | Business leads and contact details from LinkedIn |
| Facebook Ads Scraper (AI Ad Copy Enrichment) | Active ad creative and copy for a Facebook Page |
π¬ Your feedback
Found a bug or missing a field? Let us 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 contact-extraction and enrichment logic stay current.