# LinkedIn Fresh Profile Data Scraper (`khadinakbar/linkedin-fresh-profile-data-scraper`) Actor

Scrape public LinkedIn profile data from profile URLs or handles: name, about, location, followers, affiliated organizations, education, articles, and recent posts, with optional company-page enrichment. Provider-backed via ScrapeCreators and SociaVault; no LinkedIn login or cookies.

- **URL**: https://apify.com/khadinakbar/linkedin-fresh-profile-data-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Lead generation, Social media, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 linkedin profile scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

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

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

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

# README

## LinkedIn Fresh Profile Data Scraper

Turn a LinkedIn profile URL or handle into **one public profile record** for recruiters, CRM enrichment, and AI agents. Each row includes name, about, location, follower count, affiliated organizations, education, published articles, and recent posts when LinkedIn exposes them on the public page. Optional company-page enrichment adds industry, website, employee count, and headquarters. No LinkedIn login or cookies.

This Actor reads the same public JSON-LD view you get in an incognito browser. It does **not** return login-only job titles, skills, certifications, emails, or phone numbers. For those logged-in fields, no cookieless provider in this stack exposes them.

### Best fit for this Actor

- Enrich a list of known `/in/` profile URLs into structured people records for a CRM or ATS.
- Attach recent public posts and published LinkedIn articles to a person record.
- Add the current company's public LinkedIn page (industry, headcount, website) when `enrichCompany` is true.

