πŸ”— LinkedIn B2B Lead Discovery Scraper avatar

πŸ”— LinkedIn B2B Lead Discovery Scraper

Pricing

Pay per usage

Go to Apify Store
πŸ”— LinkedIn B2B Lead Discovery Scraper

πŸ”— LinkedIn B2B Lead Discovery Scraper

πŸ“ž LinkedIn B2B Phone Number Scraper extracts publicly available business phone numbers from profiles & company pages for lead gen and sales prospecting. ⚑ Fast, accurate, CSV/CRM export & enrichment. βœ… Use ethically and per LinkedIn terms and data laws. πŸš€ Perfect for SDRs.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

API Empire

API Empire

Maintained by Community

Actor stats

0

Bookmarked

42

Total users

12

Monthly active users

a day ago

Last modified

Share

LinkedIn Lead Scraper β€” Extract Profiles, Phones & Emails

LinkedIn Lead Scraper runs site:linkedin.com Google searches for any keyword, job title, company name, or direct LinkedIn URL you give it, then turns each result snippet into a structured B2B lead: a person or company profile, a phone number validated for the country you choose, and a business email confirmed to actually exist. Every response is typed, normalized JSON β€” no HTML, no CSS selectors, no manual parsing. Nothing is guessed: a phone or email is only ever emitted when it is genuinely present or independently verified. After a run, you get a clean, de-duplicated lead list ready to import into a CRM, spreadsheet, or outreach tool.

What is LinkedIn Lead Scraper?

LinkedIn Lead Scraper is an Apify Actor that discovers LinkedIn people and company profiles through Google's public search index, not through LinkedIn's own login-gated search. It reads the snippet Google shows for each result and extracts an identity record β€” name, headline, company, location, connection/follower counts β€” plus, when present, a genuine phone number or email. No LinkedIn account, session cookie, or li_at token is required or used anywhere in the codebase. To turn a discovered identity into a contact, the Actor offers two opt-in, verification-only enrichment paths rather than guessing:

  • πŸ” Discover LinkedIn person (/in/) and company (/company/) profiles from keywords or direct URLs
  • πŸ“ž Validate any phone number found in a snippet against a selected country with the phonenumbers library
  • βœ‰οΈ Discover and verify business emails via SMTP probing or a Hunter.io API key
  • πŸ“€ Export results as JSON, CSV, XML, or Excel from the Apify dataset
  • 🚫 No login, no session cookies, no proxy setup required from you

What data does LinkedIn Lead Scraper collect?

Each run returns three connected data types per lead β€” identity, company, and verified contact β€” all in a single flat record.

Data TypeKey FieldsJSON Field Names
Profile identityName, headline/title, entity type, profile URL, slugpersonName, headline, type, profileUrl, profileSlug
CompanyCompany name, resolved web domaincompanyName, companyDomain
Validated phoneE.164 number, line type, validity, confidence, regionphoneE164, phoneType, phoneValid, phoneConfidence, phoneRegion
Verified emailAddress, source, confidence, verification statusemail, emailSource, emailConfidence, emailStatus
Search contextLocation, connections, followers, keyword, SERP position, timestamplocation, connectionsCount, followerCount, keyword, serpRank, serpPage, scrapedAt

Need more LinkedIn data?

If you need deeper company intelligence β€” employee lists, competitor sets, and recent posts β€” LinkedIn Company Scraper Plus covers that from a company URL or vanity name. If you're tracking engagement instead of identities β€” likes, comments, and content performance on posts β€” LinkedIn Engagement & Content Analytics is the companion Actor for that.

Why not build this yourself?

LinkedIn does not offer a self-serve, keyword-based public-profile search API that a third-party developer can simply request a key for β€” its Marketing and Talent APIs are partner-gated, require an approval process, and are scoped to LinkedIn's own advertising and recruiting products, not open lead discovery. Building this yourself means maintaining your own Google SERP fetcher, a block classifier that survives LinkedIn's and Google's layout churn, phone/email verification logic, and a rotating residential/datacenter proxy budget β€” and re-doing that work every time a selector or interstitial changes. LinkedIn Lead Scraper is maintained on your behalf: the request logic, block detection, and output schema are versioned and updated centrally so your integration keeps working without you touching scraping code.

Why do developers and teams scrape LinkedIn for leads?

For sales teams and SDRs

Outbound teams use keywords (a role or title) plus location to pull a fresh list of prospects at target companies β€” for example "VP of Marketing" with location: "Berlin" and profileTypeFilter: "person". The companyName, headline, and profileUrl fields go straight into a CRM import, and mustHaveEmail narrows the list to leads that already carry a verified email, so reps only work contacts they can actually reach.

