LinkedIn Guest-View Profile Data Extractor
Extract names, headlines, work history, education, certifications, honors, volunteer work, projects, and follower counts from public LinkedIn profiles, with optional current-employer enrichment. No login or cookies required.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
profileUrls | array | optional | LinkedIn profile URLs (https://linkedin.com/in/username) or bare usernames. Full URLs, usernames, 'in/username' shorthand and regional subdomains are all accepted. Optional when searchNames is provided. |
searchNames | array | optional | Optional search-by-name mode: full names (e.g. "Satya Nadella") to find on LinkedIn's public people directory. Every discovered profile is then scraped through the same pipeline and appears with its own searchQuery field. Combine with profileUrls or use alone. |
searchCompany | string | optional | Optional. When searching by name, keep only candidates whose directory card lists this company (case-insensitive substring). |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
profileUrls | array | optional | LinkedIn profile URLs (https://linkedin.com/in/username) or bare usernames. Full URLs, usernames, 'in/username' shorthand and regional subdomains are all accepted. Optional when searchNames is provided. |
searchNames | array | optional | Optional search-by-name mode: full names (e.g. "Satya Nadella") to find on LinkedIn's public people directory. Every discovered profile is then scraped through the same pipeline and appears with its own searchQuery field. Combine with profileUrls or use alone. |
searchCompany | string | optional | Optional. When searching by name, keep only candidates whose directory card lists this company (case-insensitive substring). |
searchLocation | string | optional | Optional. When searching by name, keep only candidates whose directory card lists this location (case-insensitive substring). |
maxSearchResults | integer | optional | Upper bound on profiles discovered and scraped in search-by-name mode. |
enrichCompany | boolean | optional | Fetch the current employer's own public LinkedIn company page for extra detail (employee count, size, industry, website, headquarters, logo, specialties, founded year, followers, description). Uses a free public mirror, so it adds no proxy cost. Cached per company within a run. |
includeStatusRows | boolean | optional | Add one structured status row when a run returns no profiles or only some of the requested profiles. Turn off if you want the dataset to contain profile records only. |
cookies | string | optional | Optional and entirely unnecessary for the cookieless data. Supply your own LinkedIn session cookies (browser-export JSON, a JSON array of {name,value}, or a raw Cookie header) to additionally fill fields LinkedIn withholds from logged-out visitors — the real headline, exact connection count, and the full Experience list with titles and dates. Use ``cookie`` as an alias accepted for compatibility. Never required; leave empty for the standard cookieless run. |
Download the published input schema
View complete JSON
{
"properties": {
"cookies": {
"description": "Optional and entirely unnecessary for the cookieless data. Supply your own LinkedIn session cookies (browser-export JSON, a JSON array of {name,value}, or a raw Cookie header) to additionally fill fields LinkedIn withholds from logged-out visitors — the real headline, exact connection count, and the full Experience list with titles and dates. Use ``cookie`` as an alias accepted for compatibility. Never required; leave empty for the standard cookieless run.",
"editor": "textarea",
"title": "Cookies (optional)",
"type": "string"
},
"enrichCompany": {
"default": true,
"description": "Fetch the current employer's own public LinkedIn company page for extra detail (employee count, size, industry, website, headquarters, logo, specialties, founded year, followers, description). Uses a free public mirror, so it adds no proxy cost. Cached per company within a run.",
"editor": "checkbox",
"prefill": true,
"title": "Enrich Current Company",
"type": "boolean"
},
"includeStatusRows": {
"default": true,
"description": "Add one structured status row when a run returns no profiles or only some of the requested profiles. Turn off if you want the dataset to contain profile records only.",
"editor": "checkbox",
"prefill": true,
"title": "Include Status Rows",
"type": "boolean"
},
"maxSearchResults": {
"default": 25,
"description": "Upper bound on profiles discovered and scraped in search-by-name mode.",
"editor": "number",
"maximum": 100,
"minimum": 1,
"prefill": 25,
"title": "Search: Max Results",
"type": "integer"
},
"profileUrls": {
"description": "LinkedIn profile URLs (https://linkedin.com/in/username) or bare usernames. Full URLs, usernames, 'in/username' shorthand and regional subdomains are all accepted. Optional when searchNames is provided.",
"editor": "stringList",
"items": {
"type": "string"
},
"prefill": [
"https://www.linkedin.com/in/williamhgates"
],
"title": "Profile URLs",
"type": "array"
},
"searchCompany": {
"description": "Optional. When searching by name, keep only candidates whose directory card lists this company (case-insensitive substring).",
"editor": "textfield",
"title": "Search: Current Company Filter",
"type": "string"
},
"searchLocation": {
"description": "Optional. When searching by name, keep only candidates whose directory card lists this location (case-insensitive substring).",
"editor": "textfield",
"title": "Search: Location Filter",
"type": "string"
},
"searchNames": {
"description": "Optional search-by-name mode: full names (e.g. \"Satya Nadella\") to find on LinkedIn's public people directory. Every discovered profile is then scraped through the same pipeline and appears with its own searchQuery field. Combine with profileUrls or use alone.",
"editor": "stringList",
"items": {
"type": "string"
},
"title": "Search Names",
"type": "array"
}
},
"schemaVersion": 1,
"title": "LinkedIn Profile Scraper Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
results | string | optional | Dataset with scraped LinkedIn profile data |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "One record per requested profile, with identity, About, followers, connections, work/education links, self-authored sections (certifications, recommendations, languages, services, publications, patents, courses, honors, projects, volunteering, skills), and optional current-employer enrichment.",
"properties": {
"results": {
"description": "Dataset with scraped LinkedIn profile data",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"type": "string"
}
},
"title": "LinkedIn Guest-View Profile Data Extractor Output"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"views": {
"detailed": {
"display": {
"component": "table",
"properties": {
"accessRung": {
"format": "text",
"label": "Access Rung"
},
"connectionsCount": {
"format": "number",
"label": "Connections"
},
"currentCompany": {
"format": "object",
"label": "Current Company"
},
"currentSchool": {
"format": "object",
"label": "Current School"
},
"currentTitle": {
"format": "text",
"label": "Current Title"
},
"followersCount": {
"format": "number",
"label": "Followers"
},
"headline": {
"format": "text",
"label": "Headline"
},
"headlineSource": {
"format": "text",
"label": "Headline Source"
},
"inputUrl": {
"format": "text",
"label": "Input URL"
},
"location": {
"format": "text",
"label": "Location"
},
"name": {
"format": "text",
"label": "Name"
},
"order": {
"format": "number",
"label": "Order"
},
"profilePicture": {
"format": "link",
"label": "Photo"
},
"profileUrl": {
"format": "link",
"label": "Profile URL"
},
"scrapedAt": {
"format": "text",
"label": "Scraped At"
},
"summary": {
"format": "text",
"label": "Summary"
}
}
},
"title": "Detailed",
"transformation": {
"fields": [
"name",
"headline",
"headlineSource",
"location",
"summary",
"profileUrl",
"profilePicture",
"currentTitle",
"currentCompany",
"currentSchool",
"followersCount",
"connectionsCount",
"accessRung",
"inputUrl",
"order",
"scrapedAt"
]
}
},
"overview": {
"display": {
"component": "table",
"properties": {
"connectionsText": {
"format": "text",
"label": "Connections"
},
"followersCount": {
"format": "number",
"label": "Followers"
},
"headline": {
"format": "text",
"label": "Headline"
},
"location": {
"format": "text",
"label": "Location"
},
"name": {
"format": "text",
"label": "Name"
},
"profileUrl": {
"format": "link",
"label": "Profile URL"
},
"scrapedAt": {
"format": "text",
"label": "Scraped At"
}
}
},
"title": "Overview",
"transformation": {
"fields": [
"name",
"headline",
"location",
"profileUrl",
"followersCount",
"connectionsText",
"scrapedAt"
]
}
},
"sections": {
"display": {
"component": "table",
"properties": {
"badges": {
"format": "object",
"label": "Badges"
},
"certifications": {
"format": "object",
"label": "Certifications"
},
"courses": {
"format": "object",
"label": "Courses"
},
"honorsAndAwards": {
"format": "object",
"label": "Honors"
},
"languages": {
"format": "object",
"label": "Languages"
},
"name": {
"format": "text",
"label": "Name"
},
"patents": {
"format": "object",
"label": "Patents"
},
"profileUrl": {
"format": "link",
"label": "Profile URL"
},
"projects": {
"format": "object",
"label": "Projects"
},
"publications": {
"format": "object",
"label": "Publications"
},
"recommendations": {
"format": "object",
"label": "Recommendations"
},
"services": {
"format": "object",
"label": "Services"
},
"skills": {
"format": "object",
"label": "Skills"
},
"volunteerExperience": {
"format": "object",
"label": "Volunteering"
},
"websites": {
"format": "object",
"label": "Websites"
}
}
},
"title": "Sections",
"transformation": {
"fields": [
"name",
"profileUrl",
"certifications",
"recommendations",
"languages",
"services",
"publications",
"patents",
"courses",
"honorsAndAwards",
"volunteerExperience",
"projects",
"skills",
"badges",
"websites"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
LinkedIn Guest-View Profile Data Extractor
Read the public side of any LinkedIn profile the way an anonymous, logged-out visitor sees it — no LinkedIn account, login, cookies, or proxy setup. Give the actor a list of profile URLs or usernames (or just a set of names to search for) and get back one row per profile: identity, About, followers, connections, current company and school, every self-authored section LinkedIn renders to guests, and (optionally) firmographics for the current employer.
What this actor does
- Reads only what LinkedIn already serves to logged-out visitors — no account, session cookie, or credential is ever used, and you never configure a proxy
- Extracts name, headline line, location, About, followers, the public connections indicator, current company, current school, and profile photo for each profile
- Reads each profile's public sections when the owner filled them in: certifications, recommendations received, languages, services, publications, patents, courses, LinkedIn Learning courses, honors & awards, organizations, volunteer experience, projects, skills, badges (Top Voice / Creator), and listed websites
- Extracts each profile's full Experience and Education lists with per-role titles, dates and durations whenever LinkedIn renders those blocks to guests, and adds the education list with dates and GPA whenever LinkedIn publishes it in its richer logged-out view
- Recovers the real headline for many profiles whose headline LinkedIn otherwise withholds from anonymous visitors, by cross-checking the member's name and the exact redaction pattern against the public search index — recovered values carry
headlineSource: "serp"and are never a guess - Searches people by name through LinkedIn's public people directory (
searchNames), then scrapes every discovered profile through the same pipeline - Optionally enriches the current employer with employee count, size, industry, headquarters, address, founded year, followers, website, logo, description, slogan, and specialties, pulled from the company's own public page
- Cross-checks that the data returned actually belongs to the profile you asked for, and omits any field LinkedIn has redacted rather than returning masked placeholder text
- Fields that can't be extracted for a profile (because LinkedIn doesn't expose them, or the owner never filled them in) are left out of that row — no
nullvalues
Output per profile
name,headline,location,summaryheadlineSource— where the headline came from:page(the profile page itself) orserp(recovered from the public search index and verified against the profile's redaction pattern)profileUrl,profilePicturecurrentTitle— current job title, when LinkedIn exposes it publicly for this profile/viewer combinationheadlineRedacted—truewhen LinkedIn substituted the current company for a withheld headline in its public preview lineallTitles— the job titles LinkedIn publishes in the profile's structured datacurrentCompany— current employer:name,url,slug, andcompanyIdwhen the company link is numeric. WithenrichCompanyon and the company page readable, it also gainsemployeeCount,size,industry,website,headquarters,address,foundedYear,followersCount,description,slogan,organizationType,logoUrlandspecialtiescurrentSchool— the school shown on the profile's top card (name,url)currentPositions,pastPositions—company,companyUrl, and dates; on profiles where LinkedIn renders the full Experience list, each entry also carriestitle,dateRange,durationandlocationexperiences—currentPositionsandpastPositionscombined into a single listeducation(andeducations, the same list under both keys) —school,schoolUrl,startDate,endDate, plusgpaanddateRangefrom the richer logged-out education list when present, anddegree,fieldOfStudywhen LinkedIn renders the full Education listfollowersCount,connectionsCount(exact number when the profile shows one),connectionsText(e.g."500+"when only the capped form is public)recentArticles— recent posts/articles withtitle,url,publishedDate,textandlikescertifications—name,issuer,issuerUrl,issueDate,credentialId,credentialUrlrecommendations—recommender,recommenderUrl,textlanguages—language,proficiencyservices—name,urlpublications—title,url,publisher,date,descriptionpatents—title,url,filedDate,number,descriptioncourses—title,numberinstructorCourses—title,url,durationhonorsAndAwards—title,issuer,date,descriptiontestScores—name,score,dateorganizations—name,position,descriptionvolunteerExperience—role,organization,descriptionprojects—title,dateRange,descriptionskills— public skill names when the profile shows thembadges,isTopVoice,isCreator— public profile badgeswebsites—label,urlaccessRung— how the page was read for this profile (direct,crawlerorunblocker), for transparency about the access pathsearchQuery,discoveredVia— set on profiles found throughsearchNames(the name that found them, and whether they came from the public directory or the search-index fallback)enrichedFromCookies—trueonly when the optional cookies input was supplied and it actually added datainputUrl— the URL or handle you suppliedorder— zero-based position of this profile in the input listscrapedAt— ISO 8601 timestamp of extraction
When LinkedIn only shows a profile's sign-up preview, the row is built from the page's preview tags and carries just name, headline, location, summary, profileUrl and profilePicture (plus inputUrl, order, scrapedAt).
Status rows
The dataset can also contain one status row per run (turn it off with includeStatusRows: false):
- If none of the requested profiles could be read:
_status: "no_data",_reason(no_resultsorno_search_results),_message,_help(common causes) andscrapedAt. - If only some profiles failed:
_status: "partial_results",_reason(the single failure reason, ormixed),_failureBreakdown(count per reason:auth_wall,not_found,blocked,identity_mismatch,invalid_url,error),_messageandscrapedAt, added alongside the successful profile rows.
Filter on _status if you only want profile rows.
Input
| Field | Type | Default | Description |
|---|---|---|---|
profileUrls |
array | – | LinkedIn profile URLs (e.g. https://linkedin.com/in/username) or bare usernames. Optional when searchNames is set. |
searchNames |
array | – | Find people by full name (e.g. "Satya Nadella") through LinkedIn's public people directory, then scrape every discovered profile. Combine with profileUrls or use alone. |
searchCompany |
string | – | With searchNames: keep only directory candidates whose card lists this company (substring, case-insensitive). |
searchLocation |
string | – | With searchNames: keep only directory candidates whose card lists this location (substring, case-insensitive). |
maxSearchResults |
integer | 25 |
Upper bound on profiles discovered and scraped in search mode (1–100). |
enrichCompany |
boolean | true |
Also fetch the current employer's public company page for firmographics (employee count, size, industry, HQ, website, logo, founded year, followers, description). Uses a free public mirror, so it adds no proxy cost. |
includeStatusRows |
boolean | true |
Add one structured status row to the dataset when a run returns no profile rows or only some of the requested profiles. Turn off for profile records only. |
cookies |
string | – | Optional and never needed for the standard run. Supply your own LinkedIn session cookies to additionally fill fields LinkedIn withholds from logged-out visitors (real headline, exact connections, full Experience list). cookie is accepted as an alias. |
The actor normalizes https://www.linkedin.com/in/username, regional subdomains such as https://uk.linkedin.com/in/username, linkedin.com/in/username, in/username, and a bare username to the same profile.
Example: default run with company enrichment
{
"profileUrls": [
"https://www.linkedin.com/in/williamhgates",
"satyanadella",
"in/reidhoffman"
]
}
Example: find people by name and scrape them
{
"searchNames": ["Satya Nadella", "Abdul Manan Raja"],
"searchCompany": "Microsoft",
"maxSearchResults": 10,
"enrichCompany": true
}
Example: faster run, no company enrichment, no status rows
{
"profileUrls": ["https://www.linkedin.com/in/satyanadella"],
"enrichCompany": false,
"includeStatusRows": false
}
Use cases
- Lead generation & sales prospecting — enrich a list of LinkedIn URLs with current role, employer, and company details
- Recruiting & talent sourcing — find candidates by name and verify work history, education, and certifications at scale
- Sales intelligence — keep track of role and company changes for key contacts at target accounts
- CRM enrichment — append verified profile and company fields to existing contact records
- Academic & market research — study career trajectories, credentials, and industry trends across large profile sets
- Background and credential checks — cross-reference publicly listed honors, certifications, and project history
Data source
This actor reads only LinkedIn's public, logged-out pages: profile pages' structured data and server-rendered sections, the public company page of the current employer, and the public people directory for name searches. For profiles whose headline block is redacted for anonymous visitors, the actor may additionally consult the public search index and accepts a value only when it matches the member's name and the exact redaction pattern of that profile's structured data. It selects its own access path per request (starting with a direct fetch and escalating only when the target blocks it), so no proxy configuration or login is ever required from you.
FAQ
Do I need a LinkedIn account, login, or cookie?
No. The actor never requires LinkedIn credentials or session cookies — it only reads what LinkedIn serves to anonymous visitors. No proxy setup is needed either. The optional cookies field exists only for users who want to add detail from their own logged-in session; the actor fully works without it and the standard output never depends on it.
Can I get someone's email address or phone number? No. LinkedIn does not expose contact details on the public profile page to logged-out visitors, so the actor never returns them — and never fabricates a guess.
Why is headline sometimes missing or marked headlineRedacted?
LinkedIn's public preview line shows the member's real headline only when the guest view leaves it unredacted. For most profiles it substitutes the current company or the location. A company substitution is returned as no headline with headlineRedacted: true; a location substitution is omitted. When the headline block is redacted, the actor tries to recover the real headline from the public search index — a recovered value is accepted only when it matches the member's name and the word-for-word pattern of the redacted title, and it is marked headlineSource: "serp".
Why are currentTitle or some past employers missing?
LinkedIn withholds job titles, most past employers, and most school names from logged-out viewers by replacing them with asterisk masks. Masked values are omitted rather than pushed as placeholder text. Titles and dates appear for every profile whose full Experience list LinkedIn still renders publicly.
Is the connections count exact?
When LinkedIn shows an exact number publicly, it's returned in connectionsCount. When only the capped form is public (very common), connectionsText carries "500+" instead — the actor never guesses a number.
How does search by name work?
The actor resolves each name against LinkedIn's public people directory, which lists matching members with their current company and location; searchCompany/searchLocation filter those cards, and maxSearchResults bounds how many profiles are scraped. Common names can return many people with the same name — the directory ranks them and the filters are the way to narrow down. Every record found this way carries searchQuery so you can tell which search produced it.
Does this only work on well-known profiles?
No. Any profile LinkedIn shows to logged-out visitors can be read. LinkedIn does sometimes refuse a request even for a public profile; such profiles are counted as blocked in the status row, and re-running them later often succeeds.
What happens if a profile is set to fully private? If the owner has hidden their profile from logged-out visitors, no data is returned for it. That reflects the owner's own privacy setting, not a gap in the actor.
How current is the data? Every field is read directly from LinkedIn's public page at run time — nothing is cached or backfilled from a stored copy. A headline recovered from the search index reflects what that index currently shows for the profile.
Are skills or languages included? They are included when the profile shows them publicly. Languages and skills are among the sections LinkedIn only renders to guests when the owner has made them public, so they appear on some profiles and not others.
Does this work for profiles on regional LinkedIn domains?
Yes — profiles reached via uk.linkedin.com, de.linkedin.com, and other regional LinkedIn domains are supported the same way as linkedin.com.
Is this affiliated with LinkedIn? No. This is an independent, third-party actor that reads publicly available LinkedIn pages; it is not operated by or affiliated with LinkedIn.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build 0PUenpBM33btMM7BP. Documentation is regenerated from the default published build; private drafts are not included.