# Linkedin Profile Scraper (`crawlerbros/linkedin-profile-scraper`) Actor

Scrape LinkedIn public profiles without login. Get name, headline, experience, education, followers, and recent articles.

- **URL**: https://apify.com/crawlerbros/linkedin-profile-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Lead generation, Social media, Developer tools
- **Stats:** 1,419 total users, 98 monthly users, 99.6% runs succeeded, 11 bookmarks
- **User rating**: 2.98 out of 5 stars

## Pricing

from $1.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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## LinkedIn Profile Scraper — Extract LinkedIn Data Without Login or Cookies

**Scrape any public LinkedIn profile with no login, no cookies, and no LinkedIn account required.** Get verified names, headlines, work history, education, certifications, honors & awards, test scores, organizations, volunteer experience, projects, personal websites, follower counts, and recent posts — all as clean, structured JSON, ready for lead generation, recruiting, sales prospecting, and research workflows.

### Quick answer

**Can you scrape LinkedIn profiles without a login?** Yes. This actor is 100% cookie-less — it reads only what LinkedIn already serves to anonymous, logged-out visitors, so there's no account to create, no session token to manage, and no risk of an account getting flagged. Feed it a list of LinkedIn profile URLs (or plain usernames) and get back one structured row per profile.

### Why use this LinkedIn scraper

- **No login required** — zero LinkedIn credentials, cookies, or session tokens needed, ever. Point it at a URL and get data back.
- **Works on real, everyday profiles** — not just celebrities and executives. Live-verified across diverse batches of founders, engineers, marketers, and ordinary professionals with 100% success on accessible profiles.
- **Rich, real data** — certifications with credential IDs and verification links, honors & awards, test scores, organization memberships, volunteer experience, personal projects, and portfolio/website links, sourced directly from LinkedIn's own public profile page — not guessed, not fabricated.
- **Company intelligence built in** — automatically enriches the current employer with headcount, industry, HQ, website, and logo from the company's own LinkedIn page.
- **Honest, garbage-free output** — no `null` fields, no placeholder text, no fabricated emails or phone numbers. If a field genuinely can't be extracted, it's simply omitted from that row instead of being faked.
- **Built-in data integrity checks** — automatically detects and discards LinkedIn's own anti-scraping redactions (asterisk-masked text) and cross-verifies that the returned profile actually matches the one requested, so you never get silently wrong data.
- **Fast, concurrent processing** — multiple profiles scraped in parallel.

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `profileUrls` | string\[] | Yes | LinkedIn profile URLs or usernames to scrape |
| `enrichCompany` | boolean | No | Fetch the current employer's LinkedIn company page for extra detail (size, industry, website, HQ, logo). Default `true`. Adds ~30-90s per unique company (cached within a run) — disable for faster runs. |

#### Supported profile URL formats

The actor auto-normalizes any of these to the same canonical profile:

- `https://www.linkedin.com/in/williamhgates`
- `linkedin.com/in/williamhgates`
- `in/williamhgates`
- `williamhgates` (bare handle)

#### Example input

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

### How it works

LinkedIn blocks most automated guest-profile requests outright. This actor routes every fetch through an anti-bot-aware proxy that solves that challenge server-side, then parses two independent, publicly-served data sources on the profile page: the structured JSON-LD block (name, headline, positions, education, followers) and a set of server-rendered page sections most scrapers miss entirely (certifications, honors, test scores, organizations, volunteer work, projects, and personal websites). A masked-title/company safety net strips out any LinkedIn-redacted text so it's never mistaken for real data, and an identity-verification check confirms the returned profile is actually the one you asked for.

Two practical notes:

- **Per-profile latency is 30-90 seconds** — this is real anti-bot challenge-solving time, not a slow client. Budget accordingly for large batches, or split them across multiple runs.
- **Job titles and past-employer names are occasionally unavailable** — LinkedIn's own guest-visibility policy redacts this specific text for some viewer/profile combinations. When that happens, the actor omits the field rather than returning placeholder text. The current employer's *name* (via `currentCompany`) is far more reliably available even when the title isn't.

