LinkedIn has more than 1 billion member profiles. Every recruiter, sales team, investor, and researcher needs profile data from LinkedIn. And yet getting that data programmatically is genuinely difficult — not because the data is hidden, but because LinkedIn has built one of the most aggressive anti-scraping systems on the web, and the alternatives are either expensive seat-based subscriptions or fragile in-house scrapers.
This post covers what data is actually available on LinkedIn profiles, why it's hard to get at scale, who needs it and why, and how to run our actor to extract it without building or maintaining any scraping infrastructure.
Why LinkedIn profile data is hard to get
There is no real official API. LinkedIn's public API does not expose member profile data to general developers. The endpoints that do exist are gated behind partnership programs (Talent Solutions, Sales Navigator API) that require a partner application, an enterprise contract, and a specific approved use case. For a solo recruiter or a small sales team doing list enrichment, the official API is effectively closed.
Sales Navigator is per-seat, not per-record. The most common workaround — Sales Navigator at $99/seat/month — gives a human the ability to browse profiles, but it doesn't give you a programmatic export. Bulk extraction violates LinkedIn's ToS for that product, and accounts get flagged quickly when used with browser automation.
The anti-scraping stack is serious. LinkedIn runs browser fingerprinting, behavioral analysis, IP reputation scoring, and bot challenge pages. A naive Python script gets blocked within minutes. Even headless browsers get flagged quickly without significant evasion infrastructure. High-volume profile extraction requires residential proxies and ongoing maintenance as LinkedIn updates its detection methods — sometimes weekly.
Profile pages are auth-walled in different ways depending on viewer state. A logged-out visitor sees a public preview. A logged-in visitor sees the full profile. Different proxy strategies, session strategies, and parsing logic apply to each — and getting reliable, consistent extraction across millions of profiles is a real engineering problem.
Terms of service add legal ambiguity. The hiQ Labs v. LinkedIn ruling (affirmed by the Ninth Circuit) established that scraping publicly available data is not a Computer Fraud and Abuse Act violation. The data on public profile pages — the kind visible to any logged-out visitor — sits in the clearest legal territory. Anything behind login is a different conversation.
The result: most teams either pay for expensive enrichment vendors (ZoomInfo, Apollo, Clay), build fragile in-house scrapers that need constant maintenance, or do it manually. None of these scale to the volumes most use cases actually need.
Who actually needs this data
Recruiting and talent sourcing. Identifying candidates by current role, experience, skills, and location is the standard recruiting workflow. Sourcers spend hours per week building shortlists. Automated profile extraction across a Boolean search result turns 4 hours of copy-paste into a 5-minute job.
B2B sales prospecting. Outbound teams enrich lead lists with current title, current employer, and seniority before scoring them against the ICP. The difference between a generic blast and a real personalized opener is whether you know what someone actually does today — not what their LinkedIn URL said three years ago.
Investor due diligence. Before a pre-seed call, investors check the founders' previous companies, education, and length of relevant experience. This is profile-level data, and right now it's mostly done manually by associates flipping between tabs.
Market and labor research. Researchers studying career trajectories, skills demand, or labor market shifts need bulk profile data as raw material. Same fields that power individual sales workflows also power dashboards on what skills are growing in a sector and where talent is concentrated.
Sales intelligence products. Anyone building a tool on top of LinkedIn signals — change-of-job alerts, hiring trend tools, revenue-per-employee benchmarks — needs profile data as input. The tools that look like magic from the outside are mostly clean profile extraction on the inside.
What data you actually get
Our actor extracts the following fields from public LinkedIn profile pages — no login required:
- full_name — first and last name as listed on LinkedIn
- headline — the tagline under the name (current role / personal pitch)
- location — city, region, country
- about — full "About" section text
- current_position — most recent role title and company
- experience — list of past roles with title, company, dates, and description
- education — schools, degrees, fields of study, dates
- skills — self-reported skills list
- certifications — listed certifications with issuer and date
- languages — listed languages with proficiency
- connection_count — connection range (e.g., "500+")
- follower_count — LinkedIn follower count
- profile_url — canonical LinkedIn profile URL
- avatar_url — URL to the profile photo
- scraped_at — timestamp of extraction
How to run the actor
Via Apify Console (no code needed):
- Go to apify.com/cryptosignals/linkedin-profile-scraper
- Click Try for free
- Paste your profile list into the
profilesfield — accepts LinkedIn slugs (e.g.,williamhgates) or full URLs - Set
max_resultsif you want to cap the run - Click Start and download results as JSON or CSV
Input JSON:
{
"profiles": [
"williamhgates",
"https://www.linkedin.com/in/satyanadella",
"jeffweiner08"
],
"max_results": 50
}
Via Apify API:
curl -X POST "https://api.apify.com/v2/acts/cryptosignals~linkedin-profile-scraper/runs" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_APIFY_TOKEN" \
-d '{
"profiles": ["williamhgates", "satyanadella"],
"max_results": 10
}'
Sample output record:
{
"profile_id": "satyanadella",
"full_name": "Satya Nadella",
"headline": "Chairman and CEO at Microsoft",
"location": "Redmond, Washington, United States",
"about": "As chairman and CEO of Microsoft, I define my mission...",
"current_position": {
"title": "Chairman and CEO",
"company": "Microsoft"
},
"experience": [
{
"title": "Chairman and CEO",
"company": "Microsoft",
"start_date": "2014-02",
"end_date": null,
"description": "Leading Microsoft as chairman and CEO."
}
],
"education": [
{
"school": "The University of Chicago Booth School of Business",
"degree": "MBA"
}
],
"skills": ["Cloud Computing", "Strategy", "Leadership"],
"connection_count": "500+",
"follower_count": "11200000",
"profile_url": "https://www.linkedin.com/in/satyanadella",
"avatar_url": "https://media.licdn.com/dms/image/...",
"scraped_at": "2026-05-04T09:00:00+00:00"
}
Pricing
The actor uses pay-per-event pricing: $0.012 per profile. The first 5 results are free so you can verify output quality before committing. For a list of 1,000 profiles, that's $12 — roughly the cost of a single coffee meeting, returning a structured dataset that would take a sourcer two days to compile manually.
For high-volume runs (10,000+ profiles), residential proxy coverage matters for reliability. Oxylabs is the proxy infrastructure we've tested for this kind of workload — their residential network handles LinkedIn's IP reputation checks without the constant rotation failures that plague datacenter proxies.
What you don't get
Profile pages don't include private email addresses or phone numbers. LinkedIn doesn't expose those publicly, and neither does this actor. For contact-level data, you need a separate enrichment step using a waterfall provider. The actor extracts profile-level public metadata — the data visible to any unauthenticated visitor.
The actor also does not extract private posts, private connections lists, or anything behind login. If your use case needs that, it doesn't belong in a public-data scraper — and it doesn't belong in a blog post either.
The alternative
You can build this yourself. The engineering work involves: handling LinkedIn's anti-bot detection, managing residential proxy rotation, parsing the structured profile data out of pages that ship as a JavaScript app, dealing with partial responses and retry logic, normalizing the experience and education sections (which have a dozen edge cases each), and maintaining the scraper when LinkedIn changes its page structure — which happens several times per year.
That's 3-6 weeks of engineering time to build a reliable version, and ongoing maintenance after that. At $0.012 per profile, you'd need to scrape over 500,000 profiles before the build-vs-buy math favors building.
For most teams, the answer is clear.
Actor: apify.com/cryptosignals/linkedin-profile-scraper
By: Web Data Labs — data infrastructure for B2B teams.
Top comments (0)