LinkedIn Profile Scraper — Public Profile Data Extraction
Pricing
from $7.00 / 1,000 record scrapeds
LinkedIn Profile Scraper — Public Profile Data Extraction
Extract public profile data from LinkedIn without login. Gets name, headline, experience, education, skills, certifications, languages, and more.
Pricing
from $7.00 / 1,000 record scrapeds
Rating
0.0
(0)
Developer
bootforge
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
Share
LinkedIn Profile Scraper — Cookie-based Deep Profile Extraction
Scrape LinkedIn profile data with structured fields: name, headline, about, full experience history (reverse-chronological), education, skills, honors, projects, certifications, and optional contact info (email, phone, websites, twitter). Cookie-required — works on Apify residential proxy where no-cookie scrapers hit the authwall.
How to Scrape LinkedIn Profiles
- Reliable on Apify residential proxy — paste your
li_atcookie, get data. No-cookie scrapers can't access LinkedIn from cloud infrastructure anymore. - No surprise platform fees — single-line per-event pricing, all-in.
- Cookie persistence —
cookie_persist_keystores the cookie in your own per-account Apify KV store. Paste once, reuse across runs. We never see your credentials. - Resume cache — re-running the same URLs hits cache, you only pay for new work.
- Compass-friendly proxy config — Apify residential, Bright Data, Oxylabs, SmartProxy, or raw URLs.
- Open source — inspect the parser, no black box.
Why a cookie is required
LinkedIn now serves an authwall (HTTP 999 + login redirect) to anonymous requests from cloud IPs. Apify residential proxies are widely used and frequently flagged. Empirically: anonymous requests against any LinkedIn profile URL from Apify infrastructure return zero data. A li_at cookie bypasses this gate.
Other LinkedIn scrapers that claim "no cookie required" either:
- Run their own clean residential pools (not Apify), or
- Charge customers for runs that return mostly empty data.
Our actor is honest: cookie-required, predictable output, fair pricing.
⚠️ Critical setup — proxy country MUST match your cookie's country
LinkedIn ties session validity to IP geography. Your li_at cookie was issued to a session in a specific country (the country you live / sign in from). If you proxy through a different country, LinkedIn flags it as a session hijack and deauthorizes the cookie within 1-2 requests — you'll get HTTP 401 on every profile.
Always set proxy.country to the same country as your cookie.
| Where you sign into LinkedIn | Your proxy.country |
|---|---|
| United States | US |
| United Kingdom | GB |
| Vietnam | VN |
| Germany | DE |
| Japan | JP |
| etc. | (matching ISO-3166 code) |
"proxy": { "provider": "apify", "group": "RESIDENTIAL", "country": "US" }
If country is unset, Apify rotates IPs across all geos for every request — guaranteed deauth. The actor logs a loud warning when it detects this, but the right fix is to set the country in your input.
How to get your LinkedIn cookie
- Sign into LinkedIn in your normal browser
- Open DevTools (F12 / Cmd+Opt+I)
- Application tab → Storage → Cookies →
https://www.linkedin.com - Find the
li_atrow → copy the Value column - Paste into the
cookiefield of this actor's input - Note your sign-in country — that's the value you set in
proxy.country(see above)
Cookies typically last ~1 year. If a run starts returning 401s, the most common causes (in order): (1) proxy.country doesn't match your cookie's home geo, (2) cookie expired — paste a fresh one.
What You Get
Structured fields per profile (only present fields populate; missing sections stay empty):
Always populated when LinkedIn ships them:
name,headline,about,profile_photo_urlexperience(reverse-chronological, with company/title/location/start_date/end_date/description)education(school, degree, field of study, years)current_company,current_title,location(derived from your current job)premium,influencerbadges
Populated when LinkedIn ships them on your target profile (varies by privacy / completeness):
industry,connection_count_numeric,follower_countopen_to_work,verifiedskills(full list),skill_endorsements(per-skill counts)certifications,languages,volunteerhonors,publications,patents,projects,courses,organizations,test_scores
Optional contact-info enrichment (scrape_contact_info: true):
email,phones[],websites[],twitter[],ims[],birthday,address,interests[]
Quick Start
Single profile
{"profile_urls": ["https://www.linkedin.com/in/williamhgates/"],"cookie": "<your_li_at_cookie>","proxy": { "provider": "apify", "group": "RESIDENTIAL", "country": "US" }}
With contact info enrichment
{"profile_urls": ["https://www.linkedin.com/in/alice-walker-1234/"],"cookie": "<your_li_at_cookie>","scrape_contact_info": true,"proxy": { "provider": "apify", "group": "RESIDENTIAL", "country": "US" }}
Cookie persistence (paste once, reuse forever)
Tired of pasting the cookie every run? Set cookie_persist_key and the actor stores it in your own Apify Key-Value Store (named linkedin-profile-scraper-cookies, scoped to your account — we never see it).
First run — provide both cookie and cookie_persist_key:
{"profile_urls": ["https://www.linkedin.com/in/williamhgates/"],"cookie": "<your_li_at_cookie>","cookie_persist_key": "main","proxy": { "provider": "apify", "group": "RESIDENTIAL", "country": "US" }}
Subsequent runs — omit cookie, the actor reads from your KV:
{"profile_urls": ["https://www.linkedin.com/in/jeffweiner08/"],"cookie_persist_key": "main","proxy": { "provider": "apify", "group": "RESIDENTIAL", "country": "US" }}
Refresh when a cookie expires — provide a new cookie value alongside the same key, and it overwrites the saved copy.
Multiple LinkedIn accounts — use different keys (alice, bob, team-shared, etc.).
Sample Output
{"public_identifier": "alice-walker-1234","request_id": "5b1f4d2e3c8a4f6b9e7d2a1c8b4d6e9f","status": "ok","error": null,"profile_url": "https://www.linkedin.com/in/alice-walker-1234/","name": "Alice Walker","headline": "VP Engineering at TechCo","location": "Boston, MA","industry": "Software","profile_photo_url": "https://media.licdn.com/...","about": "Builder of teams and systems...","connection_count_numeric": 1234,"follower_count": 56789,"open_to_work": false,"premium": true,"verified": true,"current_company": "TechCo","current_title": "VP Engineering","experience": [{"company": "TechCo", "title": "VP Engineering", "location": "Boston, MA", "start_date": "Mar 2022", "end_date": "Present", "description": "..."},{"company": "PrevCo", "title": "Director", "location": "NYC, NY", "start_date": "Jan 2018", "end_date": "Feb 2022"}],"education": [{"school": "Stanford", "degree": "MS", "field_of_study": "Computer Science", "start_year": "2014", "end_year": "2016"}],"skills": ["Python", "Distributed Systems", "Leadership"],"honors": [{"title": "Forbes 30 Under 30", "issuer": "Forbes", "issued_on": "Mar 2022"}],"projects": [{"title": "Open-source ANN library", "url": "https://github.com/alice/ann"}],"contact": {"email": "alice@techco.com","phones": [{"number": "+1-555-0100", "type": "MOBILE"}],"websites": [{"url": "https://alice.dev", "category": "PERSONAL"}],"twitter": ["alicewalker"]},"scraped_at": "2026-05-05T12:00:00+00:00"}
Input Parameters
| Parameter | Default | Description |
|---|---|---|
profile_urls | required | LinkedIn profile URLs or bare vanity slugs. Both https://www.linkedin.com/in/williamhgates/ and williamhgates work; mix freely in the same list |
cookie | required | Your li_at cookie. Either inline, or seed once via cookie_persist_key |
cookie_persist_key | null | Optional. Reuse a cookie across runs by storing it in your own per-account Apify KV |
scrape_contact_info | false | Fires profileContactInfo per profile — adds email, phones, websites, twitter, IM |
proxy | null | Proxy config — set country to match cookie's home geo |
max_concurrency | 5 | Concurrent profile requests |
max_requests_per_minute | 30 | Rate cap to avoid LinkedIn throttling |
cache_provider | memory | memory, apify, or none |
cache_ttl_seconds | 3600 | Cache TTL for re-runs |
Pricing
Two tiers, billed only on success. No charge for blocked, failed, or not-found rows — they still appear in the dataset (for traceability) but never trigger a profile event.
| Tier | What you get | Per profile | 1,000 profiles* |
|---|---|---|---|
| Tier 1 — Profile | Full structured profile (experience, education, skills, certifications, honors, projects, languages, etc.) | $0.007 | $7.02 |
| Tier 2 — Profile + Contact | Tier 1 fields + emails, phones, websites, twitter, IM, birthday, address (when the profile shares them) | $0.007 + $0.003 | $10.02 |
* Includes the $0.02 per-run start charge.
Adaptive billing rules (you only pay when we deliver):
- A profile that returns
status="blocked"/"not_found"/"failed"is never billed. - Tier 2 only adds the $0.003 contact-info charge when contact data is actually returned. Private profiles, profiles that don't share contact info, or sessions where the contact endpoint fails — all cost zero extra.
| Competitor | Mode | 1,000 profiles |
|---|---|---|
| dev_fusion | Basic + email | $10.00 |
| HarvestAPI Profile Search | Full + email | ~$14 |
| Us — Tier 1 | Full structured fields | $7.02 |
| Us — Tier 2 | + email/phone enrichment | $10.02 |
| Competitor | Mode | 1,000 profiles |
|---|---|---|
| dev_fusion | Basic + email | $10.00 |
| HarvestAPI Profile Search | Full + email | ~$14 |
| Us — standard | Full structured fields | $7.02 |
| Us — with contact | + email/phone enrichment | $10.02 |
Proxy Configuration
LinkedIn aggressively rate-limits datacenter IPs. Residential proxy is mandatory, and the country MUST match your cookie's home country (see the Critical Setup section at the top). Replace US with your country in every example below.
// Apify managed proxy (recommended){ "provider": "apify", "group": "RESIDENTIAL", "country": "US" }// Bright Data{ "provider": "brightdata", "username": "USER", "password": "PASS", "zone": "residential", "country": "US" }// Oxylabs{ "provider": "oxylabs", "username": "USER", "password": "PASS", "proxy_type": "residential", "country": "US" }// SmartProxy{ "provider": "smartproxy", "username": "USER", "password": "PASS", "proxy_type": "residential", "country": "US" }
Mismatched country = deauthorized cookie. Don't skip the country field.
Error Handling
| Situation | What happens |
|---|---|
| No cookie + no persist key | Actor fails fast with clear message — no charge for failed run |
| Cookie expired / invalid | Voyager API returns 401; row emitted with status="blocked", not billed |
| Profile doesn't exist | Row emitted with status="not_found", not billed |
| Unparseable input string | Row emitted with status="failed" and the offending input in profile_url, not billed |
| Cookie geo ↔ proxy country mismatch | LinkedIn deauthorizes session, returns 401 — fix by matching proxy.country to your account |
| Profile is private | Public-readable fields populate; private sections stay empty |
| Residential IP timeout | Auto-retry on the next IP from a 5-IP rotation pool |
| Contact info hidden / private | Profile result still returned without contact; no billing for the contact event |
| Rate-limited (429 / 503) | Exponential backoff + jitter, up to 3 attempts |
Frequently Asked Questions
Can I scrape without a cookie? Not reliably from Apify or any cloud infrastructure. LinkedIn's authwall now requires authentication for anonymous cloud-IP requests. The actor will fail fast if you don't provide one.
Will my cookie get my account banned?
LinkedIn flags accounts that pull thousands of profiles per hour. Stick under the default max_requests_per_minute: 30 and max_concurrency: 5 for sustainable use. The Voyager endpoint is the same one the LinkedIn web app uses, so request shape isn't a flag — volume and cadence are.
How long does a cookie last? Typically 1 year. If runs start failing with 401, paste a fresh cookie.
How fresh is the cache?
Default 1 hour. Re-running the same profile_urls within that window returns cached results without re-scraping or re-charging.
Will all the rich fields populate on every profile? No — depends on what the profile owner has filled in and their privacy settings. Skills, honors, projects, certifications, languages etc. only show when the person added them. Numeric connection counts and badges populate when LinkedIn ships them on that profile (varies). Core fields (name, headline, about, experience, education) almost always populate.
What about LinkedIn's terms of service?
Cookie-mode requires your LinkedIn account credentials and is your responsibility. We don't store the cookie outside your own Apify KV (and only if you opt into cookie_persist_key).
Related Actors
Building a full data pipeline? Pair this actor with our other scrapers — same proxy config format, same Pydantic-validated output, all open source.
Lead generation
- Google Maps Business & Contact Scraper — Scrape Google Maps businesses with emails, phone numbers, reviews, images, social links. 24 fields per business.
Lead generation / Hiring
- LinkedIn Jobs Scraper — Scrape LinkedIn job listings with 30 fields per job — company enrichment, salary, recruiter info, full description. No login required.
E-commerce intelligence
- TikTok Shop Product Scraper — Scrape TikTok Shop products across 10 regions (US, GB, VN, TH, PH, MY, SG, JP, MX, BR) — variants, prices, seller info, ratings, sold counts.