### Output

One row per profile. Fields that couldn't be extracted are omitted entirely — there are no `null` values anywhere in the dataset.

#### Profile fields

| Field | Type | Example |
|-------|------|---------|
| `name` | string | `"Bill Gates"` |
| `headline` | string | `"Chair, Gates Foundation and Founder, Breakthrough Energy"` |
| `location` | string | `"Seattle, Washington, United States"` |
| `summary` | string | About / bio text |
| `profileUrl` | string | `"https://www.linkedin.com/in/williamhgates"` |
| `profilePicture` | string | Profile photo URL |
| `currentTitle` | string | Current job title (when not redacted by LinkedIn — see Limitations) |
| `allTitles` | string\[] | All job titles listed on the profile |
| `currentCompany` | object | Current employer, enriched with company page data (see below) |
| `currentPositions` | object\[] | Current work positions |
| `pastPositions` | object\[] | Past work positions |
| `education` | object\[] | Education history |
| `followersCount` | integer | Followers count |
| `recentArticles` | object\[] | Recent posts / articles with title, URL, publish date, likes |
| `certifications` | object\[] | Licenses & certifications — issuer, issue date, credential ID, credential URL |
| `honorsAndAwards` | object\[] | Honors & awards — title, issuer, date, description |
| `testScores` | object\[] | Test scores — name, score, date |
| `organizations` | object\[] | Organization memberships — name, position, description |
| `volunteerExperience` | object\[] | Volunteer roles — role, organization, description |
| `projects` | object\[] | Personal/academic projects — title, date range, description |
| `websites` | object\[] | Personal websites/portfolio links — label, url |
| `inputUrl` | string | The URL/handle you supplied |
| `order` | integer | Index of this result in the input list |
| `scrapedAt` | string | ISO-8601 timestamp |

#### `currentCompany` sub-fields

| Field | Type | Example |
|-------|------|---------|
| `name` | string | `"Microsoft"` |
| `url` | string | `"https://www.linkedin.com/company/microsoft"` |
| `slug` | string | `"microsoft"` |
| `employeeCount` | integer | `233092` — exact headcount from the company's LinkedIn page |
| `size` | string | `"10,001+ employees"` — LinkedIn's bucketed size range |
| `industry` | string | `"Software Development"` |
| `website` | string | `"https://news.microsoft.com/"` |
| `headquarters` | string | `"Redmond, Washington"` |
| `organizationType` | string | `"Public Company"` |
| `logoUrl` | string | Company logo image URL |
| `specialties` | string\[] | Company-listed specialty tags (only present when the company page has them) |

Company enrichment requires `enrichCompany: true` (default) and only applies to the current employer.

#### Certifications, honors, test scores, organizations, volunteer experience, projects, websites

These come from LinkedIn's own public profile page — real, server-rendered sections any anonymous visitor can see (credential IDs, issue dates, project descriptions, verification links). Only present when the profile owner has filled in that section.

#### Position sub-fields

`company`, `title`, `companyUrl`, `startDate`, `endDate`, `location`, `description`

#### Education sub-fields

`school`, `schoolUrl`, `degree`, `fieldOfStudy`, `startDate`, `endDate`

#### Example output row

```json
{
  "name": "Satya Nadella",
  "headline": "Chairman and CEO at Microsoft",
  "location": "Redmond, Washington",
  "summary": "As chairman and CEO of Microsoft, I define my mission...",
  "profileUrl": "https://www.linkedin.com/in/satyanadella",
  "profilePicture": "https://media.licdn.com/dms/image/...",
  "currentTitle": "Chairman and CEO",
  "currentCompany": {
    "name": "Microsoft",
    "url": "https://www.linkedin.com/company/microsoft",
    "slug": "microsoft",
    "employeeCount": 233092,
    "size": "10,001+ employees",
    "industry": "Software Development",
    "website": "https://news.microsoft.com/",
    "headquarters": "Redmond, Washington",
    "organizationType": "Public Company",
    "logoUrl": "https://media.licdn.com/dms/image/..."
  },
  "followersCount": 12124422,
  "inputUrl": "satyanadella",
  "order": 0,
  "scrapedAt": "2026-08-20T12:00:00.000000+00:00"
}
```

