LinkedIn Profile Scraper
Pricing
Pay per usage
LinkedIn Profile Scraper
Scrape public LinkedIn profiles without login when data is public. Extract name, headline, location, about, experience, education, skills, connections, and current company/title for GTM and lead enrichment.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Harsh
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
Scrape public LinkedIn profile data for GTM, outbound, and lead enrichment — name, headline, location, about, experience, education, skills, connections, and current company/title. Built with TypeScript and Crawlee CheerioCrawler (HTTP-first, no browser) using multi-strategy extraction (JSON-LD, meta tags, public DOM, embedded state).
Run it on the Apify platform for scheduling, API access, residential proxy rotation, monitoring, and dataset exports (JSON, CSV, Excel, HTML).
Legal / ToS notice: This Actor is intended for publicly available data only. It does not log into LinkedIn. Respect LinkedIn Terms of Service, robots rules, and applicable privacy laws (GDPR/CCPA). Do not use this tool to scrape private content, bypass authentication, or harass people. You are responsible for how you use the data.
What does LinkedIn Profile Scraper do?
Given a list of LinkedIn profile URLs, this Actor:
- Deduplicates profile URLs (case-insensitive
/in/slugs) - Loads each public profile page over HTTP (Cheerio — no headless browser)
- Extracts profile fields: full name, headline, location, about/summary, current company & title, connections/followers text, profile ID when present
- Extracts experience, education, and skills when they appear in public HTML / structured data
- Handles auth walls, blocks, and missing profiles gracefully — writes a dataset row with an
errorfield and exits 0 - Pushes clean JSON dataset items
- Exports PROFILES.csv and SUMMARY.md to the key-value store
Ideal for outbound / GTM stacks, warm-lead enrichment, and CRM backfill where Apollo-style profile data is needed at scale.
Why use LinkedIn Profile Scraper?
- Lead enrichment — turn
/in/URLs into structured person records for your CRM - Outbound research — pull headlines, current roles, and locations before personalizing emails
- Talent & market intel — sample public experience and skills for role mapping
- Automation-ready — JSON dataset + CSV export + Apify API, schedules, and webhooks
Proxy necessity (important)
LinkedIn aggressively rate-limits and auth-walls unauthenticated traffic, especially from datacenter IPs. For production runs:
| Setting | Recommendation |
|---|---|
| Proxy | Apify Proxy RESIDENTIAL (default in input schema) |
maxConcurrency | 1–2 |
requestDelayMs | 1500–3000+ |
maxRequestRetries | 3+ |
Without residential proxies you will often see sign-in walls or empty shells. The Actor detects these and writes an error on the profile record instead of crashing the run.
Data depth note: Public / guest LinkedIn HTML is limited. Full experience histories, complete skills graphs, and connection counts beyond “500+” often require a logged-in session — which this Actor intentionally does not use. You get what LinkedIn exposes publicly for that URL/IP.
How to scrape LinkedIn profiles
- Open the Actor in Apify Console
- Paste one or more profile URLs (e.g.
https://www.linkedin.com/in/williamhgates/) - Keep residential proxy enabled
- Click Start
- Download results from the Dataset tab or key-value store (
PROFILES.csv,SUMMARY.md)
Input
| Field | Type | Default | Description |
|---|---|---|---|
profileUrls | string[] | [] (required) | LinkedIn /in/ profile URLs (deduped) |
maxConcurrency | integer | 2 | Concurrent requests (keep low) |
maxRequestRetries | integer | 3 | HTTP retry count |
requestDelayMs | integer | 1500 | Used for rate limiting |
proxyConfiguration | object | Residential on | Apify Proxy settings |
Example:
{"profileUrls": ["https://www.linkedin.com/in/williamhgates/","https://www.linkedin.com/in/satyanadella/"],"maxConcurrency": 2,"maxRequestRetries": 3,"requestDelayMs": 1500,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
See also ./examples/input.json.
Output
Each dataset item is one profile:
{"fullName": "Jane Doe","headline": "Senior Software Engineer at Acme Corp","location": "San Francisco Bay Area","about": "Builder of reliable data platforms...","currentCompany": "Acme Corp","currentTitle": "Senior Software Engineer","profileUrl": "https://www.linkedin.com/in/jane-doe","profileId": "123456789","connectionsText": "500+ connections","followersText": "12K followers","experience": [{"title": "Senior Software Engineer","company": "Acme Corp","companyUrl": "https://www.linkedin.com/company/acme-corp","location": "San Francisco, CA","dateRange": "Jan 2022 – Present · 3 yrs","description": "Building core data APIs and event pipelines.","isCurrent": true}],"education": [{"school": "Stanford University","schoolUrl": "https://www.linkedin.com/school/stanford-university","degree": "Master of Science","fieldOfStudy": "Computer Science","dateRange": "2016 – 2018","description": null}],"skills": ["TypeScript", "Node.js", "Distributed Systems"],"scrapedAt": "2026-07-18T12:00:00.000Z","error": null}
You can download the dataset in JSON, HTML, CSV, Excel, and other formats from the Apify Console.
Data fields
| Field | Description |
|---|---|
fullName | Display name |
headline | Profile headline |
location | Location text when public |
about | About / summary section |
currentCompany | Current employer (experience or headline) |
currentTitle | Current title (experience or headline) |
profileUrl | Canonical /in/ URL |
profileId | Member ID when detectable |
connectionsText | e.g. 500+ connections |
followersText | Followers caption when public |
experience | Array of roles |
education | Array of schools |
skills | Skill name strings |
scrapedAt | ISO timestamp |
error | Non-null on block / not found / failure |
How much does it cost to scrape LinkedIn profiles?
This Actor uses Pay-per-event (PPE) pricing:
- Actor start: small fixed fee per run
- Profile result: $0.005 per dataset item (
apify-default-dataset-item)
Example: 200 profiles ≈ $1.00 (plus start event and platform compute / proxy). Free Apify tier credits apply as usual.
Residential proxy usage is billed separately by Apify Proxy.
Tips for better results
- Prefer canonical
https://www.linkedin.com/in/{slug}/URLs - Keep concurrency low and delay high when batching hundreds of profiles
- Use residential proxies; rotate or retry profiles that return auth walls
- Expect partial public data — LinkedIn often hides long experience lists from guests
- Deduplication is automatic; safe to re-submit overlapping URL lists
- Failed / blocked profiles still produce a row with
errorso your pipeline can retry later
FAQ, disclaimers, and support
Does this Actor log into LinkedIn?
No. It only requests public profile HTML. No cookies, no credentials, no session takeover.
Why are many fields null?
LinkedIn frequently serves auth walls or thin public cards. Enable residential proxies, lower concurrency, and retry. Some profiles simply do not expose experience/skills to guests.
Is scraping LinkedIn legal?
Laws vary by jurisdiction and use case. Public data scraping can still violate site ToS. Consult counsel for your use case. This tool is provided as-is for legitimate research and enrichment of publicly available information.
Can you build a custom solution?
Yes — open an Issue on the Actor page or contact the developer for higher-volume pipelines, logged-in enterprise connectors (where permitted), or CRM integrations.
Feedback
Use the Issues tab on the Apify Store Actor page for bugs and feature requests.
Local development
npm installnpm run lintnpm run formatnpm run buildnpm testapify run --purge
Copy examples/input.json into storage/key_value_stores/default/INPUT.json for local runs.
Deploy
apify loginapify push
Project structure
.actor/ Actor config + input/output/dataset schemassrc/main.ts Entry point (CheerioCrawler)routes.ts Profile page router + sanitizationextractors.ts JSON-LD / meta / DOM / embedded JSON extractorsutils.ts URL helpers, block detection, text utilscsv.ts PROFILES.csv + SUMMARY.md exporterstypes.ts TypeScript typestest/fixtures/ HTML fixtures for unit testsextractors.test.tsmain.test.tsexamples/ Sample input/output
License
Apache-2.0