πŸ“Έ Instagram B2B Lead & Contact Scraper avatar

πŸ“Έ Instagram B2B Lead & Contact Scraper

Pricing

$19.99/month + usage

Go to Apify Store
πŸ“Έ Instagram B2B Lead & Contact Scraper

πŸ“Έ 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

Scraper Engine

Maintained by Community

Actor stats

1

Bookmarked

9

Total users

3

Monthly active users

15 days ago

Last modified

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 CategoryPublicly available (no login)Restricted
Username, full name, canonical profile URLYesβ€”
Biography text and linked external URLYesβ€”
Category, city, verified / business account flagsYesβ€”
Follower, following and media countsYesβ€”
public_email, business_email, public_phone_number, contact_phone_numberNoOnly returned to a request carrying a logged-in Instagram sessionId cookie
Full follower/following lists, Stories, Direct MessagesNoNot returned by this Actor at any setting β€” requires the account owner's own login
Private-account contentNoPrivate 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 TypeWhat it coversJSON Field Names
Identity & profile dataUsername, name, canonical URL, bio, category, city, external link, post/reel identifierstype, username, fullName, url, shortcode, title, description, category, cityName, biography, externalUrl, externalUrlResolved, profilePicUrl, userId
Contact & lead dataBest unified email/phone, every raw contact source with its confidence, business flags, reach, and the derived lead scoreemail, 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 metadataWhich keyword or direct input surfaced the row, its Google rank, and whether enrichment succeededkeyword, 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.

FeatureInstagram Graph APIInstagram B2B Lead & Contact Scraper
Scope of accessible profilesOnly professional accounts that have connected your app via OAuthAny public Instagram profile, post or reel you supply, or that a keyword search surfaces
Approval processRequires Meta App Review and, for many permissions, business verificationNo approval process β€” start a run from the Apify Console
Lead discoveryNo keyword-based profile discovery endpointBuilt-in Google-SERP discovery via keywords
Setup requirementMeta developer account, registered app, OAuth flow, access tokenApify account only; an optional sessionId cookie to raise contact yield
Output shapeRaw paginated Graph API JSON you parse yourselfOne 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.

  1. Open Instagram B2B Lead & Contact Scraper on its Apify Store listing and open the Console.
  2. Provide at least one entry in keywords β€” a bare word/phrase runs a Google search, while an @handle or instagram.com profile URL is fetched directly. country is required but pre-filled with "United Kingdom (+44)", so change it only if you want a different dial code and phone region.
  3. Set the filters that matter β€” requireEmail, requirePhone, onlyBusinessAccounts, minFollowers/maxFollowers β€” and decide whether followBioLinks should follow external sites for extra contacts.
  4. Start the run.
  5. 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 keywords to a niche + city (e.g. "personal trainer London") and onlyBusinessAccounts to true, then filters the dataset on hasContact and leadScore to prioritize the accounts with the highest-confidence contact before the first outreach message.
  • 🏒 A marketing agency prospecting for new clients uses category and cityName to segment leads by vertical and location, then reads emailType to route freemail-domain leads differently from business-domain ones.
  • πŸ€– An AI agent or RAG pipeline calls this Actor as a tool with keywords or a fixed @handle list, and reads email, phoneE164, biography and leadScore straight 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 minFollowers to shortlist accounts with real reach before reviewing biography and externalUrlResolved for a personal fit.
  • πŸ“Š A market researcher studying a vertical's self-presentation feeds a fixed list of @handles and compares isBusinessAccount, isVerified and followerCount across 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.

ParameterRequiredTypeDescriptionExample Value
keywordsNoarrayEach 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"]
countryYesstring (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)"
resultTypeNostring (enum)Which Instagram result types to keep: Profiles (default, recommended β€” enrichable), All, Posts (/p/, snippet only), Reels (/reel/, snippet only)."Profiles"
fetchProfileInfoNobooleanFetch each discovered profile's web_profile_info for genuine category/city/followers/external URL/biography/verified/business data. Default true.true
followBioLinksNobooleanExtract email/phone from the bio and follow the external URL (aggregators expanded, /contact tried) to harvest a contact. Default true.true
sessionIdNostring (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..."
maxResultsPerKeywordNointeger (1–10000, default 20)Stop paginating a keyword's Google results after this many unique candidate rows are discovered, before enrichment/filters.20
maxResultsNointeger (min 0, default 0)Hard cap on total rows emitted across all keywords + profiles in the run. 0 = unlimited.100
requireEmailNobooleanEmit only rows with a genuine public/business/snippet email. Default false.true
requirePhoneNobooleanEmit only rows with a genuine, phonenumbers-validated phone. Default false.false
onlyBusinessAccountsNobooleanEmit only accounts flagged is_business_account or is_professional_account. Requires fetchProfileInfo. Default false.true
minFollowersNointeger (min 0, default 0)Drop profiles with fewer followers than this. 0 = no minimum. Requires fetchProfileInfo.1000
maxFollowersNointeger (min 0, default 0)Drop profiles with more followers than this. 0 = no maximum. Requires fetchProfileInfo.0
proxyConfigurationNoobject (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 ApifyClient
client = 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.

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.

ScraperWhat it extracts
Instagram Followers And Following Scraper with AI EnrichmentA profile's follower and following graph
Instagram Reel Virality Intelligence ScraperReel 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.