Linkedin People Scraper avatar

Linkedin People Scraper

Under maintenance

Pricing

from $5.00 / 1,000 results

Go to Apify Store
Linkedin People Scraper

Linkedin People Scraper

Under maintenance

Pricing

from $5.00 / 1,000 results

Rating

0.0

(0)

Developer

Dev with Bobby

Dev with Bobby

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

5 days ago

Last modified

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:

  1. Install the Cookie-Editor browser extension
  2. Log into your LinkedIn account
  3. Click the Cookie-Editor icon while on linkedin.com
  4. Click Export to copy all cookies as JSON
  5. 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/williamhgates
linkedin.com/in/satyanadella
in/jeffweiner08
jeffweiner08

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

ParameterTypeRequiredDefaultDescription
cookieArrayYes-LinkedIn cookies exported from Cookie-Editor (JSON array)
urlsArrayYes-LinkedIn profile URLs to scrape
userAgentStringYesChrome 131Browser user agent (must match the browser used to export cookies)
scrapeCompanyBooleanNofalseAlso scrape the current company's LinkedIn page
minDelayIntegerNo15Minimum seconds to wait between profiles (min: 5)
maxDelayIntegerNo60Maximum seconds to wait between profiles (min: 30)
proxyObjectYesResidentialProxy configuration (residential recommended)
findContactsBooleanNofalseFind email addresses via ContactCompass API
contactCompassTokenStringNo-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

FieldTypeDescription
idStringLinkedIn member ID
profileIdStringLinkedIn profile entity ID
firstNameStringFirst name
lastNameStringLast name
headlineStringProfile headline
occupationStringCurrent occupation
summaryStringAbout section text
publicIdentifierStringLinkedIn public URL slug
trackingIdStringLinkedIn tracking identifier
pictureUrlStringProfile photo URL
coverImageUrlStringBanner/cover photo URL
studentBooleanWhether marked as a student
connectionTypeStringConnection degree (1st, 2nd, 3rd+)

Location and industry

FieldTypeDescription
geoLocationNameStringCity and region
geoCountryNameStringCountry name
geoUrnStringLinkedIn geo URN
countryCodeStringCountry identifier
industryNameStringIndustry name
industryUrnStringLinkedIn industry URN

Current employment

FieldTypeDescription
jobTitleStringCurrent job title
companyNameStringCurrent company name
companyPublicIdStringCompany LinkedIn slug
companyLinkedinUrlStringCompany LinkedIn URL
currentCompanyObjectFull company data (when scrapeCompany is enabled)

Professional history (arrays)

FieldTypeDescription
positionsArrayWork experience with title, company, dates, location, description
educationsArraySchools, degrees, fields of study, dates
skillsArrayProfessional skills list
certificationsArrayCertifications with authority and dates
coursesArrayCompleted courses
languagesArrayLanguages with proficiency levels
honorsArrayAwards and recognitions
volunteerExperiencesArrayVolunteer roles with organizations and causes

Enrichment

FieldTypeDescription
emailStringEmail address (when findContacts is enabled)
currentCompanyObjectCompany details: name, industry, size, headquarters, specialties, website, description (when scrapeCompany is enabled)

Metadata

FieldTypeDescription
metaDataObjectPage title, viewee locale data, verification info
inputUrlStringThe URL you provided
scrapedUrlStringFinal URL after navigation
scrapedAtStringISO timestamp of extraction
dataSourceStringActor identifier
isPartialDataBooleanWhether DOM fallback was used (API interception missed)

How it works

This Actor uses a two-phase data extraction strategy for maximum reliability:

  1. Voyager API interception (primary) - LinkedIn's frontend makes internal API calls to /voyager/api/identity/dash/profiles and /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.

  2. 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 with isPartialData: 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:

ComponentCost 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:

ProfilesActor feePlatform costTotal
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.
  • Cookies expire periodically. If you see "Auth wall" errors, re-export your cookies from a fresh LinkedIn session.
  • The li_at cookie 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: true used 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.

  1. Sign up at contactcompass.io and get your API token
  2. Set Find Emails to true in the Actor input
  3. 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 ApifyClient
client = 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.

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.