Linkedin People Scraper
Pricing
from $5.00 / 1,000 results
Linkedin People Scraper
Pricing
from $5.00 / 1,000 results
Rating
0.0
(0)
Developer

Dev with Bobby
Actor stats
0
Bookmarked
1
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
LinkedIn People Profile Scraper
Extract comprehensive LinkedIn profile data including work experience, education, skills, certifications, languages, and more. Provide LinkedIn profile URLs and get back structured JSON with 40+ data fields per profile.
What does LinkedIn People Profile Scraper do?
This Actor scrapes LinkedIn people profiles and returns structured data that you can export as JSON, CSV, or Excel. It uses LinkedIn's internal Voyager API interception to extract the same rich data that LinkedIn's own frontend uses, with DOM extraction as a fallback for maximum reliability.
For each profile, you get:
- Full name, headline, summary, and profile picture
- Complete work history with titles, companies, dates, and descriptions
- Education history with schools, degrees, and fields of study
- Skills, certifications, courses, and languages
- Volunteer experiences, honors, and awards
- Current company details including industry, size, and specialties (optional)
- Email address via ContactCompass integration (optional)
- Geographic location, industry, and connection degree
Why scrape LinkedIn profiles?
- Sales and recruiting - Build targeted prospect lists with verified professional details, job titles, and company information
- Lead enrichment - Augment your CRM contacts with fresh LinkedIn data including skills, experience, and education
- Market research - Analyze talent pools, competitor teams, and industry trends at scale
- Academic research - Study professional networks, career trajectories, and labor market dynamics
- Competitive intelligence - Track executive movements, team composition, and hiring patterns
How to scrape LinkedIn profiles
Step 1: Get your LinkedIn cookies
This Actor uses cookie-based authentication to access LinkedIn as a logged-in user. You need to export your browser cookies:
- Install the Cookie-Editor browser extension
- Log into your LinkedIn account
- Click the Cookie-Editor icon while on linkedin.com
- Click Export to copy all cookies as JSON
- Paste the JSON array into the LinkedIn Cookies input field
Step 2: Add profile URLs
Enter one or more LinkedIn profile URLs. The Actor accepts multiple formats:
https://www.linkedin.com/in/williamhgateslinkedin.com/in/satyanadellain/jeffweiner08jeffweiner08
Step 3: Configure proxy
Select a residential proxy from the same country where your LinkedIn account is normally used. Using a proxy from a different country may trigger LinkedIn security checks.
Step 4: Run and download
Click Start and wait for the extraction to complete. Download your data as JSON, CSV, or Excel from the Storage tab.
Input options
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
cookie | Array | Yes | - | LinkedIn cookies exported from Cookie-Editor (JSON array) |
urls | Array | Yes | - | LinkedIn profile URLs to scrape |
userAgent | String | Yes | Chrome 131 | Browser user agent (must match the browser used to export cookies) |
scrapeCompany | Boolean | No | false | Also scrape the current company's LinkedIn page |
minDelay | Integer | No | 15 | Minimum seconds to wait between profiles (min: 5) |
maxDelay | Integer | No | 60 | Maximum seconds to wait between profiles (min: 30) |
proxy | Object | Yes | Residential | Proxy configuration (residential recommended) |
findContacts | Boolean | No | false | Find email addresses via ContactCompass API |
contactCompassToken | String | No | - | ContactCompass API token for email finding |
Input example
{"cookie": [{"name": "li_at", "value": "YOUR_SESSION_VALUE", "domain": ".linkedin.com"},{"name": "JSESSIONID", "value": "YOUR_JSESSIONID", "domain": ".linkedin.com"}],"urls": ["https://www.linkedin.com/in/williamhgates","https://www.linkedin.com/in/satyanadella"],"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36","scrapeCompany": false,"minDelay": 15,"maxDelay": 60,"proxy": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
Output
Each scraped profile produces a JSON object with 40+ fields. Here is a sample output:
{"id": "12345678","profileId": "ACoAABcXYZaBcDeFgHiJkLmNoPqRsTuVwXyZ","firstName": "Bill","lastName": "Gates","headline": "Co-chair, Bill & Melinda Gates Foundation","occupation": "Co-chair, Bill & Melinda Gates Foundation","summary": "Co-chair of the Bill & Melinda Gates Foundation. Founder of Breakthrough Energy...","publicIdentifier": "williamhgates","trackingId": "abc123def456","pictureUrl": "https://media.licdn.com/dms/image/...","coverImageUrl": "https://media.licdn.com/dms/image/...","industryName": "Philanthropy","industryUrn": "urn:li:fsd_industry:101","geoLocationName": "Seattle, Washington","geoCountryName": "United States","geoUrn": "urn:li:fsd_geo:103820506","countryCode": "United States","student": false,"connectionType": "3rd+","jobTitle": "Co-chair","companyName": "Bill & Melinda Gates Foundation","companyPublicId": "bill-and-melinda-gates-foundation","companyLinkedinUrl": "https://www.linkedin.com/company/bill-and-melinda-gates-foundation","positions": [{"title": "Co-chair","companyName": "Bill & Melinda Gates Foundation","locationName": "Seattle, Washington","description": "...","timePeriod": {"startDate": {"month": 1, "year": 2000}}}],"educations": [{"schoolName": "Harvard University","degreeName": null,"fieldOfStudy": null,"description": null,"timePeriod": {"startDate": {"year": 1973},"endDate": {"year": 1975}}}],"skills": ["Public Speaking", "Strategic Partnerships", "Philanthropy"],"certifications": [],"courses": [],"languages": [],"honors": [],"volunteerExperiences": [],"currentCompany": null,"email": null,"metaData": {"pageTitle": "Bill Gates - Co-chair - Bill & Melinda Gates Foundation | LinkedIn","viewee": {"firstName": "Bill","lastName": "Gates","publicIdentifier": "williamhgates","maidenName": null,"versionTag": "1234567890","multiLocaleFirstName": [{"en_US": "Bill"}],"multiLocaleLastName": [{"en_US": "Gates"}],"multiLocaleMaidenName": [],"multiLocaleFullNamePronunciationAudio": [],"primaryLocale": {"country": "US", "language": "en"},"entityUrn": "urn:li:fsd_profile:ACoAABcXYZaBcDeFgHiJkLmNoPqRsTuVwXyZ"},"verifiedProfileInfoSection": null},"inputUrl": "https://www.linkedin.com/in/williamhgates","scrapedUrl": "https://www.linkedin.com/in/williamhgates/","scrapedAt": "2026-03-08T12:00:00.000Z","dataSource": "devwithbobby/linkedin-people-scraper","isPartialData": false}
Output fields reference
Core profile
| Field | Type | Description |
|---|---|---|
id | String | LinkedIn member ID |
profileId | String | LinkedIn profile entity ID |
firstName | String | First name |
lastName | String | Last name |
headline | String | Profile headline |
occupation | String | Current occupation |
summary | String | About section text |
publicIdentifier | String | LinkedIn public URL slug |
trackingId | String | LinkedIn tracking identifier |
pictureUrl | String | Profile photo URL |
coverImageUrl | String | Banner/cover photo URL |
student | Boolean | Whether marked as a student |
connectionType | String | Connection degree (1st, 2nd, 3rd+) |
Location and industry
| Field | Type | Description |
|---|---|---|
geoLocationName | String | City and region |
geoCountryName | String | Country name |
geoUrn | String | LinkedIn geo URN |
countryCode | String | Country identifier |
industryName | String | Industry name |
industryUrn | String | LinkedIn industry URN |
Current employment
| Field | Type | Description |
|---|---|---|
jobTitle | String | Current job title |
companyName | String | Current company name |
companyPublicId | String | Company LinkedIn slug |
companyLinkedinUrl | String | Company LinkedIn URL |
currentCompany | Object | Full company data (when scrapeCompany is enabled) |
Professional history (arrays)
| Field | Type | Description |
|---|---|---|
positions | Array | Work experience with title, company, dates, location, description |
educations | Array | Schools, degrees, fields of study, dates |
skills | Array | Professional skills list |
certifications | Array | Certifications with authority and dates |
courses | Array | Completed courses |
languages | Array | Languages with proficiency levels |
honors | Array | Awards and recognitions |
volunteerExperiences | Array | Volunteer roles with organizations and causes |
Enrichment
| Field | Type | Description |
|---|---|---|
email | String | Email address (when findContacts is enabled) |
currentCompany | Object | Company details: name, industry, size, headquarters, specialties, website, description (when scrapeCompany is enabled) |
Metadata
| Field | Type | Description |
|---|---|---|
metaData | Object | Page title, viewee locale data, verification info |
inputUrl | String | The URL you provided |
scrapedUrl | String | Final URL after navigation |
scrapedAt | String | ISO timestamp of extraction |
dataSource | String | Actor identifier |
isPartialData | Boolean | Whether DOM fallback was used (API interception missed) |
How it works
This Actor uses a two-phase data extraction strategy for maximum reliability:
-
Voyager API interception (primary) - LinkedIn's frontend makes internal API calls to
/voyager/api/identity/dash/profilesand/voyager/api/identity/profiles/. The Actor intercepts these responses via Playwright's network listener to capture the same structured JSON data that powers LinkedIn's UI. This provides the most complete and accurate data. -
DOM scraping (fallback) - If API interception doesn't capture sufficient data, the Actor falls back to extracting from meta tags (
og:title,og:description,og:image) and visible page elements. Data extracted this way is marked withisPartialData: true.
Anti-detection measures
- Browser fingerprint randomization across Chrome, macOS, and Windows
- Randomized viewport sizes for each session
- WebDriver property masking to avoid automation detection
- Realistic HTTP headers matching real Chrome browsers
- Configurable random delays between profile visits
- Session pool management with automatic rotation
How much will it cost to scrape LinkedIn profiles?
This Actor charges $5.00 per 1,000 results (pay-per-result). You only pay for profiles successfully scraped. On top of that, there are Apify platform costs for compute time and residential proxy bandwidth.
Cost breakdown per profile:
| Component | Cost per 1,000 profiles |
|---|---|
| Actor usage fee | $5.00 |
| Compute (Playwright browser) | ~$2.00 |
| Residential proxy bandwidth | ~$10 - $30 |
| Total | ~$17 - $37 per 1,000 profiles |
With Apify's free tier ($5 in monthly credits), you can offset some of the platform compute and proxy costs.
Estimated total costs at scale:
| Profiles | Actor fee | Platform cost | Total |
|---|---|---|---|
| 100 | $0.50 | ~$1 - $3 | ~$1.50 - $3.50 |
| 500 | $2.50 | ~$6 - $17 | ~$8.50 - $19.50 |
| 1,000 | $5.00 | ~$12 - $32 | ~$17 - $37 |
| 5,000 | $25.00 | ~$60 - $160 | ~$85 - $185 |
Tips for reliable scraping
Protect your LinkedIn account
- Keep delays high. The default 15-60 second range between profiles is recommended. Lowering delays increases detection risk.
- Stay under 500 profiles per day per LinkedIn account. The Actor will warn you if you exceed this.
- Use residential proxies from the same country as your normal LinkedIn login. Datacenter proxies are blocked by LinkedIn.
- Match your user agent to the browser you used to export cookies. Mismatched user agents may trigger security checks.
Cookie management
- Cookies expire periodically. If you see "Auth wall" errors, re-export your cookies from a fresh LinkedIn session.
- The
li_atcookie is the most important one. If it's missing, authentication will fail. - Export all cookies from Cookie-Editor, not just specific ones.
Maximize data quality
- Enable Scrape Current Company Page to get detailed company data (adds ~5-10 seconds per profile).
- Enable Find Emails with a ContactCompass token to enrich profiles with email addresses. ContactCompass offers 20,000 free email lookups.
- Profiles with
isPartialData: trueused DOM fallback instead of API interception. This typically means LinkedIn's API responses weren't captured. The data is still useful but may have fewer fields populated.
Email finding with ContactCompass
This Actor integrates with ContactCompass to find professional email addresses for scraped profiles.
- Sign up at contactcompass.io and get your API token
- Set Find Emails to
truein the Actor input - Paste your API token in the ContactCompass API Token field
ContactCompass offers 20,000 free email lookups on signup. Found emails are added to the email field in the output.
Company page scraping
When Scrape Current Company Page is enabled, the Actor navigates to each profile's current employer's LinkedIn company page and extracts:
- Company name, industry, and type
- Employee count and size range
- Headquarters location
- Website URL
- Company description and specialties
- Founded date
- Logo and cover image URLs
- Follower count
This data is added as the currentCompany object in the output.
Integrations
Connect this Actor with your existing tools using Apify's integration options:
- API - Call the Actor via REST API from any programming language
- Webhooks - Get notified when a run completes
- Zapier - Connect to 5,000+ apps without code
- Make - Build automated workflows
- Google Sheets - Export results directly to spreadsheets
- Slack - Send notifications to channels
Python example
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("devwithbobby/linkedin-people-scraper").call(run_input={"cookie": [{"name": "li_at", "value": "YOUR_COOKIE", "domain": ".linkedin.com"}],"urls": ["https://www.linkedin.com/in/williamhgates"],"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(f"{item['firstName']} {item['lastName']} - {item['headline']}")
Node.js example
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('devwithbobby/linkedin-people-scraper').call({cookie: [{ name: 'li_at', value: 'YOUR_COOKIE', domain: '.linkedin.com' }],urls: ['https://www.linkedin.com/in/williamhgates'],userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',});const { items } = await client.dataset(run.defaultDatasetId).listItems();items.forEach(item => console.log(`${item.firstName} ${item.lastName} - ${item.headline}`));
Limitations
- Requires cookies - This Actor needs your LinkedIn session cookies to authenticate. Cookies expire and need to be re-exported periodically.
- Rate limited - LinkedIn actively detects automation. The Actor runs at max 1 concurrent request with randomized delays to protect your account.
- 500 profiles/day recommended - Exceeding this threshold per LinkedIn account increases the risk of temporary restrictions.
- Public profile data only - The Actor extracts data visible to you as a logged-in user. Private profiles with restricted visibility may return limited data.
- LinkedIn may change their API - LinkedIn's internal Voyager API structure can change without notice. If extraction breaks, updates will be released promptly.
Is it legal to scrape LinkedIn?
Web scraping is generally legal when you collect publicly available data. The landmark hiQ Labs v. LinkedIn ruling established that scraping publicly accessible data does not violate the Computer Fraud and Abuse Act.
However, you should always:
- Review LinkedIn's Terms of Service and assess your use case
- Comply with GDPR, CCPA, and other applicable data protection regulations
- Only collect data that is necessary for your stated purpose
- Not use scraped data for harassment, discrimination, or unauthorized commercial purposes
For more information, see Apify's article on web scraping legality.
Support
If you encounter issues or have feature requests:
- Open an issue on this Actor's Issues tab
- Contact the author via the Actor page
If the Actor fails with "Auth wall" errors, your cookies have likely expired. Re-export them from a fresh LinkedIn session and try again.