# LinkedIn Profile Data Extractor (No Cookies Required) (`muhammadafzal/linkedin-profile-data-extractor`) Actor

Extract public LinkedIn profiles without cookies: names, locations, experience, education and activity for recruiting research and CRM enrichment.

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

## Pricing

from $20.00 / 1,000 public 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 Extractor (No Cookies Required)

Extract public LinkedIn person profiles from URLs or handles through ScrapeCreators. Use the output for recruiting research, CRM enrichment, and professional profile analysis. No LinkedIn login, session cookies, or user proxy configuration is required. The operator supplies a private ScrapeCreators API key.

### What it extracts

Each dataset item represents one unique public profile. It contains `profileUrl`, `profileId`, `name`, `image`, `location`, `followers`, `connections`, `about`, `experience`, `education`, `recentPosts`, `articles`, `activity`, `publications`, `projects`, `recommendations`, `similarProfiles`, `scrapedAt`, and `source`.

Unavailable scalar fields are null; unavailable collections are empty arrays. Nested collections retain the provider's public structure, including organization roles and dates. Public LinkedIn pages can omit or mask descriptions. This Actor preserves that information as returned and does not infer missing employment, education, email addresses, phone numbers, or private details.

### Input

```json
{
  "profiles": ["https://www.linkedin.com/in/parrsam/", "parrsam"],
  "maxResults": 10
}
```

`profiles` accepts 1–100 person URLs or handles. Regional LinkedIn domains, HTTP URLs, trailing slashes, and tracking parameters normalize to canonical HTTPS URLs. Duplicate handles are processed once. Every entry is validated before provider work; one invalid entry rejects the input with an actionable summary.

`maxResults` is an integer from 1 to 100, default 10. Verified Apify free-plan runs are limited to five delivered profiles. Paid runs retain the requested cap; an absent local plan indicator does not imply a free plan.

The default/prefill extracts Sam Parr's public profile. Company pages, search, email discovery, follower lists, arbitrary web URLs, and pagination are unsupported. Supply the profiles you already want to inspect.

### Output and diagnostics

Download the default dataset as JSON, CSV, or Excel through Apify. The overview view shows names, source links, locations, follower counts, bios, experience, and education. `SUMMARY` in the default key-value store reports the outcome, delivered count, request attempts, observed provider credits, cap, warnings, and stop reason. Diagnostics never appear as fake profiles in the dataset.

A minimal illustrative record:

```json
{
  "profileUrl": "https://www.linkedin.com/in/parrsam/",
  "profileId": "parrsam",
  "name": "Sam Parr",
  "source": "scrapecreators"
}
```

Actual records include all schema fields. Counts and profile contents can change.

### Reliability and limits

Requests run sequentially with a 45-second timeout. Explicit transient HTTP failures retry at most twice with backoff and jitter; ambiguous network failures are not retried because a provider may already have spent credits. The run stops after three consecutive failures, on provider authentication/credit/access failures, on the charge limit, or near its four-minute runtime ceiling. Completed records survive subsequent failures. Partial results include warnings; an all-error run fails honestly. A genuine HTTP 404 produces a no-match warning with no result record. Malformed provider responses do not count as empty profiles.

The private `STATE` record supports resuming completed work within the same run. Migration and abort stop new requests and preserve counters. A hard crash between a dataset write and checkpoint can still require owner inspection before resurrection.

### Pay per event

Verified live all-in PPE prices:

| Event | FREE | BRONZE (2.5% off) | SILVER (5% off) | GOLD (20% off) |
|---|---:|---:|---:|---:|
| Run start | $0.00625 | $0.006094 | $0.005938 | $0.005 |
| Delivered public profile | $0.025 | $0.024375 | $0.023750 | $0.020000 |

The start event is automatic. Each valid dataset record triggers one automatic dataset-item event; the code never manually charges either event. Failed, missing, and duplicate profiles do not generate result events. At FREE-tier list prices, one delivered profile costs $0.03125 and ten cost $0.25625 including the start fee. Platform usage is included; users do not pay separate platform usage costs. A PPE charge cap bounds customer events; request count, timeout, retries, and profile caps independently bound provider/platform work.

At the official $47 / 25,000-credit package, one credit costs $0.00188. A three-attempt profile budget is $0.00564 before platform usage. The GOLD profile price yields $0.016 creator proceeds after the 20% platform share, leaving $0.01036 before platform cost at that retry allowance. This is a conservative pricing assumption, not evidence that every error consumes one credit. The owner pays ScrapeCreators credits and platform costs. The observed probe used one credit; cached or retried requests can differ. Provider credit totals in SUMMARY are marked unknown when error responses do not disclose credit consumption. The cloud matrix delivered 16 profiles using 16 reported provider credits with matching result events. Provider invoice cost is estimated from the published credit package; it is separate from measured Apify usage.

### Private configuration and local development

Set `SCRAPECREATORS_API_KEY` in the operator environment or use the configured Apify secret of that name. It is absent from the public input schema, dataset, and logs. Never paste a key into source or input.

```sh
npm ci
npm test
npm run check
apify run
```

For API or Apify MCP use, invoke this Actor with the same JSON input and read its default dataset and SUMMARY. No Standby server is provided. The Actor and example Tasks remain private until owner publication.

### Data use

Only request public profiles for a legitimate purpose and handle personal information according to applicable requirements. Public visibility does not guarantee that every field is present or current. This tool does not access private accounts, bypass login, or promise contact information. Include the run ID and redacted SUMMARY when reporting a problem.

# Actor input Schema

## `profiles` (type: `array`):

Provide public person profile URLs or handles, for example https://www.linkedin.com/in/parrsam/ or parrsam. Up to 100 unique profiles; duplicates are removed. Company URLs are unsupported.

## `maxResults` (type: `integer`):

Maximum unique profiles delivered. Default 10, range 1–100. Verified free-plan users receive at most five.

## Actor input object example

```json
{
  "profiles": [
    "https://www.linkedin.com/in/parrsam/"
  ],
  "maxResults": 10
}
```

# Actor output Schema

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

Public profile records in the default dataset.

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

Outcome, limits, counts and warnings.

# 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 = {
    "profiles": [
        "https://www.linkedin.com/in/parrsam/"
    ]
};

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

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

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

```

## Python example

```python
from apify_client import ApifyClient

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

# Prepare the Actor input
run_input = { "profiles": ["https://www.linkedin.com/in/parrsam/"] }

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

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

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

```

## CLI example

```bash
echo '{
  "profiles": [
    "https://www.linkedin.com/in/parrsam/"
  ]
}' |
apify call muhammadafzal/linkedin-profile-data-extractor --silent --output-dataset

```

## MCP server setup

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

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

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/K3tm04uYvHLtYYFSR/builds/1balJ72pCNZm5S0mI/openapi.json
