# LinkedIn Guest-View Profile Data Extractor (`vexaloom-labs/linkedin-guest-view-profile-data-extractor`) Actor

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.

- **URL**: https://apify.com/vexaloom-labs/linkedin-guest-view-profile-data-extractor.md
- **Developed by:** [vexaloom-labs](https://apify.com/vexaloom-labs) (community)
- **Categories:** Social media, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## LinkedIn Guest-View Profile Data Extractor

Pull structured data from any public LinkedIn profile the way an anonymous, logged-out visitor sees it — no LinkedIn account, login, or cookies required. Feed in a list of profile URLs or bare usernames and get back one row per profile with headline, work history, education, credentials, and (optionally) current-employer company details.

### What this actor does

- Reads only what LinkedIn already serves to logged-out visitors — no account, session cookie, or credential is ever used
- Extracts name, headline, location, summary, current and past employers, and schools for each profile
- Also reads the certifications, honors & awards, test scores, organization memberships, volunteer experience, projects and listed websites sections when the profile shows them to guests
- Optionally enriches the current employer with company size, industry, headquarters, website, and logo pulled from that company's own LinkedIn 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`
- `profileUrl`, `profilePicture`
- `currentTitle` — current job title, when not withheld by LinkedIn for this viewer/profile combination
- `allTitles` — every job title listed on the profile
- `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`, `organizationType`, `logoUrl` and `specialties` (whichever that page shows)
- `currentPositions`, `pastPositions` — each with `company`, `companyUrl`, `startDate`, `endDate` and `location` as far as LinkedIn shows them to guests (job titles per position aren't part of the guest view; see `allTitles`)
- `experiences` — `currentPositions` and `pastPositions` combined into a single list
- `education` (and `educations`, the same list under both keys) — each with `school`, `schoolUrl`, `startDate`, `endDate`
- `followersCount`
- `recentArticles` — recent posts/articles with `title`, `url`, `publishedDate`, `text` and `likes`
- `certifications` — `name`, `issuer`, `issuerUrl`, `issueDate`, `credentialId`, `credentialUrl`
- `honorsAndAwards` — `title`, `issuer`, `date`, `description`
- `testScores` — `name`, `score`, `date`
- `organizations` — `name`, `position`, `description`
- `volunteerExperience` — `role`, `organization`, `description`
- `projects` — `title`, `dateRange`, `description`
- `websites` — `label`, `url`
- `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`, `summary`, `profileUrl` and `profilePicture` (plus `inputUrl`, `order`, `scrapedAt`).

#### Status rows

The dataset can also contain one status row per run:

- If none of the requested profiles could be read: `_status: "no_data"`, `_reason: "no_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. Required. |
| `enrichCompany` | boolean | `true` | Also fetch the current employer's LinkedIn company page for size, industry, website, HQ, and logo. Adds one extra request per unique company. |
| `proxyConfiguration` | object | – | Accepted but not used: the actor manages its own connection settings, so this value has no effect |

The actor normalizes `https://www.linkedin.com/in/username`, `linkedin.com/in/username`, `in/username`, and a bare `username` to the same profile.

#### Example: default run with company enrichment

```json
{
  "profileUrls": [
    "https://www.linkedin.com/in/williamhgates",
    "satyanadella",
    "in/reidhoffman"
  ]
}
```

#### Example: faster run, no company enrichment

```json
{
  "profileUrls": ["https://www.linkedin.com/in/satyanadella"],
  "enrichCompany": false
}
```

### Use cases

- **Lead generation & sales prospecting** — enrich a list of LinkedIn URLs with current role, employer, and company details
- **Recruiting & talent sourcing** — build candidate shortlists 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

### FAQ

**Do I need a LinkedIn account, login, or cookie?**
No. The actor never asks for or uses LinkedIn credentials or session cookies — it only reads what LinkedIn serves to anonymous, logged-out visitors.

**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 `currentTitle` missing on some profiles?**
LinkedIn's own visibility rules occasionally withhold job-title and past-employer text from logged-out viewers, independent of this actor. When that happens the field is omitted rather than filled with placeholder text. `currentCompany.name` tends to stay available even when the title doesn't.

**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 profile page at run time — nothing is cached or backfilled from a stored copy.

**Are skills or languages included?**
No. Those sections are only exposed through LinkedIn's authenticated member view and aren't present on the logged-out public profile page, so they can't be extracted here.

**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.

# Actor input Schema

## `profileUrls` (type: `array`):

LinkedIn profile URLs (https://linkedin.com/in/username) or usernames.

## `enrichCompany` (type: `boolean`):

Fetch the current employer's own LinkedIn company page for extra detail (size, industry, website, headquarters, logo). Adds one extra request per profile (~30-90s) but is cached per company within a run. Disable for faster runs.

## `proxyConfiguration` (type: `object`):

Optional Apify proxy.

## Actor input object example

```json
{
  "profileUrls": [
    "https://www.linkedin.com/in/williamhgates",
    "https://www.linkedin.com/in/satyanadella"
  ],
  "enrichCompany": true
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset with scraped LinkedIn profile data

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "profileUrls": [
        "https://www.linkedin.com/in/williamhgates",
        "https://www.linkedin.com/in/satyanadella"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("vexaloom-labs/linkedin-guest-view-profile-data-extractor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "profileUrls": [
        "https://www.linkedin.com/in/williamhgates",
        "https://www.linkedin.com/in/satyanadella",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("vexaloom-labs/linkedin-guest-view-profile-data-extractor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "profileUrls": [
    "https://www.linkedin.com/in/williamhgates",
    "https://www.linkedin.com/in/satyanadella"
  ]
}' |
apify call vexaloom-labs/linkedin-guest-view-profile-data-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vexaloom-labs/linkedin-guest-view-profile-data-extractor"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/lHu4lm8g5nkseYsIY/builds/eIpWE5k1mof9bEQnM/openapi.json
