# LinkedIn Profile Scraper + Email (No Cookies) (`data_wiki/linkedin-profile-scraper-email-no-cookies`) Actor

Scrape public LinkedIn profiles in bulk with no login or cookies. Get jobs, education, skills, certifications, company data and a work email with confidence score. Spot job changes between runs. Clean JSON for lead enrichment, recruiting and sales prospecting.

- **URL**: https://apify.com/data_wiki/linkedin-profile-scraper-email-no-cookies.md
- **Developed by:** [Data WiKi](https://apify.com/data_wiki) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.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 Scraper + Email?

**LinkedIn Profile Scraper + Email** is a LinkedIn profile scraper that turns public [LinkedIn](https://www.linkedin.com) profile links into one structured row per person: jobs, education, skills, company details and an inferred work email. Just **paste profile links or profile names**, press Start, and download the rows as JSON, CSV or Excel. It needs no cookies, because it reads only what a visitor sees without logging in.

- 🎯 **LinkedIn profile scraper no cookies:** there is no account, password or session to manage. That is the simplest way to scrape LinkedIn profiles without login.
- 📈 **Bulk input:** paste a whole list of links, names or both, and duplicates are removed. It works as a bulk LinkedIn profile scraper for lists you already have.
- 📧 **Work email with a status:** the email search guesses the likely address and tells you how sure it is. It can be wrong, so always read the status.

> 💡 Need creator data as well? Try the [Douyin profile scraper](https://apify.com/data_wiki/douyin-profile-scraper-followers-posts-hashtags) for public creator profiles.

### ✨ What can this LinkedIn Profile Scraper + Email do?

- 🔎 **Read public profiles in bulk** from links, profile names (the last part of a link) or long member IDs.
- 🗂️ **Collect the full public profile:** headline, About text, location, followers, jobs, schools, skills, languages, certifications, projects and more.
- 🏢 **Add the current employer:** website, industry, size, headquarters and employee count from the employer's public page.
- 📧 **Search for a work email** with two modes: ask the company's mail server whether the address exists (no mail is sent), or return ranked guesses only.
- 🔁 **Track job changes** by comparing with the dataset of an earlier run.
- ✂️ **Keep only the columns you need** with the fields to keep and fields to leave out.
- 📥 **Export** the data in **JSON, CSV, Excel, HTML or XML**.
- 🔌 **Use the API**, schedules, webhooks and **integrations with other apps**.

### 📊 What data can this LinkedIn Profile Scraper + Email extract?

As a LinkedIn data extractor, it returns the fields below for each profile. It is a LinkedIn profile data extractor for public pages only. The fields come from the public page, so what you get depends on what that page shows.

| | | |
|---|---|---|
| 👤 Full name, first and last name | 📝 Headline and About text | 📍 Location (text, country, city) |
| 📊 Followers and connections text | 💼 Jobs (title, company, dates, duration) | 🎓 Education (school, degree, dates) |
| 🧠 Skills and top skills | 🗣️ Languages | 📜 Certifications |
| 🏅 Projects, volunteering, publications, honors, courses | 🏢 Current company details | 📧 Work email, status and confidence |
| 🫂 Similar profiles ("people also viewed") | 📰 Recent public posts and articles | ✅ Completeness, visibility and data warnings |

Some fields are worked out by the Actor from the profile: seniority, department, years of experience, average time in a job and months in the current role.

> ⚠️ **Note:** LinkedIn shows logged-out visitors only part of a profile. Blurred job titles, premium or verified badges, open-to-work flags and contact details stay `null`, and the row lists the reasons in `dataWarnings`. Photo links can expire.

#### Data LinkedIn Profile Scraper + Email can't extract

- It does not log in, so private, connection-only and login-only data is never collected.
- It does not run a LinkedIn profile search: you give it links or names, and it does not find people by keyword. It is not a LinkedIn candidate finder.
- It is not a LinkedIn sales navigator data extractor, and it does not read Sales Navigator pages.
- It is not a full LinkedIn company data extractor: it reads only the current employer of each profile.
- It does not send messages or connection requests, so it is not one of the LinkedIn automation tools for lead generation that act on your behalf.
- It does not read emails from LinkedIn. The email is inferred, see the FAQ below. Used as a LinkedIn email finder tool, it works on profiles you already have, and the address can be wrong.
- The similar profiles field keeps the "people also viewed" cards of one profile and does not follow them across the network.
- Recent posts and articles are only the few items the public page shows, not a full feed.

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

LinkedIn Profile Scraper + Email uses **pay-per-event pricing**: you pay for each profile row it saves, with no subscription to the Actor. Failed or missing profiles are listed in a status table and are not charged. Apify platform usage is billed to you in addition to the events below.

#### Base pricing

- **Results** (`main_result`): charged once for every profile row saved with an `ok` status (this includes `ok_alias`). A profile whose page was only partly visible still counts as a saved row.
- **Actor start** (`apify-actor-start`): $0.00005 per run, charged once per GB of memory. The Actor is configured with 1024 MB of memory, which is one GB.

#### Pricing by plan tier

| Plan tier | Results (per 1,000 profiles) |
|---|---|
| 🆓 Free | $8.00 (0.008 x 1,000) |
| 🥉 Bronze | $7.20 (0.0072 x 1,000) |
| 🥈 Silver | $6.50 (0.0065 x 1,000) |
| 🥇 Gold and above | $5.50 (0.0055 x 1,000) |

Example: 500 profiles on the Gold tier cost 500 x $0.0055 = $2.75, plus the $0.00005 start fee. The same 500 profiles on the Free tier cost 500 x $0.008 = $4.00, plus the start fee. Platform usage comes on top. You can set a maximum spend per run, and the Actor stops cleanly when the limit is reached and keeps the rows already saved.

#### Why pay-per-event?

- **Transparent:** you pay for saved profile rows.
- **Predictable:** you can estimate the cost from the number of links.
- **No idle charges:** waiting time between requests is not billed as an event.

### 🛠️ How do I use LinkedIn Profile Scraper + Email to scrape LinkedIn profiles?

1. [Create a free Apify account](https://console.apify.com/sign-up).
2. Open **LinkedIn Profile Scraper + Email** in the Apify Store.
3. Paste profile links into **Profile links**, or add profile names, then pick **What to collect**.
4. Click **Start** and watch the log; each profile appears in the Output tab as soon as it is saved.
5. Download the data as JSON, CSV or Excel, or fetch it with the API.

Because it is a LinkedIn profile scraper online, it runs in the cloud and there is nothing to install. It is not a LinkedIn profile scraper extension, so you do not need Chrome.

### ⬇️ Input

Only **Profile links** (`urls`) is required. You can also add profile names (`publicIdentifiers`), a mixed list (`queries`) and long member IDs (`profileIds`); all are merged and de-duplicated. Here is a simple example input (two fictional profiles, with the email search on):

```json
{
    "urls": [
        "https://www.linkedin.com/in/example-person-one",
        "https://www.linkedin.com/in/example-person-two"
    ],
    "maxProfiles": 10,
    "profileScraperMode": "Profile details + email search",
    "emailVerification": "smtp",
    "acceptUnverifiedEmail": false
}
```

Open the **Input** tab for a full explanation of every field.

#### Max profiles

`maxProfiles` stops the run after that many profiles. The default is 10, the allowed range is 0 to 1,000,000, and **0 means no cap**. Set 0 or a larger number when you scrape a long list.

#### What to collect and email checking

`profileScraperMode` is either `Profile details` or `Profile details + email search`. The LinkedIn profile scraper email search is optional and is off when you choose `Profile details`. With the email search, `emailVerification` is `smtp` (ask the company's mail server whether the address exists, no mail is sent) or `none` (ranked guesses only). Company details are always switched on when the email search is on, because the search needs the employer's website.

#### Show best unverified guess

`acceptUnverifiedEmail` is off by default. When no address could be confirmed and this is off, `email` stays `null` and only the status says what happened. Turn it on to also receive the most likely guess, and treat it as a guess.

#### Profile IDs

Long member IDs that start with `ACoA` are accepted, but public pages rarely resolve them, so those rows usually come back as `not_found`. Links and names work best.

#### Fields to keep and leave out, and job-change monitoring

`outputFields` keeps only the listed fields (`status` and `query` always stay) and `excludeFields` removes fields afterwards. Pick the dataset of an earlier run in `compareWith` to add `changes` and `jobChange` to profiles found in both runs.

#### Proxy

The run starts without a proxy. If LinkedIn refuses requests, it switches to a proxy and stays there. The `proxyConfiguration` field lets you choose proxy settings.

### ⬆️ Output

Results appear in the **Output** tab as separate tables: profiles, about, emails, company, experience, education, skills, languages, certifications, projects and awards, similar profiles, recent posts, recent articles, and data quality and changes. A second table, **Input status**, has one row for every input, failed ones included, and a **Run summary** holds the totals. Export as **JSON, CSV or Excel**, and pick or leave out fields before exporting, so you can export LinkedIn profiles to CSV with only the columns you need. Every row is structured JSON, so it can serve as LinkedIn profile data for AI tools or notebooks.

#### Example output (illustrative)

This is a fictional row, shortened. It does not describe a real person.

```json
{
    "publicIdentifier": "example-person-one",
    "linkedinUrl": "https://www.linkedin.com/in/example-person-one",
    "firstName": "Alex",
    "lastName": "Example",
    "fullName": "Alex Example",
    "headline": "Head of Sales at Example Corp",
    "location": { "linkedinText": "Example City, Exampleland" },
    "followerCount": 1200,
    "currentCompany": "Example Corp",
    "currentTitle": "Head of Sales",
    "seniority": "head",
    "department": "sales",
    "experience": [
        { "position": "Head of Sales", "companyName": "Example Corp", "isCurrent": true }
    ],
    "company": { "name": "Example Corp", "industry": "Software Development", "website": "https://www.example.com" },
    "email": null,
    "emailStatus": "smtp_unavailable",
    "emailConfidence": 25,
    "status": "ok",
    "completeness": 80,
    "query": "https://www.linkedin.com/in/example-person-one"
}
```

#### Output fields explained

| Field | Meaning |
|---|---|
| `status` | `ok`, `ok_alias` (the page resolved to a different identifier than requested), `not_found`, `blocked`, `error`, `parse_error` or `skipped`. |
| `error` | A short note when the status is not `ok`. |
| `emailStatus` | How the email result was reached, for example `verified`, `inferred`, `accept_all_guess`, `unverified_guess`, `smtp_unavailable`, `not_found`, `no_name`, `no_domain`, `no_mx`. |
| `emailConfidence` | A fixed score for each outcome, not a probability. |
| `email` | The address, or `null` when none could be confirmed and unverified guesses are off. |
| `completeness` | Share of ten key fields that were found, in percent. |
| `profileVisibility` | `public`, `partial` or `restricted`, depending on how much the page showed. |
| `dataWarnings` | Reasons a row may be thinner than it looks. |
| `changes`, `jobChange` | Differences from the earlier run, only when `compareWith` is set. |

### 🔒 Personal data and responsible use

This Actor handles personal data: names, job history, photos, locations and inferred work emails. It collects only what a visitor can see without logging in, but public data is still personal data.

- ⚖️ **You decide the purpose.** You need a lawful basis for collecting and storing the data, for example under GDPR or CCPA, and you must handle access and deletion requests.
- 📨 **Outreach rules apply.** Anti-spam and e-privacy laws apply to any email you send, and an inferred address may belong to the wrong person or not exist.
- 📜 **Check the site's terms.** [LinkedIn](https://www.linkedin.com)'s terms may restrict automated collection. Read them and decide at your own risk.
- 🧹 **Collect less.** Use the fields to keep and leave out to store only what you need, and delete data you no longer need.

This is not legal advice, and the Actor makes no promise that your use is lawful.

### 🎯 Use cases

- 🎯 **Lead enrichment:** add job history, seniority and a likely work email to contacts you already hold in a CRM or a LinkedIn lead generation tool. Use it as one step in B2B lead enrichment with email.
- 📋 **Sales prospecting:** build a sales prospecting list from LinkedIn profiles you already chose, with title, company and company size in one table.
- 👔 **Recruiting:** read skills, education and experience of candidates you already know, as input to your own LinkedIn recruiting sourcing tool.
- 🔄 **Job-change alerts:** run the same list again with `compareWith` to track job changes of key contacts with a simple LinkedIn job change tracker.
- 🧩 **CRM data:** add public profile data to your CRM rows for LinkedIn profile enrichment, and employer details for LinkedIn contact enrichment. The same rows also support LinkedIn person enrichment of single records.
- 🤖 **AI and research:** feed the clean JSON rows into a research notebook or an AI agent.
- 🫂 **Similar people:** use the similar profiles field to see who else visitors look at on one profile.
- 📰 **Recent activity:** read the recent public posts and articles that the profile page shows.

### 🔗 What are other tools for LinkedIn profile data?

- [Douyin creator profile data](https://apify.com/data_wiki/douyin-profile-scraper-followers-posts-hashtags): public creator profiles with followers, posts and hashtags, no login.
- [Facebook group scraper](https://apify.com/data_wiki/facebook-group-scraper): posts, comments, authors and member counts from public groups, useful for lead and community research.
- [Instagram hashtag scraper](https://apify.com/data_wiki/instagram-hashtag-scraper): find creators and reels by hashtag for influencer discovery.
- [Facebook comment scraper](https://apify.com/data_wiki/facebook-comment-scraper): comments and replies from public posts for sentiment and lead research.

For help with runs, schedules and API calls, see the [Apify documentation](https://docs.apify.com/platform).

### ❓ Frequently asked questions

#### How does LinkedIn Profile Scraper + Email work?

You give it public profile links or names. It opens each public profile as a visitor would, reads the details, optionally adds the employer's public details and an email search, and saves one row per profile. Rows appear in the Output tab while the run is still going.

#### Can I scrape LinkedIn profiles without login?

Yes. It is a LinkedIn scraper no login is needed for, so there is no account, password or session to provide. The trade-off is that you only get the partial view that logged-out visitors see.

#### Can you scrape LinkedIn profiles in bulk?

Yes. Add as many links or names as you like and set `maxProfiles` (0 means no cap). Requests are spaced out on purpose to stay polite, so a long list takes time.

#### How accurate is the work email, and how do I get it?

Treat it as a good guess, not a fact. To find work email from LinkedIn profile data, switch on **Profile details + email search**; the Actor builds likely addresses from the person's name and the employer's website, and in `smtp` mode asks the employer's mail server whether the address exists. Many servers accept everything or refuse such checks, and the check can be unavailable from the network a run uses, so results vary. The `emailStatus` and `emailConfidence` fields tell you how far to trust each result.

#### Why is the email empty?

Wondering how to find someone's work email on LinkedIn? The page rarely shows it to logged-out visitors, and this Actor does not read addresses from the page. Each row gets an inferred address instead, which is the only sense in which it is a LinkedIn profile email scraper. When no address could be confirmed, `email` stays `null` unless you turn on **Show best unverified guess**, and the status says what happened.

#### Why am I getting fewer results or empty fields than expected?

Rows with status `not_found` mean the profile is unavailable or private; `blocked` means LinkedIn kept refusing requests, so try again later. Empty fields mean the public page did not show them, and `dataWarnings` explains thin rows. Rows with the statuses `not_found`, `blocked`, `error`, `parse_error` and `skipped` are not charged.

#### What are the limits of LinkedIn Profile Scraper + Email?

It reads only public pages, cannot search for people, and does not read login-only data. Requests are paced, so very large lists are slow. A blocked or private profile becomes a status row with no profile data.

#### Can I integrate it with other apps, n8n or Make?

Yes. Through the Apify platform you can connect it with Make, Zapier, Slack, Airbyte, GitHub and Google Sheets, or use webhooks to react when a run finishes. A LinkedIn profile scraper n8n workflow can use the Apify node to call this Actor; see the [Apify integrations docs](https://docs.apify.com/platform/integrations).

#### Can I use it through an API or from Python?

Yes. Runs can be started and read through the [Apify API](https://docs.apify.com/api/v2) and the `apify-client` packages for Node.js and Python. The Actor then works as a LinkedIn profile scraper API for your own apps. A short LinkedIn profile scraper Python script only has to start the Actor and read the dataset. The run URL is `https://api.apify.com/v2/actors/data_wiki~linkedin-profile-scraper-email-no-cookies/runs`, and a LinkedIn profile API style call can be made from any language. The API tab of this LinkedIn profile scraper Apify Actor shows ready-made code.

#### Can I use it with AI agents through MCP?

Yes. The hosted Apify MCP server (`https://mcp.apify.com`) lets an AI agent find an Actor with `search-actors`, check it with `fetch-actor-details` and run it with `call-actor`. That makes it a LinkedIn profile scraper AI agents can run on links you provide.

#### Is it legal to scrape LinkedIn data?

The Actor reads only public data that any visitor can see, but that does not settle the question. The answer depends on your country, your purpose, how you store and use personal data, the site's terms, and, for outreach, anti-spam and privacy law. You are responsible for your use. This is not legal advice; see the personal data section above.

#### 💬 Your feedback and custom solutions

Found a bug or need another field? Open an issue on the Actor's **Issues** tab with the input you used and the run link. Need a custom solution? Contact hello.datawiki@gmail.com.

# Actor input Schema

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

LinkedIn profile links to scrape, one per line (for example https://www.linkedin.com/in/satyanadella). Bulk input is supported; duplicates are removed.

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

The last part of a profile link, for example williamhgates. Merged with the links above.

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

Profile links and profile names mixed in one list, for easy copy and paste.

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

Long LinkedIn member IDs that start with ACoA. Public pages rarely resolve them, so these rows usually come back as not found.

## `maxProfiles` (type: `integer`):

Stop after this many profiles. 0 means no cap.

## `profileScraperMode` (type: `string`):

Profile details returns the public profile. Profile details + email search also finds the person's work email.

## `emailVerification` (type: `string`):

Verify asks the company's mail server whether the address exists (no mail is sent). Guess only returns ranked pattern guesses without checking them.

## `acceptUnverifiedEmail` (type: `boolean`):

When no address could be verified, also put the most likely guess into the email field. The email status always says how sure it is.

## `includeCompany` (type: `boolean`):

Add the current employer: website, industry, size, headquarters and employee count. Always on when the email search is on.

## `includeSimilarProfiles` (type: `boolean`):

Add the 'people also viewed' cards shown on the profile.

## `includeActivity` (type: `boolean`):

Add the recent public posts and articles shown on the profile.

## `outputFields` (type: `array`):

Keep only these fields in each row, for example fullName, email, currentCompany. Leave empty for everything. Status and query always stay.

## `excludeFields` (type: `array`):

Remove these fields from each row. Applied after the list above.

## `compareWith` (type: `string`):

Pick the dataset of an earlier run. Adds a list of changes and a job-change flag to profiles found in it.

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

Starts without a proxy. If LinkedIn refuses a request, the run switches to a datacenter proxy and then a residential proxy, and stays there.

## Actor input object example

```json
{
  "urls": [
    "https://www.linkedin.com/in/satyanadella",
    "https://www.linkedin.com/in/reidhoffman/",
    "https://www.linkedin.com/in/dharmesh"
  ],
  "publicIdentifiers": [],
  "queries": [],
  "profileIds": [],
  "maxProfiles": 10,
  "profileScraperMode": "Profile details + email search",
  "emailVerification": "smtp",
  "acceptUnverifiedEmail": false,
  "includeCompany": true,
  "includeSimilarProfiles": true,
  "includeActivity": true,
  "outputFields": [],
  "excludeFields": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `profiles` (type: `string`):

Name, headline, job title, company, seniority, location and followers.

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

The About text, top skills, websites and creator badge.

## `emails` (type: `string`):

Work email with status and confidence.

## `company` (type: `string`):

Current employer details.

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

One row per job.

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

One row per school.

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

One row per skill.

## `languages` (type: `string`):

One row per language.

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

One row per certification.

## `extras` (type: `string`):

Projects, volunteering, publications, honors, courses, organizations and recommendations.

## `similar` (type: `string`):

People also viewed.

## `posts` (type: `string`):

Recent public posts.

## `articles` (type: `string`):

Recent public articles.

## `quality` (type: `string`):

Completeness, warnings and job-change monitoring.

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

One row per input profile with its status, failed ones included.

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

Totals for the whole 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/satyanadella",
        "https://www.linkedin.com/in/reidhoffman/",
        "https://www.linkedin.com/in/dharmesh"
    ],
    "publicIdentifiers": [],
    "queries": [],
    "profileIds": [],
    "outputFields": [],
    "excludeFields": [],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_wiki/linkedin-profile-scraper-email-no-cookies").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/satyanadella",
        "https://www.linkedin.com/in/reidhoffman/",
        "https://www.linkedin.com/in/dharmesh",
    ],
    "publicIdentifiers": [],
    "queries": [],
    "profileIds": [],
    "outputFields": [],
    "excludeFields": [],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("data_wiki/linkedin-profile-scraper-email-no-cookies").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/satyanadella",
    "https://www.linkedin.com/in/reidhoffman/",
    "https://www.linkedin.com/in/dharmesh"
  ],
  "publicIdentifiers": [],
  "queries": [],
  "profileIds": [],
  "outputFields": [],
  "excludeFields": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call data_wiki/linkedin-profile-scraper-email-no-cookies --silent --output-dataset

```

## MCP server setup

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

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/xE9viuQRw8IQ4JQ3o/builds/lMFTzkNEgj71HIP3J/openapi.json