To *search* for profiles by keyword, use [LinkedIn Profile Search Scraper](https://apify.com/khadinakbar/linkedin-profile-search-scraper). For emails, use [LinkedIn Profile Email Scraper](https://apify.com/khadinakbar/linkedin-profile-email-scraper). For a leaner identity-only row, use [LinkedIn Profile Details Scraper](https://apify.com/khadinakbar/linkedin-profile-details-scraper).

### Practical scenario

A recruiting coordinator pastes `https://www.linkedin.com/in/williamhgates/` and `satyanadella`. The run returns one row per person: name, Seattle/Redmond location, follower counts, Gates Foundation / Microsoft as affiliated organizations, Harvard education dates when public, recent posts, and Pulse articles. A missing handle finishes `SUCCEEDED` with a `NOT_FOUND` row and no `profile-scraped` charge. The coordinator exports CSV into the ATS and routes company-page enrichment to a second run when they need industry and headcount.

### Quick start input

```json
{
  "profileUrls": ["https://www.linkedin.com/in/williamhgates/"],
  "maxProfiles": 10,
  "enrichCompany": false,
  "outputMode": "full",
  "providerOrder": "scrapecreators-first"
}
```

`profileUrls` accepts full `/in/` URLs, locale hosts such as `uk.linkedin.com/in/...`, or a bare handle. One unique profile produces one dataset row.

### Input reference

| Field | Type | What it controls |
|---|---|---|
| `profileUrls` | array | Required person URLs or handles. Example: `https://www.linkedin.com/in/williamhgates/`. Max 100. Company, post, and Sales Navigator URLs are out of scope. |
| `maxProfiles` | integer | Cap on unique profiles processed. Default 50, max 100. |
| `enrichCompany` | boolean | Fetch the current company's public LinkedIn page. Default false. Adds $0.02 per successful enrich. |
| `outputMode` | enum | `full` (default) or `compact` (first 3 of each list). |
| `providerOrder` | enum | `scrapecreators-first` (default) or `sociavault-first`. |
| `maxConcurrency` | integer | Parallel profile fetches. Default 2, max 5. |
| `includeRawData` | boolean | Attach raw provider JSON under `rawProfile`. Default false. |

### What data you receive

One dataset item is one LinkedIn person.

```json
{
  "profileUrl": "https://www.linkedin.com/in/williamhgates/",
  "publicId": "williamhgates",
  "fullName": "Bill Gates",
  "about": "Chair of the Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft.",
  "location": "Seattle, Washington, United States",
  "followerCount": 40588779,
  "currentCompanyName": "Gates Foundation",
  "currentCompanyUrl": "https://www.linkedin.com/company/gates-foundation",
  "experience": [
    { "company": "Gates Foundation", "companyUrl": "https://www.linkedin.com/company/gates-foundation" }
  ],
  "education": [
    { "school": "Harvard University", "startDate": "1973", "endDate": "1975" }
  ],
  "recentPosts": [
    { "title": "Suriname is officially malaria-free.", "publishedAt": "2026-08-20T23:49:40.110Z" }
  ],
  "outcome": "OK",
  "provider": "scrapecreators",
  "scrapedAt": "2026-08-21T07:00:00.000Z"
}
```

| Field | Meaning |
|---|---|
| `experience[]` | Affiliated organizations from LinkedIn's public structured data. Dates appear when JSON-LD includes them. Per-role job titles are not in this public view. |
| `recentPosts[]` | Public posts LinkedIn lists on the profile, with URL and timestamp. |
| `outcome` | `OK` is billed. `NOT_FOUND` is an honest empty/private public page with no `profile-scraped` charge. |
| `companyIndustry` / `companyEmployeeCount` | Present only when `enrichCompany` succeeded. |

`OUTPUT` and `RUN_SUMMARY` in the default key-value store hold `outcome`, `itemsPushed`, and `chargedEventCounts`.

### Use through the API

```bash
curl -X POST "https://api.apify.com/v2/acts/khadinakbar~linkedin-fresh-profile-data-scraper/runs" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"profileUrls":["https://www.linkedin.com/in/williamhgates/"]}'
```

Download rows as JSON, CSV, Excel, or HTML from the Dataset tab.

### Use with AI agents through Apify MCP

> Scrape public LinkedIn profile data for https://www.linkedin.com/in/williamhgates/ and satyanadella. Return fullName, location, currentCompanyName, followerCount, recentPosts titles, outcome, and provider.

Connect via <https://mcp.apify.com>. Read `OUTPUT.outcome` and `itemsPushed` to confirm whether the dataset contains `OK` rows, a `NOT_FOUND` row, or a valid empty result.

### Connect the workflow

- Discover unknown people first with [LinkedIn Profile Search Scraper](https://apify.com/khadinakbar/linkedin-profile-search-scraper), then pass those profile URLs here.
- For verified emails on the same people, continue with [LinkedIn Profile Email Scraper](https://apify.com/khadinakbar/linkedin-profile-email-scraper).
- For company-only pages without a person URL, use a LinkedIn company Actor rather than this one.

### Pricing

Pay per event plus platform usage. Confirm current event prices on the live Pricing tab; that tab is the source of truth if this page ever lags.

- `apify-actor-start`: $0.00005 per run
- `profile-scraped`: **$0.01** per `OK` row
- `company-enriched`: **$0.02** per successfully enriched company page

A one-profile run without company enrich is about $0.01 in result events plus a few seconds of Apify platform usage. `NOT_FOUND` rows have no `profile-scraped` charge. Provider credits are paid by the Actor owner.

### How it works

1. Normalize and deduplicate `/in/` URLs and handles.
2. Fetch the public profile from ScrapeCreators, then SociaVault if needed.
3. Map JSON-LD organizations, education, articles, and recent posts into a flat row.
4. Optionally fetch the current company's public LinkedIn page.
5. Charge `profile-scraped` only after a usable public record, then write the row.

Private or missing profiles return HTTP 404 `not_found` from the providers and finish `SUCCEEDED` with `NOT_FOUND` / `VALID_EMPTY`.

### Best results

- Pass person profile URLs or handles. Keep company pages, posts, and Sales Navigator URLs for those Actors.
- Use `fullName`, `currentCompanyName`, `location`, and `recentPosts` as the decision fields. Treat `experience[].company` as an affiliated organization, not a job title.
- Keep `maxConcurrency` at 2 unless you are batching many URLs.
- A typo handle finishes `SUCCEEDED` with a `NOT_FOUND` row and no `profile-scraped` charge.

### Builder's note

I found that ScrapeCreators `GET /v1/linkedin/profile` and SociaVault `GET /v1/scrape/linkedin/profile` return LinkedIn's public JSON-LD on a well-known public profile: name, about, location, followers, affiliated organizations, education dates, articles, and recent posts. In my testing the live payload matched the vendor docs for this public view. Company enrich is a second call to `/v1/linkedin/company` because the person payload carries the company name and URL. My goal is a useful CRM identity-plus-activity row from that public page.

### Legal and responsible use

Use this Actor on public LinkedIn data you are authorized to process, follow applicable law and LinkedIn's terms, and keep the output in your own compliance workflow. This Actor is independent of LinkedIn and does not log into LinkedIn.

Issues and feature requests: use the Actor Issues tab on Apify.

# Actor input Schema

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

Public LinkedIn person profiles to scrape. Accepts https://www.linkedin.com/in/williamhgates/ URLs, locale hosts such as uk.linkedin.com/in/..., or a bare handle like williamhgates. Up to 100 values per run. NOT company pages, posts, or Sales Navigator lead URLs — those belong in a company, posts, or Sales Nav Actor.

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

Maximum unique profiles to process in this run. Default 50. Extra URLs after the cap are skipped and listed in RUN\_SUMMARY. This caps cost; it does not invent extra public data.

## `enrichCompany` (type: `boolean`):

When enabled, fetch the current company's public LinkedIn page and add industry, website, employee count, headquarters, company size, and specialties. Costs an additional $0.02 per successfully enriched profile on top of the $0.01 profile charge. Leave disabled when you only need the person record.

## `outputMode` (type: `string`):

full keeps every public list the provider returns (articles, posts, organizations). compact keeps the first 3 items of each list for smaller agent payloads. Default full.

## `providerOrder` (type: `string`):

Which public-data provider to try first for each profile. Both return the same public LinkedIn JSON-LD shape; the other provider is used automatically when the primary fails or returns not-found for a profile that later resolves. Keep the default unless you have a reason to prefer SociaVault.

## `maxConcurrency` (type: `integer`):

How many profiles to fetch in parallel. Default 2 balances speed against provider rate limits. Raise to 5 for large batches; lower to 1 if you see rate-limit errors in the run log.

## `includeRawData` (type: `boolean`):

When true, attach the raw provider JSON under rawProfile. Default false. Enable only for debugging; it increases dataset size and is not required for CRM or agent use.

## Actor input object example

```json
{
  "profileUrls": [
    "https://www.linkedin.com/in/williamhgates/"
  ],
  "maxProfiles": 10,
  "enrichCompany": false,
  "outputMode": "full",
  "providerOrder": "scrapecreators-first",
  "maxConcurrency": 2,
  "includeRawData": false
}
```

# Actor output Schema

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

Dataset items containing public profile identity, about, organizations, education, articles, recent posts, and optional company enrichment.

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

Run summary including outcome, itemsPushed, chargedEventCounts, provider status codes, and per-profile results.

## `runSummary` (type: `string`):

Machine-readable RUN\_SUMMARY record mirroring OUTPUT for integrations that read RUN\_SUMMARY directly.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "profileUrls": [
        "https://www.linkedin.com/in/williamhgates/"
    ],
    "maxProfiles": 10,
    "enrichCompany": false,
    "maxConcurrency": 2
};

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

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

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

```

## Python example

```python
from apify_client import ApifyClient

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

# Prepare the Actor input
run_input = {
    "profileUrls": ["https://www.linkedin.com/in/williamhgates/"],
    "maxProfiles": 10,
    "enrichCompany": False,
    "maxConcurrency": 2,
}

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

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

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

```

## CLI example

```bash
echo '{
  "profileUrls": [
    "https://www.linkedin.com/in/williamhgates/"
  ],
  "maxProfiles": 10,
  "enrichCompany": false,
  "maxConcurrency": 2
}' |
apify call khadinakbar/linkedin-fresh-profile-data-scraper --silent --output-dataset

```

## MCP server setup

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

```

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

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/GTC0XydRoeOXZp2WB/builds/9w6ZHUR5XDwdc9T4r/openapi.json