### Use cases

- **Lead generation & sales prospecting** — enrich a list of LinkedIn URLs with current role, employer, and company intel without touching a login
- **Recruiting & talent sourcing** — build candidate lists, verify work history, education, and certifications at scale
- **Sales intelligence** — monitor key people and company data at target accounts
- **CRM & database enrichment** — append verified profile and company data to existing contact records
- **Academic & market research** — analyze career trajectories, credentials, and industry trends across large profile sets
- **Due diligence & background research** — cross-reference public credentials, honors, and project history

### Frequently asked questions

**Do I need a LinkedIn account, login, or cookie to use this scraper?**
No. This actor never asks for or uses LinkedIn credentials, session cookies, or authentication tokens of any kind. It only reads data LinkedIn already serves to anyone browsing logged out.

**Is it possible to scrape LinkedIn without logging in?**
Yes — that's exactly what this actor does. LinkedIn serves a substantial amount of structured public data (name, headline, work history, education, certifications, honors, projects, followers) to anonymous visitors; this actor extracts it reliably at scale.

**Can I get someone's email address or phone number?**
No, and this actor will never fabricate one. LinkedIn does not expose contact information on the public profile page to anonymous visitors, and only data genuinely visible on the page is extracted — never guessed or pattern-generated.

**Why is the job title missing on some profiles?**
LinkedIn applies its own visibility policy that occasionally redacts job-title and past-employer text for anonymous viewers, independent of this actor. Rather than return LinkedIn's placeholder asterisks as if they were real data, the actor omits the field entirely when this happens. The current employer's name is usually still available even when the title isn't.

**Does this scraper work on non-celebrity, everyday LinkedIn profiles?**
Yes. Unlike scrapers that only reliably work on globally-famous profiles, this actor is built and tested specifically against ordinary professional profiles — the kind used for lead generation and recruiting.

**What happens if a profile is private or fully restricted from public view?**
If the profile owner has configured their account to be completely hidden from logged-out visitors, no data is available — this reflects that person's own privacy choice, not a limitation of the scraper.

**How accurate and up to date is the data?**
Every field is extracted live at run time directly from LinkedIn's current public profile page — nothing is cached, guessed, or backfilled from a stale database.

**How many profiles can I scrape in one run?**
There's no hard limit. Each profile takes roughly 30-90 seconds due to real anti-bot challenge-solving, plus additional time for company enrichment on first-seen employers. For very large batches (100+), raise the run timeout or split the input across multiple runs.

**Does this work outside the United States?**
Yes. The actor uses a US proxy by default when available; you can configure a different region via Apify Proxy settings, and profiles on regional LinkedIn domains (e.g. `uk.linkedin.com`, `de.linkedin.com`, `pk.linkedin.com`) are fully supported.

### Limitations

- **Contact info is never returned** — email and phone are never exposed by LinkedIn on the public profile page, and this actor does not guess or fabricate them
- **Skills and languages are not available** — these exist only behind LinkedIn's authenticated member API and are not present on any public/guest profile page. Certifications, honors, test scores, organizations, volunteer experience, and projects ARE available — LinkedIn does render those sections for anonymous visitors.
- **Job titles and past-employer names are sometimes unavailable** — LinkedIn's own guest-visibility policy occasionally redacts this text server-side; the actor never substitutes placeholder text, it simply omits the field
- **Fully private profiles return no data** — reflects the profile owner's own privacy settings, not a scraper gap
- **Per-profile latency is 30-90 seconds** — the cost of reliably getting past LinkedIn's anti-bot defenses without requiring a login

### Explore the rest of the LinkedIn suite

Need a different LinkedIn surface? Pair this actor with any of the others in the LinkedIn Suite — all published under the same publisher.

