LinkedIn B2B Emails Scraper By Phone & Email Finder
Pricing
from $3.99 / 1,000 results
LinkedIn B2B Emails Scraper By Phone & Email Finder
LinkedIn B2B Emails Scraper by Phone & Email Finder extracts public LinkedIn profile data and finds available business email addresses and phone numbers. Collect names, job titles, company details, profile URLs, contact info, and more for B2B lead generation and sales prospecting.
Pricing
from $3.99 / 1,000 results
Rating
0.0
(0)
Developer
Scrapio
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
9 days ago
Last modified
Categories
Share
LinkedIn Scraper — Extract B2B Emails, Phone Numbers and Profile Leads
LinkedIn B2B Emails Scraper By Phone & Email Finder finds corporate email addresses and validated phone numbers tied to public LinkedIn profiles, without ever logging into LinkedIn. It searches Google for LinkedIn pages matching your keywords, pulls any email and phone number visible in the result snippet, and scores each lead's contact completeness (0, 50, or 100). Unlike scraping frameworks that return raw HTML, it returns typed JSON — one row per lead, ready for your CRM, spreadsheet, or LLM pipeline without any parsing. This guide covers every input and output field, and the strategies teams use to run this Actor in production.
🧭 What Does LinkedIn B2B Emails Scraper By Phone & Email Finder Do?
LinkedIn B2B Emails Scraper By Phone & Email Finder is a Python-based Apify Actor that queries Google with a site:linkedin.com search for each of your keywords, then parses the resulting search snippets for a business email address and, where genuinely present, a validated phone number. No LinkedIn account or login is required — every field comes from Google's public search results, never from a logged-in LinkedIn session. The Actor runs in one of two modes: B2B (corporate email patterns) or Personal (broader email discovery filterable by domain).
Key capabilities:
- Discovers corporate/business emails via 29 targeted B2B search pattern templates (
contact@,email for bookings,careers/hiring,business development, and more) - Discovers personal-domain emails (Gmail, Outlook, etc.) in Personal mode, filterable to specific domains
- Extracts a validated phone number (
phone_number, E.164 format) from the same result snippet, usinglibphonenumber— never a fabricated digit run - Scores every row's
contact_completeness(0, 50, or 100) based on which channels are present - Can gate output to only fully multi-channel leads via
requireBothEmailAndPhone - Deduplicates leads by email address across the entire run
- Filters results by geography via a free-text location phrase added to the search query
⚡ Features & Capabilities
The Actor covers two extraction modes and one unified lead schema — every row can carry an email, a phone number, or both.
Core features
- Two extraction modes:
b2b(corporate email patterns, filters out personal-domain addresses) andpersonal(all email types, optionally filtered to specific domains viapersonalEmailDomains) - 29 B2B search pattern templates (
src/b2b_patterns.py) — fromemail_for_bookingsandbio_email_basictohr_recruitmentandWhatsApp_business— run all patterns by leavingb2bPatternFilterempty, or name specific pattern keys to narrow the search - Dial-code-aware phone extraction:
dialCodeandcountryresolve a region used to interpret national-format numbers found in the same Google result snippet already parsed for email; a candidate is only emitted asphone_number(E.164) anddial_codewhen Google'sphonenumberslibrary validates it as a real number - Contact-completeness scoring: every row gets a
contact_completenessvalue of0,50, or100computed from which ofemail/phone_numberare present - Require-both gate:
requireBothEmailAndPhonefilters the saved output down to rows scoring100only - Automatic email-based deduplication across the whole run, so the same address is never saved twice
- Three-tier smart proxy fallback (direct →
GOOGLE_SERPdatacenter → residential), auto-escalating on a detected block, ordisableProxyto force a direct-only connection - Real-time dataset writes: each lead is pushed to the dataset the moment it's found, with live log lines and an Actor status message tracking progress toward
maxContacts
LinkedIn B2B Emails Scraper By Phone & Email Finder within the Scrapio data stack
This Actor covers contact discovery (emails and phone numbers) for LinkedIn. For structured company data instead of contact leads, Scrapio also publishes linkedin-company-about-scraper-with-similar-companies-affiliates and linkedin-company-employees-scraper-public-contact-info; for profile-level data, linkedin-profile-scraper-by-similar-profile-finder; and for content, linkedin-post-scraper-by-keyword and LinkedIn-Company-Scraper-Post-Reactions-Comments-And-Engagement-Analytics. For the same email/phone lead pattern on other networks, see instagram-b2b-email-scraper-business-type-leads and alibaba-email-scraper-with-product-sourcing-leads.
Why do developers and data teams scrape LinkedIn?
🏢 B2B lead generation and sales prospecting
A sales or growth team runs the Actor with targetKeywords naming their target industries (e.g. "marketing agency", "recruitment") and a targetLocation for their territory, then pulls email, phone_number, and contact_completeness for every result. Reps sort by contact_completeness to prioritize leads with both channels, filter by pattern to see which outreach angle (bookings, partnerships, careers) surfaced the contact, and load the CSV or dataset export directly into their CRM or sequencing tool — no manual profile-by-profile lookup required.
📊 AI training data and RAG indexing
The title and description fields carry the highest-information free text — the Google result title and snippet describing the LinkedIn page — and are well suited to embedding for RAG over a lead or company knowledge base. For training data, leadType, contact_completeness, pattern, and network form a structurally consistent categorical set across every row. All fields return as typed JSON primitives (strings, integers, or empty strings), so no HTML parsing or text cleanup is required before indexing.
📱 Competitive and market intelligence
Running the same targetKeywords on a schedule lets a team track which LinkedIn pages surface new email or phone_number values over time, and which pattern (e.g. careers_hiring vs business_development) is producing new hits for a given niche — a rough proxy for which companies in a sector are actively growing outreach or hiring.
🔬 Research and academic use
Researchers studying B2B contact discoverability, professional-network data exposure, or outreach-pattern prevalence can use the Actor to build a dataset of publicly indexed LinkedIn contact mentions by keyword and region. All data collected is limited to what Google has already indexed from public LinkedIn pages — no login-gated or private profile data is accessed.
🎥 Product and SaaS development
Teams building a lead-enrichment API, a prospecting directory, or an outreach-scoring tool can use this Actor as their ingestion layer: run it on a schedule per target keyword list, write rows keyed on email into their own database, and layer a UI, scoring model, or alerting system on top without building any Google-SERP scraping infrastructure themselves.
🍚 Input Parameters
All input is read from .actor/input_schema.json. No parameter is required — running with the default targetKeywords prefill (["marketing"]) is enough to get results.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
targetKeywords | No | array | Search terms for LinkedIn via Google (e.g. industries or niches). Add one or many. | ["marketing agency", "real estate"] |
extractionMode | No | string, enum: b2b, personal (default b2b) | b2b = corporate email patterns; personal = Gmail/Outlook-style discovery. | "b2b" |
personalEmailDomains | No | array | Personal mode only: keep only leads whose email ends with one of these domains. Ignored in B2B mode. | ["@gmail.com", "@outlook.com"] |
b2bPatternFilter | No | array | B2B mode only: named pattern keys from b2b_patterns.py to run. Empty list runs all 29 patterns. | ["email_for_bookings", "contact_at_domain"] |
targetPlatform | No | string, enum: LinkedIn.com | Target platform for contact discovery — locked to LinkedIn. | "LinkedIn.com" |
targetLocation | No | string | Geographic phrase added to the search query. Leave empty for global results. | "New York" |
maxContacts | No | integer, min 1, max 50000 (default 10) | Maximum number of contact rows to collect across all keywords and patterns. | 100 |
maxPerPattern | No | integer, min 1, max 5000 (default 15) | Cap on contacts collected per B2B search pattern (B2B mode only). | 15 |
dialCode | No | string | Country calling code (e.g. +1, +44) used to interpret national-format phone numbers and compute dial_code. | "+1" |
country | No | string | Country name or 2-letter code, used alongside or instead of dialCode to resolve the phone-parsing region. | "US" |
requireBothEmailAndPhone | No | boolean, default false | When true, only rows with both a valid email and phone (contact_completeness = 100) are saved. | false |
disableProxy | No | boolean | When true, forces a direct-only connection with no proxy escalation. | false |
proxyOverrideSettings | No | object | Optional proxy override. Defaults to Apify's GOOGLE_SERP proxy group. | {"useApifyProxy": true, "apifyProxyGroups": ["GOOGLE_SERP"]} |
JSON input example
{"targetKeywords": ["marketing agency", "real estate", "recruitment"],"extractionMode": "b2b","targetLocation": "New York","maxContacts": 100,"maxPerPattern": 15,"b2bPatternFilter": ["email_for_bookings", "bio_email_basic", "contact_at_domain"],"dialCode": "+1","country": "US","requireBothEmailAndPhone": false,"proxyOverrideSettings": { "useApifyProxy": true, "apifyProxyGroups": ["GOOGLE_SERP"] }}
Supported URL types and input formats
This Actor does not accept LinkedIn profile or company URLs as input — it takes search keywords and filters, and finds matching public LinkedIn pages via Google's site: operator internally. Three common input shapes:
- Single-keyword B2B sweep:
{"targetKeywords": ["real estate"], "extractionMode": "b2b", "maxContacts": 50}— corporate email discovery for one niche. - Location-filtered, multi-channel gate:
{"targetKeywords": ["marketing agency"], "targetLocation": "London", "dialCode": "+44", "country": "GB", "requireBothEmailAndPhone": true}— only saves leads with both a UK-parsed phone number and an email. - Personal-domain discovery:
{"targetKeywords": ["freelance photographer"], "extractionMode": "personal", "personalEmailDomains": ["@gmail.com"]}— keeps only Gmail addresses found on matching LinkedIn pages.
The base (pre-variant) input keys — keywords, mode, customDomains, patterns, platform, location, maxEmails, maxEmailsPerPattern, useProxy, proxyConfiguration — are still accepted as fallbacks, so an older base-shaped input JSON runs unchanged.
📦 Output Format
Every run pushes one JSON row per lead to the Apify dataset via a single push_data call charged under the row_result event — there is no separate, uncharged accounting row. The dataset's default view surfaces all 13 fields the row carries.
Output for LinkedIn contact leads
{"network": "LinkedIn.com","keyword": "marketing agency","title": "Jane Doe - Marketing Director - Acme Digital | LinkedIn","description": "Marketing agency serving SMBs. For bookings email info@acmedigital-example.com or call our office.","url": "https://www.linkedin.com/in/jane-doe-acme-example","email": "info@acmedigital-example.com","phone_number": "+12025550143","dial_code": "+1","leadType": "b2b","location": "New York","contact_completeness": 100,"pattern": "email_for_bookings","scraped_at": "2026-07-24T14:32:10Z"}
pattern is only ever populated on B2B-mode rows (the search pattern that surfaced the lead) — Personal-mode rows omit the key entirely rather than emit it empty. phone_number and dial_code are empty strings whenever no candidate in the snippet passed phonenumbers validation.
Schema stability and export options
Every field name above is a fixed contract this Actor guarantees on every row, regardless of what Google's search-results markup looks like internally — only the Actor's own CSS-selector extraction logic would need updating if Google changed its result-page layout, not the field names your pipeline depends on. Beyond the default 13-column view, the dataset also ships a second view, full_contacts ("Both Email & Phone"), which surfaces a narrower 7-column subset (email, phone_number, contact_completeness, pattern, keyword, title, url) in reverse order for a quicker scan — it does not filter rows by completeness, so still check contact_completeness if you need only fully multi-channel leads. Results export directly from the Apify Console or API as JSON, CSV, Excel (XLSX), or XML, and are readable programmatically via the Apify dataset API with no transformation step.
💡 LinkedIn B2B Emails Scraper By Phone & Email Finder Strategy Guide
🎯 Strategy 1: Real-time enrichment pipeline
Trigger a run whenever a new company or contact name enters your pipeline — a form submission, a CRM record, or a spreadsheet row. Call the Actor with that name or niche as a single targetKeywords entry, keep maxContacts small (a handful of rows per event is usually enough), wait for the run to finish, then read the dataset and append email, phone_number, dial_code, and contact_completeness back onto the originating record. Set requireBothEmailAndPhone: true when the downstream workflow specifically needs multi-channel contacts — for example before a rep is allowed to start an outreach sequence — so the enrichment step either returns a fully reachable lead or nothing at all, rather than a partial record your CRM has to branch on.
🎯 Strategy 2: Scheduled monitoring and alerting
Use an Apify scheduled task to re-run the same targetKeywords and targetLocation combination weekly or monthly. Store each run's dataset and diff the new run against the previous one on the email set to catch newly discoverable contacts, and on pattern to see which outreach angle (careers_hiring, business_development, email_for_bookings, and so on) is now surfacing hits for a niche it wasn't producing results for before. Alert only on genuinely new email values, or on a jump in average contact_completeness for a keyword, rather than on every run — a scheduled diff is far cheaper to review than re-reading the full dataset each cycle.
🎯 Strategy 3: Bulk dataset build
For a research dataset or a large prospecting list, run the Actor across a large targetKeywords list with maxContacts set near the input schema's documented ceiling (50,000 per run) and maxPerPattern tuned so B2B collection spreads across multiple patterns rather than exhausting a single one early. Splitting a long keyword list across several runs (rather than one very large run) also makes it easier to restart a single batch if a run fails partway through. Aggregate the resulting datasets via the Apify API into CSV or a database table keyed on email — deduplication against previously seen addresses already happens inside a single run, but cross-run dedup on email is still worth doing across batches before analysis.
Strategy comparison at a glance
| Strategy | Best for | Run pattern | Output format |
|---|---|---|---|
| Real-time enrichment | Enriching one inbound record at a time | On-demand single run per event | JSON via dataset API |
| Scheduled monitoring | Tracking new contact discoverability over time | Recurring Apify schedule | JSON, diffed run-over-run |
| Bulk dataset build | Research or prospecting datasets | Large keyword list, one or more batch runs | CSV / database export |
🌴 Related LinkedIn Scrapers & Tools
| Scraper Name | What it extracts |
|---|---|
linkedin-profile-scraper-by-similar-profile-finder | LinkedIn profile data plus similar-profile suggestions |
linkedin-company-employees-scraper-public-contact-info | Public employee contact info for a LinkedIn company |
linkedin-company-about-scraper-with-similar-companies-affiliates | LinkedIn company "About" data, similar companies, and affiliates |
linkedin-post-scraper-by-keyword | LinkedIn posts matching a keyword |
LinkedIn-Company-Scraper-Post-Reactions-Comments-And-Engagement-Analytics | LinkedIn company posts with reactions, comments, and engagement analytics |
instagram-b2b-email-scraper-business-type-leads | B2B email leads sourced from Instagram, filtered by business type |
alibaba-email-scraper-with-product-sourcing-leads | Supplier emails paired with product/commerce data from Alibaba |
extract-emails-contacts-socials-from-any-website-verified-phone-email-list | Emails, phone numbers, and social links from any website |
How to integrate LinkedIn B2B Emails Scraper By Phone & Email Finder with your stack
LinkedIn B2B Emails Scraper By Phone & Email Finder works with any language or tool that can make an HTTP request — it runs as a standard Apify Actor, called via the Apify API, the apify-client SDKs, or the Apify Console.
Python
from apify_client import ApifyClientimport csvclient = ApifyClient("<YOUR_APIFY_API_TOKEN>")run_input = {"targetKeywords": ["marketing agency", "real estate"],"extractionMode": "b2b","targetLocation": "New York","maxContacts": 100,"dialCode": "+1","country": "US","requireBothEmailAndPhone": False,}run = client.actor("Scrapio/linkedin-b2b-emails-scraper-by-phone-email-finder").call(run_input=run_input)rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())with open("linkedin_leads.csv", "w", newline="", encoding="utf-8") as f:fieldnames = ["email", "phone_number", "contact_completeness", "leadType","pattern", "keyword", "title", "url", "scraped_at",]writer = csv.DictWriter(f, fieldnames=fieldnames, extrasaction="ignore")writer.writeheader()for row in rows:writer.writerow(row)print(f"Wrote {len(rows)} contact leads to linkedin_leads.csv")
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_API_TOKEN>' });const input = {targetKeywords: ['marketing agency', 'real estate'],extractionMode: 'b2b',maxContacts: 100,requireBothEmailAndPhone: true,};const run = await client.actor('Scrapio/linkedin-b2b-emails-scraper-by-phone-email-finder').call(input);const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const lead of items) {console.log(`${lead.email} | ${lead.phone_number || '(no phone)'} | score=${lead.contact_completeness}`);}console.log(`Collected ${items.length} contact leads.`);
Async and scheduled pipelines
For large keyword lists, start the run asynchronously with client.actor(...).start(run_input=...) instead of .call(...), then poll the run status or fetch the dataset once it finishes, avoiding an open connection for long jobs. For recurring runs, configure an Apify scheduled task against this Actor with a fixed input and cron expression; the Console and API both expose the resulting dataset per run for pickup.
🎯 Who Needs LinkedIn B2B Emails Scraper By Phone & Email Finder? (Use Cases & Industries)
🏢 B2B lead generation and sales prospecting teams
A sales team targeting a niche sets targetKeywords to their ideal-customer industries and targetLocation to their sales territory, then filters the output to contact_completeness = 100 before loading leads into their outreach sequencer — prioritizing contacts reachable by both email and phone.
📊 AI training data and RAG teams
Teams building a lead-enrichment or sales-copilot LLM feature index the title and description text for RAG retrieval and use leadType, pattern, and contact_completeness as structured features for a lead-scoring model, with no parsing step needed since every field is already typed JSON.
📱 Competitive intelligence analysts
Analysts tracking a competitor's hiring or partnership activity re-run the same targetKeywords on a schedule and watch which pattern values (careers_hiring, business_development) start surfacing new hits, using it as an early signal of a company's outreach or growth activity.
🔬 Researchers
Academic and market researchers studying B2B contact discoverability or outreach-pattern prevalence on professional networks use the Actor to assemble a dataset of publicly indexed LinkedIn contact mentions by keyword and region, limited strictly to what Google has already indexed.
🎥 Lead-enrichment and prospecting tool builders
Teams building their own enrichment API, prospecting directory, or CRM plug-in use this Actor as the ingestion layer: run it on a schedule per target keyword list and write rows keyed on email into their own database to power search, scoring, or alerting features.
Is it legal to scrape LinkedIn?
Scraping publicly accessible LinkedIn data is generally lawful in the United States — in hiQ Labs, Inc. v. LinkedIn Corp. (9th Cir. 2019, reaffirmed on remand in 2022), the court held that accessing data any visitor can view without logging in does not violate the Computer Fraud and Abuse Act. That precedent covers accessing public pages; it does not clear every use of the data. Separately, scraping in a way that conflicts with LinkedIn's or Google's Terms of Service is a contractual matter, not a criminal one — it can expose an account to civil claims or a ban, not prosecution. Because this Actor collects email addresses and phone numbers, both of which can qualify as personal data under GDPR, CCPA, and similar laws, treat the output with the same care as any other personal contact data: the Actor only surfaces what is already publicly indexed by Google; the lawful basis for storing, processing, or contacting anyone using that data is your responsibility. LinkedIn B2B Emails Scraper By Phone & Email Finder returns only publicly accessible data. Consult legal counsel for commercial applications involving personal data.
❓ Frequently asked questions
Does LinkedIn B2B Emails Scraper By Phone & Email Finder work without a LinkedIn account?
Yes. It searches Google for public LinkedIn pages matching your keywords — no LinkedIn login, session, or account is required at any point.
How does it handle Google's and LinkedIn's anti-scraping measures?
Requests rotate user-agent and Accept-Language headers, run through impit browser impersonation, and jitter timing between requests. On a detected block, the Actor escalates through a three-tier proxy chain — direct, then GOOGLE_SERP datacenter proxy, then residential proxy — retrying up to the configured attempt limit before giving up on that request.
Can I run it at scale without getting blocked?
The Actor retries and escalates proxies automatically as described above, and maxContacts is capped at 50,000 per run by the input schema. No uptime or block-rate figure is published beyond this retry-and-escalation behavior.
How fresh is the data it returns?
Every run performs a live Google search at run time — nothing is served from a cache — and each row is stamped with a scraped_at UTC timestamp reflecting when it was collected.
Will it always find a phone number alongside an email?
No. LinkedIn gates contact details behind login, so the public Google snippets this Actor reads carry a phone number far less often than an email. Expect a lower phone-fill-rate than email-fill-rate, and treat every non-empty phone_number as genuinely validated rather than assume its absence means one wasn't searched for.
Does the Actor ever save a phone number without an email?
No — every saved row is keyed and deduplicated by its email value, so a phone number found in a snippet with no accompanying email on the same result is not saved as a standalone row. If you need phone-only leads, treat requireBothEmailAndPhone: false output as "email guaranteed, phone sometimes" rather than "either channel independently."
Which fields work best for AI training and RAG indexing?
For RAG, title and description carry the highest-information free text for semantic search over leads. For training data, leadType, pattern, contact_completeness, and network form a consistent structured set across rows. Every field returns as a typed JSON primitive — string or integer — so no parsing is needed before it enters a model's context window.
Does the Actor collect personal data?
Yes. email and phone_number can both qualify as personal data under GDPR, CCPA, and similar laws, even when the address or number appears on a business-oriented LinkedIn page. The Actor only surfaces what is already publicly indexed by Google; the lawful basis for storing, contacting, or otherwise processing that data sits with you as the user.
Does it work with Claude, ChatGPT, and other AI agent tools?
There is no dedicated MCP server for this Actor. It's callable as a standard HTTP-based Apify Actor by any agent framework through the Apify API or the apify-client SDK — every response is typed JSON, ready to pass into an LLM context window without a parsing step.
ℹ️ Disclaimer
LinkedIn B2B Emails Scraper By Phone & Email Finder extracts only publicly available data indexed by Google from public LinkedIn pages. This tool is intended for lawful use cases only. Users are responsible for complying with LinkedIn's and Google's terms of service and applicable data protection laws — including GDPR and CCPA where the collected emails or phone numbers qualify as personal data — in their jurisdiction.