Instagram Phone Number Scraper: Lead Validator
Pricing
from $5.99 / 1,000 results
Instagram Phone Number Scraper: Lead Validator
Instagram Phone Number Scraper gathers public phone contacts for agencies and B2B teams. Filter accounts by niche, category, or follower count to streamline prospecting and outbound calling at scale.
Pricing
from $5.99 / 1,000 results
Rating
0.0
(0)
Developer
Scrapier
Maintained by CommunityActor stats
0
Bookmarked
59
Total users
6
Monthly active users
2 days ago
Last modified
Categories
Share
Instagram Phone Number Scraper — Validated, Deduplicated Leads
Instagram Phone Number Scraper: Lead Validator searches Google's own index of instagram.com pages for phone-shaped strings tied to your keywords and target country, then runs every match through libphonenumber to validate, classify, and reformat it. It returns Instagram-linked leads with E.164/national/international formatting, number type (mobile, fixed line, VOIP, and more), and cross-keyword duplicate merging. Every response is structured JSON — ready to pass directly to an LLM, index into a vector store, or feed a monitoring pipeline. No number is ever invented; unparseable text is flagged, not faked.
What is Instagram Phone Number Scraper: Lead Validator?
It is a Google SERP-dork miner that finds phone-shaped strings co-occurring with your keyword and a country dial code on instagram.com pages, then passes every extracted string through libphonenumber — the same numbering-plan library used in Android and Google's own products — for validation, classification, and reformatting. This is the actual differentiator: rows aren't just scraped text, they carry a computed isValidNumber, numberType, and reformatted E.164/national/international values. No Instagram login or account is required — the actor never sends a request to instagram.com; it only queries google.com through Apify's GOOGLE_SERP proxy.
- Extracts phone-shaped strings from Google's indexed Instagram snippets by keyword and country dial code
- Validates and classifies every extracted string with libphonenumber (
isValidNumber,numberType) - Reformats numbers into E.164, national, and international representations
- Flags region mismatches against your selected target country's numbering plan
- Merges duplicate leads found across multiple keywords/snippets into one row with a source count
- Runs multiple keywords in a single job with an adjustable per-keyword raw-hit cap
What data can you get with Instagram Phone Number Scraper: Lead Validator?
Every dataset row combines the raw Instagram lead snippet with a computed phone-validation record.
| Result Type | Extracted Fields | Primary Use Case |
|---|---|---|
| Instagram lead snippet | platform, keyword, title, description, url, country, dial_code, scrapedAt | Identify which Instagram page and search term produced the lead |
| Validated phone number | phone_number, isValidNumber, numberType, e164Format, nationalFormat, internationalFormat, regionMatches, validationNote | Filter and route leads by real validity and number type before outreach |
| Merged duplicate record | sourceCount, sourceUrls, sourceKeywords | Avoid contacting the same number twice when it surfaces from several hits |
Validated & classified phone numbers
This is the row group that separates this actor from a plain regex scrape. Every phone-shaped string extracted from a SERP snippet is parsed with phonenumbers.parse() and checked with is_valid_number() against the real numbering plan for the detected or expected region. The result is never a guess: isValidNumber is a true/false verdict, numberType classifies the number (MOBILE, FIXED_LINE, FIXED_LINE_OR_MOBILE, VOIP, TOLL_FREE, PREMIUM_RATE, PERSONAL_NUMBER, PAGER, UAN, VOICEMAIL, or UNKNOWN), and e164Format/nationalFormat/internationalFormat give you consistent, reformatted strings regardless of how the number was originally written on the page. When a string can't be parsed at all, every derived field stays null and validationNote explains why:
{"phone_number": "+447700900123","isValidNumber": true,"numberType": "MOBILE","e164Format": "+447700900123","nationalFormat": "07700 900123","internationalFormat": "+44 7700 900123","regionMatches": true,"validationNote": null}
Instagram lead snippets
Each row also keeps the raw context the number was found in: the Google SERP title and description text, the matched instagram.com url (with Google's redirect wrapper stripped), the keyword that triggered the hit, and the country/dial_code used to build the search. This is what lets you trace a validated number back to the specific Instagram page and search term it came from, and audit false positives (a price, date, or order number that happened to look phone-shaped) before you act on them.
Why not build this yourself?
Google rotates the CSS wrapper classes on its SERP result blocks and updates its anti-bot interstitials on an ongoing basis — this actor's own selectors already carry fallback logic (modern class names first, legacy classes next, then a generic "any anchor wrapping an <h3>" catch-all) to survive that churn, plus dedicated logic to tell a real captcha/block page apart from a normal page that merely contains defensive block-related text in its own JS bundle. On top of that, running Google searches at volume requires a proxy pool that Google won't immediately rate-limit or block, and correctly validating a phone-shaped string against the right country's numbering plan means integrating and maintaining a library like libphonenumber rather than trusting a regex. This actor bundles the SERP-mining, anti-bot handling, GOOGLE_SERP proxy routing, and libphonenumber validation/dedup pipeline into one Actor run so you don't have to build and maintain each piece separately.
How to scrape Instagram with Instagram Phone Number Scraper: Lead Validator?
- Open the Actor's page on the Apify Store and click Try for free (or Run) to reach the input form.
- Add one or more terms to
searchKeywords— niches, business types, or any word likely to co-occur with a phone number on an Instagram page (no field is schema-required, but at least one keyword is needed or the run logs "No keywords provided" and exits). - Set
targetCountryto the dial code you want the search and validation to target, and adjustmaxResultsPerKeyword,phoneValidationMode, andmergeDuplicateNumbersto taste. - Start the run.
- Download results as JSON, CSV, Excel, or any other format the Apify dataset export offers once the run finishes.
Real request body for a run:
{"searchKeywords": ["marketing", "salon"],"targetCountry": "United Kingdom (+44)","maxResultsPerKeyword": 20,"phoneValidationMode": "standard","mergeDuplicateNumbers": true}
How to run multiple keywords in one job
searchKeywords accepts an array, and every keyword in it is searched and validated within the same run — there's no need to start a separate job per term. maxResultsPerKeyword caps raw hits independently per keyword before validation and dedup, and mergeDuplicateNumbers (default on) then merges any number that surfaces under more than one keyword into a single row carrying all contributing sourceKeywords.
⬇️ Input
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
searchKeywords | No | array | Keywords to combine with your target country's dial code in a site:instagram.com "<dial>" "<keyword>" Google search. Also accepts the base actor's original keywords field. | ["marketing", "salon"] |
platform | No | string (enum) | Target platform for the site: search filter. Currently fixed to "Instagram". | "Instagram" |
targetCountry | No | string (enum) | Country whose dial code is used to build the search query and validate matched numbers against the right numbering plan. Also accepts the base actor's original country field. | "United Kingdom (+44)" |
maxResultsPerKeyword | No | integer (1–10000) | Maximum number of raw phone-shaped SERP hits to collect per keyword, before validation/dedup. Also accepts the base actor's original maxPhoneNumbers field. | 20 |
phoneValidationMode | No | string (enum: loose, standard, strict) | How strictly to filter extracted numbers using libphonenumber. | "standard" |
mergeDuplicateNumbers | No | boolean | Merge rows sharing the same validated E.164 number across SERP hits into one row with sourceCount/sourceUrls/sourceKeywords. | true |
proxyConfiguration | No | object | Apify proxy configuration. The actor always enforces the GOOGLE_SERP proxy group regardless of what is selected here. | {"useApifyProxy": true} |
Example JSON input:
{"searchKeywords": ["marketing", "salon", "bakery"],"platform": "Instagram","targetCountry": "United Kingdom (+44)","maxResultsPerKeyword": 20,"phoneValidationMode": "standard","mergeDuplicateNumbers": true,"proxyConfiguration": {"useApifyProxy": true}}
Common pitfall: no field is schema-required, so it's easy to start a run with an empty searchKeywords array — the actor logs an error and exits with zero results rather than searching everything. Always fill in at least one keyword. Also note maxResultsPerKeyword caps raw SERP hits before validation and dedup; the number of rows you actually receive can be lower once phoneValidationMode filtering and mergeDuplicateNumbers merging are applied.
⬆️ Output
Results are pushed to the Actor's dataset as typed, normalized JSON with a consistent schema across every run, downloadable in the formats the Apify dataset export supports (JSON, CSV, Excel, and more).
Scraped results
[{"platform": "Instagram.com","keyword": "marketing","title": "The Mane Event Salon (@themaneeventsalon) - Instagram","description": "Book your appointment! Call or WhatsApp us at +44 7700 900123 for marketing collabs and bookings.","url": "https://www.instagram.com/themaneeventsalon/","phone_number": "+447700900123","country": "United Kingdom","dial_code": "+44","isValidNumber": true,"numberType": "MOBILE","e164Format": "+447700900123","nationalFormat": "07700 900123","internationalFormat": "+44 7700 900123","regionMatches": true,"validationNote": null,"sourceCount": 2,"sourceUrls": ["https://www.instagram.com/themaneeventsalon/","https://www.instagram.com/p/Cx1y2z3AbCd/"],"sourceKeywords": ["marketing", "salon"],"scrapedAt": "2026-07-25T09:14:02.331Z"},{"platform": "Instagram.com","keyword": "salon","title": "Bright Smile Studio (@brightsmilestudio) - Instagram","description": "DM or ring 020 7700 0123 for a free marketing consultation.","url": "https://www.instagram.com/brightsmilestudio/","phone_number": "+442077000123","country": "United Kingdom","dial_code": "+44","isValidNumber": false,"numberType": null,"e164Format": null,"nationalFormat": null,"internationalFormat": null,"regionMatches": null,"validationNote": "parsed but not a valid number for its numbering plan","sourceCount": 1,"sourceUrls": ["https://www.instagram.com/brightsmilestudio/"],"sourceKeywords": ["salon"],"scrapedAt": "2026-07-25T09:14:07.812Z"},{"platform": "Instagram.com","keyword": "bakery","title": "Riverside Bakery (@riversidebakery) - Instagram","description": "Order custom cakes: +44 20 7946 0958. Marketing collabs welcome.","url": "https://www.instagram.com/riversidebakery/","phone_number": "+442079460958","country": "United Kingdom","dial_code": "+44","isValidNumber": true,"numberType": "FIXED_LINE","e164Format": "+442079460958","nationalFormat": "020 7946 0958","internationalFormat": "+44 20 7946 0958","regionMatches": true,"validationNote": null,"sourceCount": 1,"sourceUrls": ["https://www.instagram.com/riversidebakery/"],"sourceKeywords": ["bakery"],"scrapedAt": "2026-07-25T09:14:11.045Z"}]
How can I use the data extracted with Instagram Phone Number Scraper: Lead Validator?
- Sales and outreach teams: filter on
isValidNumber: trueandnumberType == "MOBILE"to build a call/SMS/WhatsApp list of confirmed-format Instagram business leads, skippingFIXED_LINE,TOLL_FREE, or unparseable rows without manual review. - Lead generation agencies: run a keyword set per niche and country, use
mergeDuplicateNumbersto hand clients a deduplicated contact list instead of the same business appearing multiple times because Google indexed several of its posts. - AI engineers and LLM developers: feed the structured JSON (validated numbers, source URLs, keywords) to an agent as grounded context, letting it reason about a prospect using real
e164FormatandnumberTypevalues instead of unverified raw text. - B2B prospecting teams: cross-reference
regionMatchesanddial_codeto confirm a lead is actually based in your target market before routing it to a region-specific sales rep.
How do you monitor new validated Instagram leads over time?
Lead monitoring here means re-running the same keyword-and-country set on a schedule and treating each run's output as a new snapshot to diff against the last one, rather than a one-off pull. Because Google continuously (re)indexes Instagram pages, running the same searchKeywords/targetCountry combination again can surface new pages Google has since crawled, or pick up a number on a page it missed the first time — either shows up as a new row rather than a duplicate, since mergeDuplicateNumbers merges by the validated e164Format key.
The fields worth diffing between runs are e164Format (the stable identity of a validated number), sourceCount and sourceUrls (growing values mean the same lead is being mentioned on more Instagram content), and isValidNumber/validationNote (a previously unparseable hit can resolve to a valid number once more context is indexed). A practical workflow: schedule a run across your keyword set for a given country, export the dataset, and compare e164Format values against the previous run's export — any e164Format that wasn't present last time is a new lead worth routing to outreach, and any row whose sourceCount increased is a business getting more Instagram mentions.
This actor has no built-in webhook or diffing feature; use the Apify platform's Scheduler to trigger runs on a recurring interval, and perform the comparison against the previous run's dataset export in your own pipeline or spreadsheet.
Integrate Instagram Phone Number Scraper: Lead Validator and automate your workflow
Instagram Phone Number Scraper: Lead Validator works with any language or tool that can send an HTTP request.
REST API with Python
import requestsTOKEN = "YOUR_API_TOKEN"ACTOR_ID = "YOUR_ACTOR_ID"url = f"https://api.apify.com/v2/acts/{ACTOR_ID}/run-sync-get-dataset-items"payload = {"searchKeywords": ["marketing", "salon"],"targetCountry": "United Kingdom (+44)","phoneValidationMode": "standard",}resp = requests.post(url, params={"token": TOKEN}, json=payload)leads = [row for row in resp.json() if row.get("isValidNumber")]print(f"Retrieved {len(leads)} validated leads")
MCP for query-grounded AI agents
Instagram Phone Number Scraper: Lead Validator can be exposed to MCP-compatible clients through Apify's generic Actors MCP Server: run npx @apify/actors-mcp-server --actors YOUR_USERNAME/instagram-phone-number-scraper-lead-validator with your APIFY_TOKEN set, and register it with Claude Desktop, Cursor, or any other MCP client. The agent flow: a user asks for validated Instagram phone leads in a niche, the agent calls the tool with keywords and a target country, receives structured JSON back, and grounds its answer in real, format-validated leads instead of guessing.
Scheduled monitoring and delivery
Use the Apify platform's built-in Scheduler to trigger runs on a recurring interval (daily, weekly, or a custom cron expression) without managing your own job runner. Results land in each run's dataset, which you pull via the API or the platform's export formats after each scheduled run completes.
Is it legal to scrape Instagram phone numbers?
Yes, in general — this actor only retrieves what Google's public search index already serves, without logging into Instagram or bypassing any access control. But a captured phone number is personal data, and personal data carries obligations regardless of how publicly it was found: under GDPR (EU/UK) and the CCPA/CPRA (California), you need a lawful basis before storing, processing, or using someone's phone number for outreach, and individuals can request deletion or object to that processing. Using this data for a one-off research sample carries a different risk profile than bulk storage or automated cold-outreach campaigns — the latter is where privacy-regulation exposure is highest. Consult your legal team before using extracted phone data for commercial outreach at scale.
Frequently asked questions
Does targetCountry affect the search itself, or only validation?
Both. targetCountry supplies the dial code inserted into the site:instagram.com "<dial>" "<keyword>" Google query, and for a subset of dial codes the actor also maps it to a Google gl (geolocation) parameter to localize results, and uses it as the region hint libphonenumber validates and formats against.
What do the three phoneValidationMode settings actually filter?
loose keeps every extracted string, even unparseable text, for full manual review. standard (default) drops only strings libphonenumber can't parse at all, keeping both valid and invalid-but-parseable numbers with an honest isValidNumber flag. strict keeps only numbers that are libphonenumber-valid and whose region matches the selected targetCountry's numbering plan.
What does "validator" actually mean for these phone numbers?
It means every extracted string is run through libphonenumber's real parsing and numbering-plan rules — it is not a check that the number is currently reachable, in service, or answers a call. isValidNumber reflects structural validity against the numbering plan; a structurally valid number can still be disconnected, and this actor has no mechanism to confirm live reachability.
How does Instagram Phone Number Scraper: Lead Validator handle Google's anti-bot measures?
It rotates user-agent strings and Accept-Language headers per request, adds randomized delays between requests, retries with exponential backoff (up to 5 attempts) on failures, and requests a fresh proxy URL on each retry. Blocked responses are detected by HTTP status (429/503/4xx), by a /sorry redirect in the final response URL, and — since Google's own defensive JavaScript can contain text that looks like a block message on normal pages — by checking for real result markup before falling back to text-based block detection.
Does Instagram Phone Number Scraper: Lead Validator extract validated, classified phone numbers?
Yes — every row carries isValidNumber, numberType, e164Format, nationalFormat, internationalFormat, regionMatches, and validationNote, computed by libphonenumber from the raw phone_number string. These fields are null only when the extracted string could not be parsed at all, in which case validationNote explains why.
How many results does Instagram Phone Number Scraper: Lead Validator return per query?
maxResultsPerKeyword caps raw SERP hits per keyword between 1 and 10,000 (prefilled at 20). That cap applies before validation and deduplication, so the number of rows you receive can be lower than the cap once phoneValidationMode filtering and mergeDuplicateNumbers merging run.
How do I use Instagram Phone Number Scraper: Lead Validator to monitor new leads over time?
Schedule a run across the same keyword-and-country set on a recurring interval using the Apify platform's Scheduler, then compare each run's e164Format values against the previous run's export — any e164Format not seen before is a new lead, and a rising sourceCount means an existing lead is surfacing on more Instagram content.
Does Instagram Phone Number Scraper: Lead Validator work with Claude, ChatGPT, and AI agent frameworks?
Yes — it is callable as an HTTP endpoint by any agent framework, and it is also reachable through Apify's generic Actors MCP Server (npx @apify/actors-mcp-server --actors YOUR_USERNAME/instagram-phone-number-scraper-lead-validator), which enables MCP clients like Claude Desktop or Cursor to call it directly and ground their answers in real, format-validated leads.
How does Instagram Phone Number Scraper: Lead Validator compare to Scrapier's other Instagram contact scraper?
Scrapier also publishes instagram-profile-phone-number-email-finder-scraper, which shares the same Google-dork mechanism and adds email extraction, but outputs only the raw phone_number string with no validity, classification, or formatting. This actor is the version to use when you need to know whether an extracted number is actually well-formed, what type it is, and whether it matches your target country — at the cost of not extracting emails.
Can I use Instagram Phone Number Scraper: Lead Validator without managing proxies or Instagram credentials?
Yes. The actor always routes its Google searches through Apify's GOOGLE_SERP proxy group internally, and it never logs into Instagram — you don't need an Instagram account, session cookie, or any credential to run it, only an Apify account with proxy access.
Your feedback
Found a bug or missing a field? Let us know so we can fix it — feedback on real gaps between this README and the actor's behavior is what keeps it accurate. Reach out through the Actor's issue tracker or support contact on its Apify Store listing.