# LinkedIn Profile Extractor & Enricher (No Login Required) (`insights_data/linkedin-profile-extractor-enricher`) Actor

Extract public LinkedIn profiles from URLs or IDs without login. Get name, headline, location, about, followers, current role, experience, education, skills, certifications, languages, projects and more as clean JSON. Bulk input, live results, no cookies needed.

- **URL**: https://apify.com/insights_data/linkedin-profile-extractor-enricher.md
- **Developed by:** [Insights Data](https://apify.com/insights_data) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 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

### 👤 What is LinkedIn Profile Extractor & Enricher?

**LinkedIn Profile Extractor & Enricher** turns a list of LinkedIn profile URLs or public identifiers into clean, structured LinkedIn profile data for sales, recruiting and research teams. Just paste your profile links and click **Start**: no LinkedIn account, no cookies and no coding needed. You get name, headline, location, about text, followers, current position, experience, education, skills, certifications, languages, projects, publications, websites and more.

> **Note:** the Actor returns public profile details only. It does **not** return email addresses or phone numbers.

It's a LinkedIn profile scraper for people who already know *which* profiles they want and need the public details in a spreadsheet, CRM or database. Think of it as LinkedIn profile enrichment: you bring the links, it fills in the profile details. Use it to:

- **Add context to lead lists:** LinkedIn lead enrichment for sales prospecting. Add current job titles, companies and locations to the names you already have (no emails or phone numbers).
- **Update CRM records:** LinkedIn CRM enrichment for contacts that already have a profile link. You can schedule runs to refresh larger lists.
- **Support recruiting:** LinkedIn recruiting research with work history, education and skills for each candidate on your shortlist.
- **Research accounts before outreach:** read the headline, about text and websites of the people you're about to contact.
- **Study career paths:** compare roles, schools and fields of study across a group of profiles.
- **Feed data pipelines:** every profile is one JSON row, ready for a database, a vector store or an LLM workflow.

#### What can LinkedIn Profile Extractor & Enricher do?

- 📦 **Bulk input:** a bulk LinkedIn profile scraper for long lists. Paste many profile URLs or public identifiers at once, one per line. Duplicates are skipped and not billed.
- 🔓 **No login, no cookies:** you never connect your LinkedIn account.
- ⚡ **Live results:** each profile appears in the Output tab as soon as it's read.
- 🧩 **13 ready-made views:** overview, identity, about, experience, education, skills and languages, certifications, projects, publications, recommendations, honors and awards, volunteering, websites.
- 🧾 **A status for each input:** the free **Inputs** table is designed to give each link you entered a row with its status and a plain-language reason.
- 🙅 **Empty means empty:** fields the public page doesn't show are left empty (`null` or `[]`) instead of being filled with guesses.
- 🛡️ **Apify Proxy when needed:** if LinkedIn limits access, the Actor switches to Apify Proxy by itself. A run can still stop early if LinkedIn keeps limiting access.
- 🔌 **A LinkedIn data extractor on the Apify platform:** run it via API, schedule runs, monitor them, and export to JSON, CSV, Excel, XML or HTML.

***

### 📋 LinkedIn Profile Extractor data: what can you extract?

Each saved profile is one row with the fields below (names exactly as in the dataset). If you need a LinkedIn profile details extractor for a lead list, these are the details you get:

| Field | What you get |
|---|---|
| 👤 `fullName`, `firstName`, `lastName` | Name as shown on the profile |
| 🔗 `publicIdentifier`, `profileUrl` | The profile's public identifier and a clean profile link |
| 📝 `headline` | The headline under the name |
| 📍 `location` | Location shown on the profile |
| 📄 `about` | The About / summary text |
| 🤝 `connectionsCount` | Connections as shown. LinkedIn shows "500+" for large networks, saved as 500, so 500 means "500 or more" |
| 👥 `followerCount` | Follower count |
| 💼 `currentPosition` | Title and company of the first position without an end date |
| 💼 `experience` | Title, company, start and end date, location and description per position |
| 🎓 `education` | School, degree, field of study, start and end date |
| 🧠 `skills` | Skills listed publicly |
| 📜 `certifications` | Name, issuer, issue date, expiration date and link |
| 🗣️ `languages` | Languages listed on the profile |
| 🛠️ `projects` | Title, dates, description and link |
| 📚 `publications` | Title, publisher, date, description and link |
| 💬 `recommendations` | Public recommendations: name and text |
| 🏆 `honorsAndAwards` | Title, issuer, date and description |
| 💚 `volunteering` | Role, organization, cause, dates and description |
| 🌐 `websites` | Website links from the profile |
| 🆔 `id` | LinkedIn member ID, when the page shows exactly one |
| 📸 `photoUrl` | Link to the profile photo |
| ⚠️ `error` | Empty (`null`) for every saved profile. It's kept so every row has the same fields; problems with an input are reported in the Inputs table instead |

> **Note:** LinkedIn hides some sections from logged-out visitors on many profiles (often skills or certifications). These fields stay empty. Dates are `YYYY`, `YYYY-MM` or `YYYY-MM-DD`, depending on what the profile shows; any other date format is kept as the original text. `followerCount` can be a rounded number when the profile shows only a short form such as "12M".

Looking for a LinkedIn profile picture extractor? The Actor gives you the photo **link** (`photoUrl`), not the image file.

#### What data can't LinkedIn Profile Extractor & Enricher extract?

- Email addresses and phone numbers
- Posts, activity, comments and reactions
- Company pages, school pages and job posts (person profiles only)
- Profiles that are private or hidden from logged-out visitors
- Profiles given as Sales Navigator links or numeric / internal profile IDs (these need a login)

Need LinkedIn job posts instead? Try [Advanced LinkedIn Job Search API](https://apify.com/insights_data/advanced-linkedin-job-search-api).

***

### 🧭 How to scrape LinkedIn profiles

LinkedIn Profile Extractor & Enricher is designed for an easy start, even if you've never extracted data from the web before. Here's how to scrape LinkedIn data without writing code:

1. [Create a free Apify account](https://console.apify.com/sign-up) using your email.
2. Open [LinkedIn Profile Extractor & Enricher](https://apify.com/insights_data/linkedin-profile-extractor-enricher). It runs as a LinkedIn profile extractor online, in your browser, with nothing to install.
3. Paste your profile links or public identifiers into **LinkedIn profile URLs**, one per line. Leave the other settings as they are.
4. Click **Start**. The **Log** tab on the run page shows progress messages for each profile.
5. Open the **Output** tab to see the results. For a LinkedIn profile data download, go to **Storage → Datasets → Export** and choose JSON, CSV, Excel, XML or HTML.

***

### 💲 How much does it cost to scrape LinkedIn profiles?

LinkedIn Profile Extractor & Enricher uses **pay-per-event** pricing. Your bill has three parts:

1. **Results:** a price for each profile saved to the dataset. It depends on your Apify plan (table below). Failed, skipped and duplicate inputs are **not billed**.
2. **Actor start:** $0.00005 per run at the default 1 GB memory.
3. **Platform usage:** the compute the run uses, billed at your Apify plan's own rates. It isn't included in the prices below.

The plan discount applies to the result price only. The start fee is the same on every plan, and platform usage is billed at your Apify plan's own rates.

| Apify plan | Price per profile | Price per 1,000 profiles |
|---|---|---|
| 🆓 Free | $0.005 | $5.00 |
| 🌱 Starter | $0.0045 | $4.50 |
| 🚀 Scale | $0.004 | $4.00 |
| 🏢 Business and higher | $0.0035 | $3.50 |

Example result charges (the start fee and platform usage come on top):

| Example | Plan | Result charges |
|---|---|---|
| 🆓 10 profiles in one run | Free | about $0.05 |
| 🌱 1,000 profiles in one run | Starter | about $4.50 |
| 🚀 1,000 profiles in one run | Scale | about $4.00 |
| 🏢 1,000 profiles in one run | Business and higher | about $3.50 |

Platform usage depends on your run, so there's no fixed figure for it here. Start with a small test run (for example 10 profiles), check its total cost on the run page, and scale up from there.

**If a run stops early** (you stop it, it reaches your maximum charge limit, or LinkedIn limits access), the profiles saved so far stay in your dataset. You pay for those profiles, plus the start fee and the platform usage of the time the run was active. Links that weren't tried are not billed.

To cap your spending, set a **maximum charge limit** in the run options when you start a run. When the limit is reached, the Actor stops and keeps every profile saved so far.

See the [pricing tab](https://apify.com/insights_data/linkedin-profile-extractor-enricher/pricing) for the current prices.

#### Is scraping LinkedIn profiles free?

You can start for free. The [Apify Free plan](https://apify.com/pricing) gives you $5 in monthly credit, and Free-plan runs work the same as paid runs. The credit is used up by the result charges **and** platform usage together, so the number of profiles you get is lower than $5 ÷ $0.005 = 1,000. So you can scrape LinkedIn profiles free of charge for small lists.

Want to try the LinkedIn profile API free? Create a free account, run 10 profiles and check the results and the cost before you spend anything.

***

### ⬇️ LinkedIn Profile Extractor input

To run LinkedIn Profile Extractor & Enricher, you only need **one or more LinkedIn profile URLs or public identifiers**. Set the input in the Actor's interface or send it as JSON via the API.

#### Settings most people change

| Setting | Field | What it does |
|---|---|---|
| 🔗 LinkedIn profile URLs | `urls` (required) | Your profiles, one per line. Full URLs, regional links and bare public identifiers all work. This is the only field most people need. |
| 🛡️ Proxy configuration | `proxyConfiguration` | Leave the default. The run starts without a proxy and switches to Apify Proxy by itself if LinkedIn limits access. `"useApifyProxy": false` only sets how the run starts; it doesn't turn that switch off. You can also choose a proxy to start with. |

Got a CRM column full of profile links? That's LinkedIn URL enrichment: paste the column into `urls` and you get one structured row per profile.

#### Optional extra lists (most people can ignore these)

Each of these is merged with `urls` into one list. They exist so you can send input from other tools without renaming fields.

| Setting | Field | When to use it |
|---|---|---|
| 🎯 Target URLs | `queries` | A second list of profile URLs or public identifiers |
| 🔖 Public identifiers | `publicIdentifiers` | A list of public identifiers only, e.g. `satyanadella` for `https://www.linkedin.com/in/satyanadella` |
| 🔢 LinkedIn profile IDs | `profileIds` | Numeric or internal LinkedIn IDs are **not supported**: they can't be opened without a login, so they're listed in the Inputs table as failed (not billed). Profile URLs or public identifiers put here are handled like normal inputs. |

Here's an example that reads two public profiles:

```json
{
  "urls": [
    "https://www.linkedin.com/in/williamhgates",
    "https://www.linkedin.com/in/satyanadella"
  ],
  "proxyConfiguration": { "useApifyProxy": false }
}
```

See the [input tab](https://apify.com/insights_data/linkedin-profile-extractor-enricher/input-schema) for a full description of all fields.

#### Which profile links work?

The Actor cleans up query strings and trailing slashes, accepts regional subdomains, and skips duplicates.

- ✅ Good: `https://www.linkedin.com/in/satyanadella`
- ✅ Good: `satyanadella`
- ✅ Good: `https://de.linkedin.com/in/satyanadella/?trk=public_profile`
- ❌ Bad: `https://www.linkedin.com/company/microsoft` (a company page, not a person)
- ❌ Bad: a Sales Navigator link (`/sales/...`) or a numeric member ID (these need a login)

***

### ⬆️ LinkedIn Profile Extractor output

Results appear in the run's **Output** tab while the run is going. Your LinkedIn profile dataset comes with 13 views (overview, experience, education and so on).

- **Download:** for a LinkedIn profile data export, go to **Storage → Datasets → Export** and choose JSON, CSV, Excel, XML or HTML. You can also pick only the fields you need there.
- **JSON:** to export LinkedIn profile to JSON for a script or LLM pipeline, choose JSON there or read the dataset via the API.
- **Spreadsheets:** in CSV or Excel, nested fields such as `experience` are split into numbered columns (`experience/0/title`, `experience/1/title`, and so on). For one row per position or school, open the **Experience** or **Education** view instead.

The run also gives you two extra results, both linked on the run's **Output** tab:

- 🧾 **Inputs:** one row per input with `input`, `status`, `fullName`, `publicIdentifier`, `profileUrl`, `errorCode` and `errorMessage`. Free, not billed.
- 📊 **Run summary:** the run totals (profiles saved, profiles billed, failed, skipped, duration). It's stored as a record called `SUMMARY` in the run's storage, which you can also find in the **Storage** tab.

#### Inputs table statuses

| Status | What it means | Billed? |
|---|---|---|
| ✅ `saved` | The profile was read and saved to the dataset | Yes |
| ❌ `failed` | The input couldn't be read. `errorMessage` says why: profile doesn't exist, private or hidden, not a person profile link, numeric ID, LinkedIn limited access, connection problem, or page layout not readable | No |
| ⏭️ `skipped` | Not tried, or not saved, because the run stopped first: "spend limit reached" (your maximum charge limit), "LinkedIn is limiting access" or "connection lost" | No |
| 🔁 `duplicate` | The same profile appears earlier in your list | No |

#### JSON example

Results for the input example above (long values shortened with "..."):

```json
[
  {
    "firstName": "Bill",
    "lastName": "Gates",
    "fullName": "Bill Gates",
    "publicIdentifier": "williamhgates",
    "profileUrl": "https://www.linkedin.com/in/williamhgates",
    "headline": "Chair, Gates Foundation and Founder, Breakthrough Energy",
    "location": "Seattle, Washington, United States",
    "about": "Chair of the Gates Foundation. Founder of Breakthrough Energy.",
    "connectionsCount": 500,
    "followerCount": 40730830,
    "experience": [
      { "title": "Co-chair", "companyName": "Gates Foundation", "startDate": "2000", "endDate": null, "location": null, "description": null }
    ],
    "education": [
      { "schoolName": "Harvard University", "degreeName": null, "fieldOfStudy": null, "startDate": "1973", "endDate": "1975" }
    ],
    "skills": ["Software Development"],
    "certifications": [],
    "languages": ["English"],
    "projects": [],
    "publications": [],
    "websites": ["https://gatesnot.es/sourcecode-li"],
    "id": "251749025",
    "photoUrl": "https://media.licdn.com/dms/image/v2/...",
    "currentPosition": { "title": "Co-chair", "companyName": "Gates Foundation" },
    "recommendations": [],
    "honorsAndAwards": [],
    "volunteering": [],
    "error": null
  },
  {
    "firstName": "Satya",
    "lastName": "Nadella",
    "fullName": "Satya Nadella",
    "publicIdentifier": "satyanadella",
    "profileUrl": "https://www.linkedin.com/in/satyanadella",
    "headline": "Chairman and CEO at Microsoft",
    "location": "Redmond, Washington, United States",
    "about": "As chairman and CEO of Microsoft, I define my mission and that of my company as empowering every person and every organization on the planet to achieve more.",
    "connectionsCount": 500,
    "followerCount": 12229902,
    "experience": [
      { "title": "Chairman and CEO", "companyName": "Microsoft", "startDate": "2014-02", "endDate": null, "location": "Greater Seattle Area", "description": null }
    ],
    "education": [
      { "schoolName": "University of Wisconsin-Milwaukee", "degreeName": "Master's Degree", "fieldOfStudy": "Computer Science", "startDate": null, "endDate": null }
    ],
    "skills": [],
    "certifications": [],
    "languages": [],
    "projects": [],
    "publications": [],
    "websites": ["https://snscratchpad.com/"],
    "id": "19186432",
    "photoUrl": "https://media.licdn.com/dms/image/v2/...",
    "currentPosition": { "title": "Chairman and CEO", "companyName": "Microsoft" },
    "recommendations": [],
    "honorsAndAwards": [],
    "volunteering": [],
    "error": null
  }
]
```

#### Inputs table example

```json
{
  "input": "https://www.linkedin.com/company/microsoft",
  "status": "failed",
  "fullName": null,
  "publicIdentifier": null,
  "profileUrl": null,
  "errorCode": "invalid_input",
  "errorMessage": "Not a LinkedIn profile URL or public identifier. This is a LinkedIn company link, not a person's profile."
}
```

***

### 💡 Tips and known limits

#### How many results can you scrape with LinkedIn Profile Extractor & Enricher?

There is no per-run limit, and your maximum charge limit is respected. The number you get depends on how many of your profiles are public and on whether LinkedIn limits access during the run. A quick test run with a few of your profiles shows what to expect.

#### What happens when LinkedIn limits access?

The Actor first switches to Apify Proxy. If several profiles in a row still can't be loaded, the run stops early. Every profile saved so far is kept, and the links that weren't tried are marked "Not attempted: LinkedIn is limiting access" in the Inputs table. Try those links again in a later run.

#### Known issues

- **Hidden sections:** some sections are hidden from logged-out visitors on many profiles, so they come back empty.
- **Connections:** `connectionsCount` stops at 500 because LinkedIn shows "500+".
- **Followers:** `followerCount` can be rounded when only a short form like "12M" is shown.
- **Page changes:** the Actor is designed to report a profile it can't read (`layout_changed` in the Inputs table) rather than save wrong data.

***

### 🔌 LinkedIn Profile Extractor integrations and API

#### Can I use LinkedIn Profile Extractor & Enricher as an API?

Yes. The [Apify API](https://docs.apify.com/api/v2) lets you use the Actor as a LinkedIn profile API: start runs, schedule them, and fetch results from your own code. API runs are charged the same way as runs started in Console, so the LinkedIn profile API pricing is the plan table in the pricing section above. Use the `apify-client` [NPM package](https://apify.com/insights_data/linkedin-profile-extractor-enricher/api/javascript) for Node.js or the `apify-client` [PyPI package](https://apify.com/insights_data/linkedin-profile-extractor-enricher/api/python) for Python. See the [API tab](https://apify.com/insights_data/linkedin-profile-extractor-enricher/api) for ready-to-use code.

#### Is there a LinkedIn profile scraper API for my own app?

This Actor can be one. Send a list of profile URLs and get JSON back with the same fields as the dataset, which makes it a simple LinkedIn profile data API for internal tools. Each saved profile is billed as one result.

#### Can I use it as a LinkedIn profile enrichment API for my CRM?

Yes, for contacts that already have a profile link. Send the links from your CRM through the API or an integration such as Make or Zapier, and write the returned fields (job title, company, location, experience) back to each contact. Used this way, it's a LinkedIn enrichment API for public profile details. It doesn't add emails or phone numbers.

#### How to use the LinkedIn profile scraper Python client

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("insights_data/linkedin-profile-extractor-enricher").call(run_input={
    "urls": [
        "https://www.linkedin.com/in/williamhgates",
        "https://www.linkedin.com/in/satyanadella",
    ],
    "proxyConfiguration": {"useApifyProxy": False},
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["fullName"], "-", item["headline"])
```

#### Can I integrate LinkedIn Profile Extractor & Enricher with other apps?

Yes. Connect it with almost any cloud service through [Apify integrations](https://apify.com/integrations): **Make, Zapier, n8n, Slack, Google Sheets, Google Drive, Airbyte, GitHub, LangChain** and more. Use [webhooks](https://docs.apify.com/integrations/webhooks) to trigger actions whenever a run finishes, and **Schedules** in Apify Console to run it automatically.

Example workflow: schedule a weekly LinkedIn profile data fetch for the profile links in a Google Sheet, then send the current job titles to your CRM. To spot job changes, compare each run with the previous one in your sheet or CRM. You can also build a LinkedIn profile scraper n8n workflow that reads new profile links, runs the Actor and writes the results back.

#### Can I use LinkedIn Profile Extractor & Enricher with AI agents (MCP)?

Yes. Connect it to Claude and other AI assistants through the Apify MCP server. Open the [MCP tab](https://apify.com/insights_data/linkedin-profile-extractor-enricher/api/mcp) for setup steps.

***

### 🧰 Other LinkedIn and recruiting scrapers

These Actors from the same author complement LinkedIn Profile Extractor & Enricher when you research jobs, companies and founders:

- 💼 [Advanced LinkedIn Job Search API](https://apify.com/insights_data/advanced-linkedin-job-search-api): scrape public LinkedIn jobs by search URL, job URL or title + location. Get title, company, salary, seniority, applicants and the full description as clean JSON. No login or cookies needed.
- 🦄 [Y Combinator Scraper](https://apify.com/insights_data/y-combinator-scraper): extract company profiles, founders, open roles, press and Launch YC posts from Y Combinator's public directory. Built for lead gen, recruiting and deal sourcing.
- 📌 [Welcome to the Jungle Jobs Scraper](https://apify.com/insights_data/welcome-to-the-jungle-jobs-scraper): scrape Welcome to the Jungle jobs by keyword, location, salary, remote or direct URLs. Ideal for recruiting intel and salary research.

***

### ❓ FAQ

#### Is it legal to scrape LinkedIn?

Web scraping is generally legal if you extract publicly available data, but you should respect personal data and intellectual property rules. LinkedIn profiles contain personal data, so laws such as the GDPR apply: only collect it with a legitimate reason, and take LinkedIn's [User Agreement](https://www.linkedin.com/legal/user-agreement) into account. This Actor reads only what LinkedIn shows to logged-out visitors. This isn't legal advice; check the rules for your use case.

#### Can you scrape LinkedIn profiles without an account?

Yes, for public profile data. The Actor reads only what logged-out visitors can see, so you don't need a LinkedIn account to use it.

#### LinkedIn scraper no login: is my own account at risk?

No. Your LinkedIn account isn't connected or used at all, so nothing in a run happens under your name.

#### LinkedIn profile scraper no cookies: what does that mean?

You don't copy any cookies from your browser into the input. You only enter profile links or public identifiers, and the Actor opens those public profiles the way a logged-out visitor does.

#### How does LinkedIn Profile Extractor & Enricher work?

It works like a logged-out visitor opening each profile page, only faster. As a LinkedIn profile scraper without login, it cleans up your links, removes duplicates, opens each public profile, reads the visible sections and saves one structured row right away. Each input also gets a status row in the Inputs table, and the run summary is saved at the end.

#### Do I need LinkedIn profile API access or a developer app?

No. The official way to get LinkedIn API profile data is through LinkedIn's [developer programs](https://developer.linkedin.com/), which start with creating a developer app. This Actor doesn't need one: you paste profile links and get the public profile details back. If you already have official API access that covers your use case, that may suit you better.

#### How is LinkedIn Profile Extractor & Enricher different from copying profiles by hand?

| Feature | LinkedIn Profile Extractor & Enricher | Copying by hand |
|---|---|---|
| 📦 Many profiles at once | ✅ Paste a whole list | ❌ One at a time |
| 🧩 Structured fields (experience, education, skills) | ✅ Separate fields and views | ❌ Free text you have to sort |
| 🔌 API, schedules, integrations | ✅ | ❌ |
| 🧾 Status for inputs that couldn't be read | ✅ Inputs table | ❌ |
| 💲 Cost | Per saved profile (see pricing) | Your time |

#### Why scrape LinkedIn profile data?

- **Sales:** LinkedIn data enrichment for lead lists and account research (job titles, companies, locations; no contact details).
- **Marketing ops:** a LinkedIn enrichment tool for keeping contact records current.
- **Recruiting:** compare candidates' experience, education and skills side by side.
- **Research:** a LinkedIn profile information extractor for studying career paths, schools and job titles across a group.
- **AI and data teams:** structured profile rows for search, matching or LLM pipelines.

#### What can a LinkedIn public profile scraper see?

Only what LinkedIn shows to logged-out visitors. As a LinkedIn public profile scraper, it can't read private profiles, profiles hidden from logged-out viewers, or sections LinkedIn hides from the public. These come back empty or are listed in the Inputs table.

#### Why am I getting fewer results than expected?

1. **Check the Inputs table** (on the run's Output tab): it gives a reason for each input that wasn't saved.
2. **Duplicates:** the same profile given twice is saved once.
3. **LinkedIn limited access:** the run may stop early. Run the "Not attempted" links again later.
4. **Maximum charge limit:** if you set one, the run stops when it's reached.

***

### 📧 Support and feedback

Found a bug or have a feature request? Please create an issue on the [Issues tab](https://apify.com/insights_data/linkedin-profile-extractor-enricher/issues/open).

Need a **custom solution**, more fields or a different data source? Contact us at hello.insights.data@gmail.com.

Built and maintained by [insights_data](https://apify.com/insights_data) on Apify.

# Actor input Schema

## `urls` (type: `array`):

One profile per line – bulk lists welcome. Full URLs (https://www.linkedin.com/in/williamhgates), regional links (uk.linkedin.com/in/...) and bare public identifiers (williamhgates) all work; query strings and trailing slashes are cleaned up and duplicates are skipped.

## `queries` (type: `array`):

Optional extra list of LinkedIn profile URLs or public identifiers (the last part of the URL). Merged with the list above.

## `publicIdentifiers` (type: `array`):

Optional list of public identifiers – the last part of a profile URL, e.g. satyanadella for https://www.linkedin.com/in/satyanadella.

## `profileIds` (type: `array`):

Optional list of numeric or internal LinkedIn profile IDs. These cannot be opened without a login, so each one is listed in the Inputs table as unsupported – use the profile URL or public identifier instead.

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

By default no proxy is used. If LinkedIn blocks the requests, the run switches to an Apify datacenter proxy and then to a residential proxy automatically, and stays there for the rest of the run. You can also start directly on a proxy of your choice.

## Actor input object example

```json
{
  "urls": [
    "https://www.linkedin.com/in/williamhgates",
    "https://www.linkedin.com/in/satyanadella"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

One row per profile with the key facts.

## `identity` (type: `string`):

Names, identifiers and links.

## `about` (type: `string`):

Headline, about text and websites.

## `experience` (type: `string`):

One row per position.

## `education` (type: `string`):

One row per school.

## `skills` (type: `string`):

Skills and languages per profile.

## `certifications` (type: `string`):

One row per license or certification.

## `projects` (type: `string`):

One row per project.

## `publications` (type: `string`):

One row per publication.

## `recommendations` (type: `string`):

One row per public recommendation.

## `honors` (type: `string`):

One row per honor or award.

## `volunteering` (type: `string`):

One row per volunteer role.

## `websites` (type: `string`):

One row per website linked from a profile.

## `inputs` (type: `string`):

One row per input with its status and any problem.

## `summary` (type: `string`):

Totals for the run.

# 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 = {
    "urls": [
        "https://www.linkedin.com/in/williamhgates",
        "https://www.linkedin.com/in/satyanadella"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("insights_data/linkedin-profile-extractor-enricher").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 = {
    "urls": [
        "https://www.linkedin.com/in/williamhgates",
        "https://www.linkedin.com/in/satyanadella",
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("insights_data/linkedin-profile-extractor-enricher").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 '{
  "urls": [
    "https://www.linkedin.com/in/williamhgates",
    "https://www.linkedin.com/in/satyanadella"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call insights_data/linkedin-profile-extractor-enricher --silent --output-dataset

```

## MCP server setup

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

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/98LDLJGcum7W8C2a4/builds/AqUnbiBo0krM4E50n/openapi.json