For recruiters and talent sourcers

Recruiters run the same query pattern against candidate-shaped titles ("Senior Backend Engineer", "Staff Data Scientist") and use excludeKeywords (e.g. ["intern", "student"]) to strip junior noise from the result set. connectionsCount and headline give a quick signal on seniority before anyone opens a profile.

For AI engineers and agent builders

Because the output is stable, typed JSON with no HTML to strip, an agent can call the Actor as a tool, pass keywords and country, and feed the returned personName/companyName/profileUrl triples straight into a CRM-writing or outreach-drafting chain without a parsing step in the loop.

For marketers running account-based campaigns

Marketers target a named account list by feeding company names or company /company/ URLs as keywords with profileTypeFilter: "company", then a second pass with profileTypeFilter: "person" and the company name as the term to map the people inside each account for an ABM sequence.

How to scrape LinkedIn leads (step by step)

  1. Open LinkedIn Lead Scraper on its Apify Store listing and click Try for free (or Run) to open the input form.
  2. Provide the required keywords array β€” one or more roles, names, companies, or direct LinkedIn URLs β€” and the required country, whose dial code is used to validate any phone found.
  3. Optionally set profileTypeFilter (any / person / company) to narrow the entity type, and location to bias the search geographically.
  4. Click Start to launch the run.
  5. Download the results as JSON, CSV, XML, or Excel from the Dataset tab, or pull them programmatically via the Apify API.

What to do when LinkedIn changes its structure

The Actor's block detection keys on the presence of Google's organic result container rather than brittle keyword matching, and the output schema is maintained centrally β€” field names and types on your end do not change when LinkedIn or Google adjusts their markup. No specific turnaround time is published; check the Actor's build log for the latest maintenance activity.

What changed in LinkedIn scraping recently?

LinkedIn has escalated legal enforcement against LinkedIn-focused scraping providers rather than only technical blocking. In January 2025, LinkedIn and Microsoft sued Proxycurl β€” a major LinkedIn data-enrichment API β€” alleging it operated hundreds of thousands of fake accounts to scrape profiles including non-public data and resell it; the case settled and Proxycurl shut the service down in July 2025, deleting its collected LinkedIn data (Bloomberg Law; StartupHub AI). That case sits on top of the earlier hiQ Labs v. LinkedIn litigation, which established that scraping data a user has made publicly visible does not itself violate the U.S. Computer Fraud and Abuse Act, before the parties settled in 2022. For scrapers, the practical read is that LinkedIn's enforcement risk concentrates on operators using fake accounts and login sessions to harvest non-public data at scale β€” not on reading data Google has already indexed from public pages. LinkedIn Lead Scraper works from Google's public index only, uses no LinkedIn account, session cookie, or fake profile at any point, and does not resell or aggregate a persistent database β€” it returns only what a run's search terms surface.

⬇️ Input

ParameterRequiredTypeDescriptionExample Value
keywordsYesarrayRoles, names, companies, or direct LinkedIn profile/company URLs. Keywords run a site:linkedin.com "<keyword>" search; a LinkedIn URL is looked up by its public slug.["marketing manager", "https://www.linkedin.com/in/some-profile/"]
locationNostringOptional geo term added to the search query to bias results."Berlin"
countryYesstringCountry whose dial code validates any phone found in a snippet (via phonenumbers). It does not fabricate phones β€” it only decides which genuine numbers are accepted. Default: "United Kingdom (+44)"."United Kingdom (+44)"
maxResultsNointegerMaximum lead records to collect per keyword/URL. Min 1, max 10000, default 20.20
profileTypeFilterNostringany (people + companies), person (/in/ only), or company (/company/ only). Default "any"."person"
countryMatchStrictNobooleanWhen true, a phone is accepted only if its validated country code equals the selected country's dial code. Default true.true
mustHavePhoneNobooleanWhen true, only records with a genuine validated phone are emitted. LinkedIn phone coverage is structurally very low. Default false.false
mustHaveEmailNobooleanWhen true, only records with an email are emitted. Default false.false
excludeKeywordsNoarrayDrop any record whose name/headline/company/location/URL contains one of these terms (case-insensitive).["intern", "student"]
findEmailsNobooleanWhen true, resolves each lead's company to a web domain, generates common business-email patterns, and confirms candidates over SMTP β€” verified-only. Default false.false
enrichmentApiKeyNostring (secret)Optional Hunter.io API key for provider-verified email finding with a confidence score.""
concurrencyNointegerHow many keywords/URLs to search in parallel. Min 1, max 10, default 3.3
proxyConfigurationNoobjectProxy used for the Google searches. Defaults to Apify's GOOGLE_SERP proxy group.{"useApifyProxy": true, "apifyProxyGroups": ["GOOGLE_SERP"]}
{
"keywords": ["marketing manager", "growth lead"],
"location": "London",
"country": "United Kingdom (+44)",
"maxResults": 20,
"profileTypeFilter": "person",
"countryMatchStrict": true,
"mustHavePhone": false,
"mustHaveEmail": false,
"excludeKeywords": ["intern", "student"],
"findEmails": true,
"enrichmentApiKey": "",
"concurrency": 3,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["GOOGLE_SERP"]
}
}

