# LinkedIn Profile Scraper No Cookie (`maximedupre/linkedin-profile-scraper-no-cookie`) Actor

Scrape accessible public LinkedIn profiles from profile URLs or one filtered people search. Get structured rows with identity, work history, education, company details, and available public profile signals without buyer-supplied cookies or login.

- **URL**: https://apify.com/maximedupre/linkedin-profile-scraper-no-cookie.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Social media, Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.85 / 1,000 linkedin profiles

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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 profile data without cookies

LinkedIn Profile Scraper No Cookie helps recruiters, sales teams, and researchers collect accessible public LinkedIn profiles without buyer-supplied cookies or login. Submit profile URLs or one LinkedIn people search with filters. Get structured rows with identity, work history, education, company details, and available public profile signals.

- Review public contact details from a profile with [**LinkedIn contact scraper**](https://apify.com/maximedupre/linkedin-profile-scraper-no-cookie/examples/linkedin-contact-scraper).
- Build a lead list from public profiles with [**LinkedIn lead generation**](https://apify.com/maximedupre/linkedin-profile-scraper-no-cookie/examples/linkedin-lead-generation).
- Find employees by role, company, or location with [**LinkedIn employee search**](https://apify.com/maximedupre/linkedin-profile-scraper-no-cookie/examples/linkedin-employee-search).
- Collect profile details for a known person with [**LinkedIn profile data**](https://apify.com/maximedupre/linkedin-profile-scraper-no-cookie/examples/linkedin-profile-data).
- Find a person from a filtered search with [**LinkedIn people search**](https://apify.com/maximedupre/linkedin-profile-scraper-no-cookie/examples/linkedin-people-search).

#### 📇 Public LinkedIn profile rows

Each successful accessible public profile is saved as one structured dataset row. Rows include the source profile URL, identity, location, headline or summary, current company, work history, education, and other public sections when listed.

#### ▶️ Scrape profiles from URLs or one search

**Run steps**

1. Choose `Profile URLs` to scrape submitted public profile URLs, or `LinkedIn people search` to use one filtered search. Fields for the inactive choice are ignored.
2. Add one or more profile URLs, or add keywords and any people-search filters.
3. Leave `Maximum profiles` empty to return all available results until the source is exhausted, or set a positive limit.
4. Start the run and open the default dataset.

The Actor reads accessible public pages. It does not use buyer-supplied cookies or login state.

#### ⚙️ Input

Use one input mode for each run. The people-search fields apply only when `LinkedIn people search` is selected.

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `findProfilesBy` | string | Select `profileUrls` or `peopleSearch`. Use one mode per run; fields for the inactive mode are ignored. |
| `profileUrls` | array of objects | Public LinkedIn profile URL objects to scrape. Use one URL per item. This field is not used for `peopleSearch`. |
| `profileUrls[].url` | URL string | The public LinkedIn profile URL to scrape. |
| `searchKeywords` | array of strings | Words or phrases for one LinkedIn people search configuration. This is not a list of separate searches. |
| `jobTitles` | array of strings | Filter the people search by job titles. |
| `companies` | array of strings | Filter the people search by company names. |
| `locations` | array of strings | Filter the people search by locations. |
| `schools` | array of strings | Filter the people search by schools. |
| `industries` | array of strings | Filter the people search by industries. |
| `experienceLevels` | array of strings | Filter the people search by experience levels supported by LinkedIn. |
| `seniorityLevels` | array of strings | Filter the people search by seniority levels supported by LinkedIn. |
| `languages` | array of strings | Filter the people search by profile languages. |
| `includeKeywords` | array of strings | Keep profiles that contain one or more of these extra keywords in the search fields. |
| `excludeKeywords` | array of strings | Leave out profiles that contain one or more of these keywords in the search fields. |
| `maxItems` | integer | Stop the LinkedIn people search after this many profiles. Leave it empty to return all available results until the source is exhausted. |

This example is copied from the public input of the successful current-beta default-input run:

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

#### 🧾 Output

The default dataset contains one profile row shape. Required fields are `profileUrl`, `fullName`, `location`, and `currentCompany`. Each row also includes `headline` or `summary`. Optional fields appear when public data is listed.

**Profile row**

| Field | Type | What it does |
| --- | --- | --- |
| `profileUrl` | URL string | The public LinkedIn profile URL. |
| `fullName` | string | The person's full name as shown on the profile. |
| `headline` | string | The person's profile headline, when listed. |
| `summary` | string | The person's profile summary, when listed. |
| `location` | string | The location shown on the profile. |
| `currentCompany` | object | The person's current employer and available company details. |
| `currentCompany.name` | string | The current employer's name. |
| `currentCompany.profileUrl` | URL string | The public LinkedIn page for the current employer, when listed. |
| `currentCompany.description` | string | The current employer's public description, when listed. |
| `currentCompany.industry` | string | The current employer's industry, when listed. |
| `currentCompany.size` | string | The current employer's stated size, when listed. |
| `currentCompany.headquarters` | string | The current employer's headquarters, when listed. |
| `currentCompany.followerCount` | integer | The current employer's follower count, when listed. |
| `currentCompany.websiteUrl` | URL string | The current employer's website, when listed. |
| `currentCompany.logoUrl` | URL string | The current employer's logo URL, when listed. |
| `experience` | array of objects | The current and past roles listed on the profile. |
| `experience[].company` | string | The employer name for this role. |
| `experience[].companyUrl` | URL string | The employer's public LinkedIn page, when listed. |
| `experience[].location` | string | The location listed for this role, when available. |
| `education` | array of objects | The education history listed on the profile. |
| `education[].school` | string | The school name. |
| `education[].schoolUrl` | URL string | The school's public LinkedIn page, when listed. |
| `education[].degree` | string | The degree listed for this school, when available. |
| `education[].fieldOfStudy` | string | The field of study listed for this school, when available. |
| `education[].startDate` | string | The listed start date for this education record, when available. |
| `education[].endDate` | string | The listed end date for this education record, when available. |
| `education[].description` | string | The description listed for this education record, when available. |
| `followersCount` | integer | The person's follower count, when listed. |
| `connectionsCount` | integer | The person's connection count, when listed. |
| `profileStatuses` | array of strings | Status labels shown on the profile, such as job-seeking or hiring status. |
| `profileImageUrl` | URL string | The public profile image URL, when listed. |
| `languages` | array of objects | Languages listed on the profile. |
| `languages[].name` | string | The language name. |
| `languages[].proficiency` | string | The listed proficiency level, when available. |
| `certifications` | array of objects | Certifications listed on the profile. |
| `certifications[].name` | string | The certification name. |
| `certifications[].issuer` | string | The certification issuer, when listed. |
| `certifications[].issueDate` | string | The listed issue date, when available. |
| `certifications[].expirationDate` | string | The listed expiration date, when available. |
| `certifications[].credentialId` | string | The credential ID, when listed. |
| `certifications[].credentialUrl` | URL string | The credential URL, when listed. |
| `projects` | array of objects | Projects listed on the profile. |
| `projects[].name` | string | The project name. |
| `projects[].description` | string | The project description, when listed. |
| `projects[].url` | URL string | The project URL, when listed. |
| `projects[].startDate` | string | The listed start date, when available. |
| `projects[].endDate` | string | The listed end date, when available. |
| `publications` | array of objects | Publications listed on the profile. |
| `publications[].title` | string | The publication title. |
| `publications[].publisher` | string | The publisher, when listed. |
| `publications[].date` | string | The listed publication date, when available. |
| `publications[].url` | URL string | The publication URL, when available. |
| `honors` | array of objects | Honors and awards listed on the profile. |
| `honors[].title` | string | The honor or award title. |
| `honors[].issuer` | string | The honor issuer, when listed. |
| `honors[].date` | string | The listed honor date, when available. |
| `honors[].description` | string | The honor description, when listed. |
| `volunteerExperience` | array of objects | Volunteer work listed on the profile. |
| `volunteerExperience[].role` | string | The volunteer role, when listed. |
| `volunteerExperience[].organization` | string | The volunteer organization. |
| `volunteerExperience[].organizationUrl` | URL string | The organization's public LinkedIn page, when listed. |
| `volunteerExperience[].cause` | string | The cause listed for this volunteer work, when available. |
| `volunteerExperience[].description` | string | The description listed for this volunteer work, when available. |
| `volunteerExperience[].startDate` | string | The listed start date, when available. |
| `volunteerExperience[].endDate` | string | The listed end date, when available. |
| `emails` | array of email strings | Independently found and validated email addresses, when available. |
| `searchKeyword` | string | The one people-search keyword that first found this profile, when search was used. |

This complete row is from the successful current-beta default-input run. Public source values are shown without shortening.

```json
{
  "profileUrl": "https://www.linkedin.com/in/satyanadella",
  "fullName": "Satya Nadella",
  "headline": "Chairman and CEO at Microsoft · 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.",
  "summary": "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.",
  "location": "Redmond, Washington, United States",
  "currentCompany": {
    "name": "Microsoft",
    "profileUrl": "https://www.linkedin.com/company/microsoft",
    "description": "Every company has a mission. What's ours? To empower every person and every organization to achieve more. We believe technology can and should be a force for good and that meaningful innovation contributes to a brighter world in the future and today. Our culture doesn’t just encourage curiosity; it embraces it. Each day we make progress together by showing up as our authentic selves. We show up with a learn-it-all mentality. We show up cheering on others, knowing their success doesn't diminish our own. We show up every day open to learning our own biases, changing our behavior, and inviting in differences. Because impact matters. Microsoft operates in 190 countries and is made up of approximately 228,000 passionate employees worldwide.",
    "industry": "Software Development",
    "size": "10,001+ employees",
    "headquarters": "Redmond, Washington",
    "followerCount": 29151465,
    "websiteUrl": "https://news.microsoft.com",
    "logoUrl": "https://media.licdn.com/dms/image/v2/D560BAQH32RJQCl3dDQ/company-logo_200_200/B56ZYQ0mrGGoAM-/0/1744038948046/microsoft_logo?e=2147483647&v=beta&t=ts9MGrTk7Lz3R1bmAfzCL8euuuuPWPCoXfdiLA2_IzM"
  },
  "experience": [
    {
      "company": "Microsoft",
      "companyUrl": "https://www.linkedin.com/company/microsoft",
      "location": "Greater Seattle Area"
    },
    {
      "company": "University of Chicago"
    }
  ],
  "education": [
    {
      "school": "Starbucks",
      "schoolUrl": "https://www.linkedin.com/company/starbucks",
      "startDate": "2017",
      "endDate": "2024"
    },
    {
      "school": "The Business Council U.S.",
      "schoolUrl": "https://www.linkedin.com/company/the-business-council-us",
      "startDate": "2021",
      "endDate": "2023"
    },
    {
      "school": "Fred Hutch",
      "schoolUrl": "https://www.linkedin.com/company/fredhutch",
      "startDate": "2016",
      "endDate": "2022"
    },
    {
      "school": "The University of Chicago Booth School of Business",
      "schoolUrl": "https://www.linkedin.com/school/universityofchicagoboothschoolofbusiness",
      "startDate": "1994",
      "endDate": "1996"
    }
  ],
  "followersCount": 12000000,
  "connectionsCount": 500,
  "profileImageUrl": "https://media.licdn.com/dms/image/v2/C5603AQHHUuOSlRVA1w/profile-displayphoto-shrink_200_200/profile-displayphoto-shrink_200_200/0/1579726625398?e=2147483647&v=beta&t=Rr7WT9uBM0byOij0oT_KirejIMVE4HK4r8NGIp0zjdI"
}
```

#### 💳 Pricing

**Pay per event**

This Actor uses pay-per-event pricing. The `LinkedIn profile` event covers one accessible public LinkedIn profile with identity and professional details saved to your dataset. Check the pricing panel for the current tiered price.

#### 🔌 Integrations

**Dataset access**

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

Open the default dataset after a run or read its structured rows through the Apify API. Export the dataset in the formats provided by Apify.

#### ❓ FAQ

##### Can I scrape a private or login-gated profile?

No. The Actor reads accessible public LinkedIn profile pages and does not accept buyer-supplied cookies, login state, or source credentials.

##### Can I use profile URLs and people search in one run?

No. Choose one mode. Fields for the inactive choice are ignored.

##### What happens when the same profile matches more than once?

The first eligible match is saved, and later matches for that profile are ignored. The saved row describes the first match. When a people search finds it, `searchKeyword` stores the one keyword that first found it, when that field is returned.

##### What does an empty Maximum profiles value do?

It returns all available results until the source is exhausted. This applies to the LinkedIn people search.

##### Which profile sections can be empty?

Optional public sections such as languages, certifications, projects, publications, honors, and volunteer experience may be missing. The optional `emails` field appears only when independently found and validated email addresses are available.

##### Can one run use several people searches?

No. `searchKeywords` is one search configuration, not a list of separate searches. Run again with another configuration.

### 📝 Changelog

**v0.0** (23-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~linkedin-profile-scraper-no-cookie/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [LinkedIn Company Scraper](https://apify.com/maximedupre/linkedin-company-scraper): Add public employer details such as industry, size, headquarters, and followers.
- [LinkedIn B2B Phone Number Scraper](https://apify.com/maximedupre/linkedin-b2b-phone-number-scraper): Look for public phone numbers and business emails in LinkedIn content when available.
- [LinkedIn Open Profile Status](https://apify.com/maximedupre/linkedin-open-profile-status): Check separate Open Profile and #OpenToWork signals for submitted people.
- [LinkedIn Company People Scraper](https://apify.com/maximedupre/linkedin-company-people-scraper): Map visible employees, roles, and company context from a known LinkedIn company page.
- [Linkedin Profile Scraper ✅ No cookie](https://apify.com/supreme_coder/linkedin-profile-scraper): Compare another option for scraping public LinkedIn profiles.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `findProfilesBy` (type: `string`):

Choose a list of public profile URLs or one LinkedIn people search. Use one choice for each run.

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

Add one or more public LinkedIn profile URLs to scrape. Use one URL per item. People-search fields do not apply to this choice.

## `searchKeywords` (type: `array`):

Add one or more words or phrases for the main LinkedIn people search. This is one search configuration, not a list of separate searches.

## `jobTitles` (type: `array`):

Filter the people search by one or more job titles.

## `companies` (type: `array`):

Filter the people search by one or more company names.

## `locations` (type: `array`):

Filter the people search by one or more locations.

## `schools` (type: `array`):

Filter the people search by one or more schools.

## `industries` (type: `array`):

Filter the people search by one or more industries.

## `experienceLevels` (type: `array`):

Filter the people search by one or more experience levels, using the values supported by LinkedIn.

## `seniorityLevels` (type: `array`):

Filter the people search by one or more seniority levels, using the values supported by LinkedIn.

## `languages` (type: `array`):

Filter the people search by one or more profile languages.

## `includeKeywords` (type: `array`):

Keep profiles that contain one or more of these extra keywords in the search fields.

## `excludeKeywords` (type: `array`):

Leave out profiles that contain one or more of these keywords in the search fields.

## `maxItems` (type: `integer`):

Stop the LinkedIn people search after this many profiles. Leave it empty to return all available results until the source is exhausted.

## Actor input object example

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

# Actor output Schema

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

Open the LinkedIn profile results in the default dataset.

# 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 = {
    "findProfilesBy": "profileUrls",
    "profileUrls": [
        {
            "url": "https://www.linkedin.com/in/satyanadella"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/linkedin-profile-scraper-no-cookie").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 = {
    "findProfilesBy": "profileUrls",
    "profileUrls": [{ "url": "https://www.linkedin.com/in/satyanadella" }],
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/linkedin-profile-scraper-no-cookie").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 '{
  "findProfilesBy": "profileUrls",
  "profileUrls": [
    {
      "url": "https://www.linkedin.com/in/satyanadella"
    }
  ]
}' |
apify call maximedupre/linkedin-profile-scraper-no-cookie --silent --output-dataset

```

## MCP server setup

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

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/nMHQvWUrax6MTYQta/builds/ihFthUF19SKouxm3s/openapi.json
