Vexaloom Labs

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.

FieldTypeRequiredDescription
profileUrlsarrayoptionalLinkedIn 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.
searchNamesarrayoptionalOptional 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.
searchCompanystringoptionalOptional. When searching by name, keep only candidates whose directory card lists this company (case-insensitive substring).
Show all input fields
FieldTypeRequiredDescription
profileUrlsarrayoptionalLinkedIn 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.
searchNamesarrayoptionalOptional 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.
searchCompanystringoptionalOptional. When searching by name, keep only candidates whose directory card lists this company (case-insensitive substring).
searchLocationstringoptionalOptional. When searching by name, keep only candidates whose directory card lists this location (case-insensitive substring).
maxSearchResultsintegeroptionalUpper bound on profiles discovered and scraped in search-by-name mode.
enrichCompanybooleanoptionalFetch 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.
includeStatusRowsbooleanoptionalAdd 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.
cookiesstringoptionalOptional 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.

FieldTypeRequiredDescription
resultsstringoptionalDataset 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 null values

Output per profile

  • name, headline, location, summary
  • headlineSource — where the headline came from: page (the profile page itself) or serp (recovered from the public search index and verified against the profile's redaction pattern)
  • profileUrl, profilePicture
  • currentTitle — current job title, when LinkedIn exposes it publicly for this profile/viewer combination
  • headlineRedacted — true when LinkedIn substituted the current company for a withheld headline in its public preview line
  • allTitles — the job titles LinkedIn publishes in the profile's structured data
  • currentCompany — current employer: name, url, slug, and companyId when the company link is numeric. With enrichCompany on and the company page readable, it also gains employeeCount, size, industry, website, headquarters, address, foundedYear, followersCount, description, slogan, organizationType, logoUrl and specialties
  • currentSchool — 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 carries title, dateRange, duration and location
  • experiences — currentPositions and pastPositions combined into a single list
  • education (and educations, the same list under both keys) — school, schoolUrl, startDate, endDate, plus gpa and dateRange from the richer logged-out education list when present, and degree, fieldOfStudy when LinkedIn renders the full Education list
  • followersCount, connectionsCount (exact number when the profile shows one), connectionsText (e.g. "500+" when only the capped form is public)
  • recentArticles — recent posts/articles with title, url, publishedDate, text and likes
  • certifications — name, issuer, issuerUrl, issueDate, credentialId, credentialUrl
  • recommendations — recommender, recommenderUrl, text
  • languages — language, proficiency
  • services — name, url
  • publications — title, url, publisher, date, description
  • patents — title, url, filedDate, number, description
  • courses — title, number
  • instructorCourses — title, url, duration
  • honorsAndAwards — title, issuer, date, description
  • testScores — name, score, date
  • organizations — name, position, description
  • volunteerExperience — role, organization, description
  • projects — title, dateRange, description
  • skills — public skill names when the profile shows them
  • badges, isTopVoice, isCreator — public profile badges
  • websites — label, url
  • accessRung — how the page was read for this profile (direct, crawler or unblocker), for transparency about the access path
  • searchQuery, discoveredVia — set on profiles found through searchNames (the name that found them, and whether they came from the public directory or the search-index fallback)
  • enrichedFromCookies — true only when the optional cookies input was supplied and it actually added data
  • inputUrl — the URL or handle you supplied
  • order — zero-based position of this profile in the input list
  • scrapedAt — 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_results or no_search_results), _message, _help (common causes) and scrapedAt.
  • If only some profiles failed: _status: "partial_results", _reason (the single failure reason, or mixed), _failureBreakdown (count per reason: auth_wall, not_found, blocked, identity_mismatch, invalid_url, error), _message and scrapedAt, 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.

Open the step-by-step Python guide →

Source build 0PUenpBM33btMM7BP. Documentation is regenerated from the default published build; private drafts are not included.