⚠️ Common pitfall: most cloud environments β€” including Apify's own infrastructure β€” block outbound SMTP on port 25, so turning on findEmails without an enrichmentApiKey typically verifies 0 emails there; the run log states this plainly when it happens. For reliable email coverage, supply a Hunter.io key in enrichmentApiKey instead.

⬆️ Output

Every run pushes typed, normalized JSON rows to the Apify dataset, downloadable as JSON, CSV, XML, or Excel from the Dataset tab or the Apify API. The dataset's default view lists all 28 fields the Actor writes to each row β€” nothing here is trimmed from a larger record.

Scraped lead

{
"type": "person",
"isChild": false,
"personName": "Jane Doe",
"headline": "Marketing Manager",
"companyName": "Acme Ltd",
"companyDomain": "acme.com",
"location": "London, England, United Kingdom",
"profileUrl": "https://uk.linkedin.com/in/jane-doe",
"profileSlug": "jane-doe",
"connectionsCount": 500,
"followerCount": null,
"email": "jane.doe@acme.com",
"emailSource": "pattern_verified",
"emailConfidence": "first.last",
"emailStatus": "verified",
"phoneE164": null,
"phoneType": null,
"phoneValid": false,
"phoneConfidence": null,
"phoneRegion": null,
"contactChannel": "email",
"hasContact": true,
"country": "United Kingdom",
"dialCode": "+44",
"keyword": "marketing manager",
"serpRank": 3,
"serpPage": 1,
"scrapedAt": "2026-07-26T10:00:00Z"
}

A type: "company" row uses the same 28 keys, with personName, headline, connectionsCount, and followerCount typically null and companyName holding the company page title instead.

How does LinkedIn Lead Scraper compare to other LinkedIn scrapers?

FeatureLinkedIn Lead ScraperGeneric alternative
LinkedIn login or session cookieNot used β€” reads Google's public indexOften required (as observed on the Apify Store on 2026-07-26, olympus/b2b-leads-finder requires pasting a session cookie via a browser extension)
Phone validationβœ… phonenumbers library validation against a selected country, never fabricatedNot documented on the reviewed competitors
Email verification methodLive SMTP probe or Hunter.io provider lookup β€” verified-onlyNot documented in detail on the reviewed listings beyond a coverage percentage claim
Search inputFree-text keywords, roles, or direct LinkedIn URLsA pre-built LinkedIn/B2B-platform search URL (as observed on the Apify Store on 2026-07-26 for both olympus listings)
Output formatTyped JSON dataset, exportable as JSON/CSV/XML/ExcelTyped JSON dataset (as observed on the Apify Store on 2026-07-26, chieftools/b2b-linkedin-lead-generator also adds an auto-generated Excel workbook)

If you're building an AI agent or RAG pipeline, the output format row is the decision-maker β€” parsing HTML inside an agent loop is a reliability failure mode, not a feature.

How many results can you scrape with LinkedIn Lead Scraper?

maxResults caps how many lead records the Actor collects per keyword or URL β€” it is the Actor's own setting, not a LinkedIn-imposed number, and accepts any value from 1 to 10000 (default 20). The Actor pages through Google's SERP ten results at a time (start=0, 10, 20, …) until it reaches maxResults, hits three consecutive blocked or failed pages, or hits five consecutive pages that add no new records after deduplication and filtering β€” whichever comes first, so a filter-heavy run (e.g. mustHavePhone on) finishes cleanly instead of paging indefinitely. A direct-URL input (a LinkedIn profile/company link instead of a keyword) fetches a single page, since it targets one known profile. No benchmark run time is published β€” actual duration depends on concurrency, the number of keywords, and how quickly Google responds.

Integrate LinkedIn Lead Scraper and automate your workflow

LinkedIn Lead Scraper works with any language or tool that can send an HTTP request.

REST API integration

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_API_TOKEN>")
run_input = {
"keywords": ["marketing manager"],
"country": "United Kingdom (+44)",
"maxResults": 20,
}
run = client.actor("API-Empire/linkedin-b2b-lead-discovery-scraper").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["personName"], item["profileUrl"], item.get("email"))