| Actor | What it scrapes |
|---|---|
| [LinkedIn Comments Scraper](https://apify.com/crawlerbros/linkedin-comments-scraper) | All comments + reply threads on a post |
| [LinkedIn Company Employees Scraper](https://apify.com/crawlerbros/linkedin-company-employees-scraper) | Employee list for any company (by URN) |
| [LinkedIn Company Info Scraper](https://apify.com/crawlerbros/linkedin-company-info-scraper) | Company About page (size, HQ, industry, specialties) |
| [LinkedIn Company Posts Scraper](https://apify.com/crawlerbros/linkedin-company-posts-scraper) | Posts published from a company page |
| [LinkedIn Events Scraper](https://apify.com/crawlerbros/linkedin-events-scraper) | Events by keyword/URL with full event detail |
| [LinkedIn Hashtag Posts Scraper](https://apify.com/crawlerbros/linkedin-hashtag-posts-scraper) | Posts ranked under a `#hashtag` |
| [LinkedIn Jobs Scraper](https://apify.com/crawlerbros/linkedin-jobs-scraper) | Job listings via the public jobs-guest API |
| [LinkedIn Jobs Scraper Ultra](https://apify.com/crawlerbros/linkedin-jobs-scraper-ultra) | Same as jobs-scraper + full detail enrichment |
| [LinkedIn Learning Courses Scraper](https://apify.com/crawlerbros/linkedin-learning-courses-scraper) | LinkedIn Learning course catalog by keyword |
| [LinkedIn People Search Scraper](https://apify.com/crawlerbros/linkedin-people-search-scraper) | People search with every LinkedIn facet (role, company, school, location, etc.) |
| [LinkedIn Post Reactions Scraper](https://apify.com/crawlerbros/linkedin-post-reactions-scraper) | Reactors on a post (name, headline, reaction type) |
| [LinkedIn Post Scraper](https://apify.com/crawlerbros/linkedin-post-scraper) | Full post (text, media, engagement counts, author) |
| [LinkedIn Post Search Scraper](https://apify.com/crawlerbros/linkedin-post-search-scraper) | Posts matching a keyword (with date/author/network filters) |
| [LinkedIn Profile Posts Scraper](https://apify.com/crawlerbros/linkedin-profile-posts-scraper) | All posts/reposts/articles for one profile |
| [LinkedIn Profile Scraper Pro](https://apify.com/crawlerbros/linkedin-profile-scraper-pro) | Profile fields + extras (recommendations, organizations, languages) |
| [LinkedIn Profile Scraper Pro Ultra](https://apify.com/crawlerbros/linkedin-profile-scraper-pro-ultra) | Pro + premium fields (contact info, followers list when allowed) |
| [LinkedIn Profile Scraper Ultra](https://apify.com/crawlerbros/linkedin-profile-scraper-ultra) | Profile + the full upstream dash-120 surface |
| [LinkedIn Profile Search by Name](https://apify.com/crawlerbros/linkedin-profile-search-by-name) | Search profiles by person name (great for matching CSVs of names) |
| [LinkedIn Schools Alumni Scraper](https://apify.com/crawlerbros/linkedin-schools-alumni-scraper) | Alumni list for any LinkedIn school page |
| [LinkedIn Top Content Scraper](https://apify.com/crawlerbros/linkedin-top-content-scraper) | Trending / top-engagement posts by topic |
| [LinkedIn User Activity Scraper](https://apify.com/crawlerbros/linkedin-user-activity-scraper) | Reactions + comments + posts feed for one profile |

Note: this actor is cookie-less by design. Some other actors in the suite still use a `cookie` input for authenticated surfaces — check each actor's own README for its specific input requirements.

# 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("crawlerbros/linkedin-profile-scraper").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("crawlerbros/linkedin-profile-scraper").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 crawlerbros/linkedin-profile-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/linkedin-profile-scraper"
        }
    }
}

```

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/DoajKzUlFm5hLgnz4/builds/F85XEPjgqPoVnLUOe/openapi.json
