LinkedIn Profile Scraper
Pricing
from $10.00 / 1,000 profile scrapeds
LinkedIn Profile Scraper
Scrapes comprehensive LinkedIn profile data (experience, education, skills, email) from public profiles. Supports optional session cookie for authenticated scraping.
Pricing
from $10.00 / 1,000 profile scrapeds
Rating
0.0
(0)
Developer
Dino
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Scrapes comprehensive data from public LinkedIn profiles: identity, work experience, education, skills, languages, certifications, and more. Optionally infers and verifies professional email addresses.
Built with Crawlee for Python + Camoufox (stealthy Firefox) for reliable scraping with minimal bot detection.
Features
- Extracts full profile data: name, headline, summary, location, connections, followers, experience, education, skills, languages, certifications, publications, patents, volunteer work, recommendations
- Infers professional email addresses from company domain patterns
- Optional SMTP email verification
- Optional LinkedIn session cookie for authenticated scraping (unlocks more data)
- Optional Apify proxy or local Tor proxy support
- Pipeline mode: consume URLs from a named RequestQueue (for use with a discovery actor)
- Graceful per-profile error handling — one failure never aborts the whole run
Input
| Field | Type | Default | Description |
|---|---|---|---|
profileUrls | string[] | — | LinkedIn /in/ profile URLs to scrape. Required (unless using inputRequestQueueName). |
maxProfiles | integer | unlimited | Cap the number of profiles processed. |
maxConcurrency | integer | 1 | Parallel browser tabs (max 5). Keep at 1–2 to avoid blocks. |
requestDelay | integer | 3000 | Milliseconds to wait between requests. Higher = safer. |
proxyConfiguration | object | disabled | Apify proxy config. Recommended when running on the platform. |
linkedinCookies | string | — | Value of the li_at LinkedIn session cookie. Enables authenticated scraping. |
verifyEmail | boolean | false | Verify inferred emails via SMTP. Slower but more accurate. |
inputRequestQueueName | string | — | Name of an Apify RequestQueue to consume URLs from (pipeline mode). Overrides profileUrls. |
Example input
{"profileUrls": ["https://www.linkedin.com/in/williamhgates","https://www.linkedin.com/in/jeffweiner08"],"maxConcurrency": 1,"requestDelay": 4000,"proxyConfiguration": { "useApifyProxy": true }}
Using a session cookie
Providing a LinkedIn session cookie (li_at) allows the scraper to access authenticated profile data and greatly reduces the risk of bot blocks.
To find your cookie:
- Log in to LinkedIn in your browser
- Open DevTools → Application → Cookies →
linkedin.com - Copy the value of
li_at - Paste it into the
linkedinCookiesinput field
The cookie is marked
isSecretand will not appear in logs.
Output
Each profile produces one record in the default dataset. On success:
{"linkedinUrl": "https://www.linkedin.com/in/williamhgates","linkedinPublicUrl": "https://linkedin.com/in/williamhgates","publicIdentifier": "williamhgates","urn": "ACoAAABxN1IBk82L_jCY2opFKNZpSCCcsr6X1MU","firstName": "Bill","lastName": "Gates","fullName": "Bill Gates","headline": "Co-chair, Bill & Melinda Gates Foundation","summary": "...","profilePictureUrl": "https://...","backgroundPictureUrl": "https://...","location": "Seattle, Washington, United States","connections": 500,"followers": 35000000,"email": "bill.gates@gatesfoundation.org","emailVerificationStatus": "valid","jobTitle": "Co-chair","jobStartedOn": "2021-01","jobLocation": "Seattle, Washington, United States","jobStillWorking": true,"currentJobDuration": "4 yrs","currentJobDurationInYrs": 4.0,"companyName": "Bill & Melinda Gates Foundation","companyIndustry": "Non-profit Organizations","companyWebsite": "https://www.gatesfoundation.org","companyLinkedin": "https://www.linkedin.com/company/gatesfoundation","companySize": "1001-5000","experiences": [{"companyName": "Bill & Melinda Gates Foundation","title": "Co-chair","jobDescription": "...","jobStartedOn": "2021-01","jobEndedOn": null,"jobStillWorking": true,"jobLocation": "Seattle, Washington, United States","companyWebsite": "https://www.gatesfoundation.org","companyIndustry": "Non-profit Organizations","companySize": "1001-5000"}],"educations": [{"schoolName": "Harvard University","degree": "...","fieldOfStudy": "...","startYear": 1973,"endYear": 1975}],"skills": [{ "title": "Strategic Planning" }],"languages": [{ "name": "English", "proficiency": "NATIVE_OR_BILINGUAL" }],"certifications": [],"publications": [],"patents": [],"volunteerWork": [],"recommendations": [],"succeeded": true}
On failure, a minimal error record is pushed and the run continues:
{"inputUrl": "https://www.linkedin.com/in/nonexistent-profile","succeeded": false,"error": "Profile not found or access denied."}
Email verification status values
| Value | Meaning |
|---|---|
valid | SMTP check passed — mailbox exists |
invalid | SMTP check failed — address rejected |
catch_all | Domain accepts all addresses — unverifiable |
unverified | SMTP check skipped (verifyEmail is false) |
no_email | No email was inferred |
Pipeline mode
This actor can consume profile URLs from a named Apify RequestQueue instead of the profileUrls input. This is useful when chaining it with a discovery actor that enqueues profiles for processing.
{"inputRequestQueueName": "linkedin-discovery-output"}
Set inputRequestQueueName to the same value as the discovery actor's outputRequestQueueName. The scraper will drain the queue and process all URLs found.
Anti-detection notes
- Keep
maxConcurrencyat 1 (default). LinkedIn blocks aggressive parallel scraping quickly. - Increase
requestDelayif you observe bot detection. 5000–10000 ms is safer for large batches. - Use a proxy (
proxyConfiguration) when running on the Apify platform — residential proxies work best. - Provide a session cookie (
linkedinCookies) to reduce blocks and access more profile data. - The scraper uses Camoufox — a hardened Firefox with realistic browser fingerprints — which passes most bot-detection heuristics.
Limitations
- Scrapes only publicly visible data. Fields hidden behind LinkedIn's login wall may not be available without a session cookie.
- LinkedIn's page structure changes frequently; some fields may occasionally fail to parse.
- Email inference is pattern-based (e.g.
firstname.lastname@company.com) and not guaranteed to be correct. UseverifyEmail: truefor higher accuracy.