Works in Python, Node.js, Go, Ruby, cURL.

Automation platforms (n8n, Make, LangChain)

In n8n, the Apify node's "Run Actor and get dataset" operation can call API-Empire/linkedin-b2b-lead-discovery-scraper directly inside a workflow. In Make, the equivalent Apify > Run Actor module does the same, letting you chain the dataset output into a CRM or email module. In LangChain, the Actor is reachable as a tool call through the Apify API using the same apify_client invocation shown above, so an agent can request leads mid-chain.

Yes β€” LinkedIn Lead Scraper returns only publicly available data: information Google has already indexed from public LinkedIn snippets, plus emails confirmed through independent, publicly reachable mail-server or provider checks. Because the output includes personal data β€” names, and where verified, personal contact emails and phone numbers β€” GDPR and CCPA govern how you may lawfully store and use it once collected, particularly for outreach to individuals in the EU/UK or California. Consult legal counsel for commercial use cases involving bulk personal data.

❓ Frequently asked questions

Does LinkedIn Lead Scraper work without a LinkedIn account?

Yes. The Actor never logs into LinkedIn and uses no session cookie or li_at token β€” it discovers profiles through Google's public search index only.

How often is the scraped data updated?

Every run performs a live Google search at execution time; nothing is served from a cache. Two runs seconds apart can return different results if Google's index has changed.

What if a search returns zero leads?

This happens when a term is too narrow, the location filter excludes everything, or Google rate-limits the proxy for that run. The Actor stops a term after three consecutive blocked/failed pages or five consecutive pages with no new records, and logs "No records collected" with a suggestion to try different keywords or location β€” it never returns fabricated placeholder rows.

Can I scrape private or login-gated LinkedIn content?

No. Only content visible in Google's public search snippets is used. LinkedIn's own contact details (direct messages, private phone/email fields on a profile) stay behind LinkedIn's login and connection wall and are never accessed.

How is LinkedIn Lead Scraper billed?

The Actor uses Apify's pay-per-event pricing on the row_result event. A row is charged only when it is a genuine identity record β€” a person or company name paired with a profile URL β€” or carries a validated phone or verified email; empty rows and rows with no identity and no contact are pushed to the dataset uncharged. Check the Actor's Pricing tab on the Apify Console for the current price per event.

Does LinkedIn Lead Scraper work for AI agent workflows and LLM pipelines?

Yes. It is callable as an HTTP endpoint through the Apify API by any agent framework, using the same invocation shown above. Every response is typed JSON with stable field names, so it can be passed directly into an LLM context or agent tool call with no parsing step.

How does LinkedIn Lead Scraper handle LinkedIn's anti-bot system?

It fetches through Apify's GOOGLE_SERP proxy group by default, rotates the user agent and Accept-Language header per request, and classifies a response as blocked only when it has no organic result container, is a non-200 status, or matches a known captcha/consent interstitial β€” not on loose keyword matching. A blocked or failed page is retried up to three times with a fresh proxy IP and a randomized delay between attempts.

How does LinkedIn Lead Scraper compare to other LinkedIn scrapers?

As observed on the Apify Store on 2026-07-26, both olympus/b2b-leads-finder and olympus/b2b-leads-finder-rental require a pasted LinkedIn session cookie and take a pre-built search URL as input, rather than free-text keywords. chieftools/b2b-linkedin-lead-generator does not scrape LinkedIn directly β€” its README states it uses semantic web search and AI scoring to find companies and people, then extracts LinkedIn profile URLs from publicly indexed web data. LinkedIn Lead Scraper instead runs live Google site:linkedin.com queries with no login and no pre-built URL required, and validates phones/emails rather than estimating a coverage percentage.

Does LinkedIn Lead Scraper return data in a format LLMs can use directly?

Yes. Typed, normalized JSON with stable field names β€” no HTML, no selectors. Pass it directly into an LLM context window, index it into a vector store, or route it through an agent tool.

Can I use LinkedIn Lead Scraper without managing proxies?

Yes. The Actor provisions and rotates Apify Proxy in the GOOGLE_SERP group automatically through the proxyConfiguration input; you only need to leave the default in place or select a different Apify proxy group.

What happens when LinkedIn changes its structure or blocks the scraper?

The Actor is maintained, and its output schema stays stable β€” field names and types on your end do not change. No numeric turnaround time is published for fixes.

πŸ’¬ Your feedback

Found a bug, or a field that's missing or wrong? We want to know. Open an issue on the Actor's Issues tab in the Apify Console, and API-Empire will review it.