# LinkedIn Profile Scraper | No Login or Cookies (`curly/linkedin-profile-scraper`) Actor

Scrape public LinkedIn person profiles without a LinkedIn account, login, cookies, browser extension, or proxy setup. Process multiple profiles per run, export structured data to Apify datasets, and automate collection with schedules, webhooks, integrations, or the Apify API.

- **URL**: https://apify.com/curly/linkedin-profile-scraper.md
- **Developed by:** [Curly](https://apify.com/curly) (community)
- **Categories:** Automation, Lead generation, Social media
- **Stats:** 13 total users, 6 monthly users, 95.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 successful 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.

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 Profile Scraper (No Cookies or Login Required)

Scrape **one public LinkedIn person profile per run** and export structured profile data for research, enrichment, monitoring, and automated workflows. Free-plan users can use one accepted run every 12 hours.

No LinkedIn cookies, account, login, browser extension, or proxy setup is required. Enter public `/in/` profile URLs or slugs and receive the fields LinkedIn makes available without an authenticated session.

### Why use this LinkedIn profile scraper?

- **No cookies or login:** collect public profile data without connecting a LinkedIn account or providing session cookies.
- **No proxy setup:** the required network configuration is included with the Actor.
- **Single profile per run:** submit one public person profile URL or slug.
- **Structured profile data:** receive consistent fields for identity, headline, location, company, experience, education, and public network counts.
- **Ready for automation:** run from Apify Console, schedules, webhooks, integrations, or the Apify API.
- **Flexible exports:** download datasets as JSON, CSV, Excel, XML, RSS, or another format supported by Apify.

### Quick start

1. Paste one public LinkedIn person profile URL or slug.
2. Add one profile.
3. Select **Start**.
4. Open the dataset to review or download the collected profile records.

#### Input

```json
{
  "profile": "https://www.linkedin.com/in/example-founder/"
}
```

Accepted inputs include:

- A complete public `linkedin.com/in/...` person profile URL
- A localized LinkedIn person URL such as `de.linkedin.com/in/...`
- The profile slug shown after `/in/`

Company pages, post URLs, search pages, arbitrary names, and non-LinkedIn URLs are not accepted because this Actor is specifically for known LinkedIn person profiles.

### What LinkedIn profile data can you extract?

Each successful profile produces one dataset item that can include:

- **Identity:** profile ID, first name, last name, full name, headline, about text, and canonical LinkedIn URL
- **Location:** city, country code, and the public location displayed on the profile
- **Current company:** company name, company ID, company URL, company location, and logo when available
- **Experience:** job title, employer, company identifiers, location, dates, and company logo for each public role
- **Education:** school, degree, attendance years, school URL, and school logo when available
- **Audience:** public follower and connection counts
- **Media:** avatar and banner image
- **Additional public sections:** languages, organizations, and honors when displayed publicly
- **Related profiles:** similar-profile cards when included in the public response
- **Request provenance:** the canonical profile ID and URL plus the original submitted URL

The exact fields vary by profile and request. Masked, unavailable, or non-public values remain `null`, empty, or absent instead of being guessed.

### Example output

The values below are representative. Long text and LinkedIn-hosted media URLs are abbreviated, but every top-level output field is included so you can plan your dataset or integration before running the Actor.

```json
{
  "id": "jane-doe",
  "name": "Jane Doe",
  "first_name": "Jane",
  "last_name": "Doe",
  "url": "https://www.linkedin.com/in/jane-doe",
  "input_url": "https://www.linkedin.com/in/jane-doe/",
  "city": "Berlin",
  "country_code": "DE",
  "location": "Berlin, Germany",
  "position": "Founder at Example Labs",
  "about": "Builds reliable data products for research and operations.",
  "profile_badges": null,
  "influencer": false,
  "avatar": "https://media.licdn.com/example-avatar",
  "banner_image": "https://media.licdn.com/example-banner",
  "default_avatar": false,
  "followers": 2345,
  "connections": 500,
  "current_company": {
    "company_id": "example-labs",
    "link": "https://www.linkedin.com/company/example-labs",
    "location": "Berlin, Germany",
    "name": "Example Labs",
    "logo": "https://media.licdn.com/example-company-logo"
  },
  "experience": [
    {
      "company": "Example Labs",
      "company_id": "example-labs",
      "company_url": "https://www.linkedin.com/company/example-labs",
      "company_logo_url": "https://media.licdn.com/example-company-logo",
      "location": "Berlin, Germany",
      "title": "Founder",
      "start_date": "2022",
      "end_date": null
    }
  ],
  "educations_details": [
    {
      "school": "Example University",
      "school_url": "https://www.linkedin.com/school/example-university",
      "school_logo_url": "https://media.licdn.com/example-school-logo",
      "degree": "MSc",
      "start_year": 2016,
      "end_year": 2018
    }
  ],
  "languages": [
    "English",
    "German"
  ],
  "honors_and_awards": null,
  "organizations": null,
  "similar_profiles": [
    {
      "name": "Alex Example",
      "url": "https://www.linkedin.com/in/alex-example",
      "followers": 980,
      "avatar": "https://media.licdn.com/example-similar-avatar"
    }
  ]
}
```

LinkedIn exposes different public details for different profiles. Missing optional data remains `null` rather than being inferred. Permanently inaccessible placeholder fields are not part of the output contract.

### Automate profile collection with Apify

The same `profiles` input works in Apify Console, REST requests, API clients, schedules, webhooks, and integrations.

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/curly~linkedin-profile-scraper/run-sync-get-dataset-items?format=json" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  --data '{
    "profiles": [
      "example-founder",
      "https://www.linkedin.com/in/example-engineer/"
    ]
  }'
```

For asynchronous workflows, start an Actor run and read its default dataset after completion. You can also save the input as an Apify task, attach a schedule, or send completed runs to a webhook or integration such as Make, Zapier, n8n, Clay, or Google Sheets.

### Common use cases

- Enrich known public profile URLs in CRM and lead-research workflows
- Monitor public role, company, location, or profile-description changes
- Normalize profile records before sending them to a database or spreadsheet
- Prepare public experience and education data for analysis
- Add public person-profile data to Make, Zapier, n8n, Clay, or your own application

This Actor does not discover people by name, search LinkedIn, find email addresses, or scrape company pages. Start with known public person profile URLs or slugs.

### Price and unsuccessful profiles

- **Actor start:** $0.00005 per run, using Apify's recommended synthetic start event
- **Successful profile result on a paid plan:** $0.0014 per stored profile, equivalent to $1.40 per 1,000 successful results
- **Apify Free plan:** no profile-result fee, one profile, and one accepted run every 12 hours
- **Paid Apify plans:** one profile per run without the 12-hour free-plan restriction

For paying users, only a successfully stored person-profile result emits the billable `person-result` event. Free-plan results and invalid, inaccessible, unavailable, or rate-limited profiles do not emit that event and are not charged as profile results. The small Actor-start charge is automatic and still applies whenever a run starts, including an empty, unsuccessful, or rate-limited run.

Expected profile-access failures do not fail the Actor run. A partially successful run returns the accessible records, while a zero-result run completes with an empty dataset. Details remain available through **Run summary** and **Unavailable or invalid inputs** on the run's Output tab.

### Limits and responsible use

- One submitted LinkedIn person profile URL or slug per run
- Public, unauthenticated fields only
- No LinkedIn cookies, passwords, access tokens, or account sessions
- No email or phone-number discovery
- No CAPTCHA solving or verification bypass
- Results depend on what LinkedIn makes public for the requested profile

LinkedIn's terms restrict certain automated collection, and privacy and data-protection requirements vary by location and use case. Use the Actor only where collection and processing are lawful, respect applicable platform and contractual rules, obtain any required permission, and apply appropriate retention and access controls to personal data.

### FAQ

#### Do I need a LinkedIn account, login, or cookies?

No. The Actor collects public person-profile data without asking for LinkedIn credentials, cookies, access tokens, or session details.

#### How do I scrape a LinkedIn profile from its URL?

Paste the public person profile URL into the `profiles` input and select **Start**. The Actor returns the available public fields as one structured dataset item. You can submit one URL per run.

#### Can I scrape multiple LinkedIn profiles?

No. This Actor accepts one profile per run for reliability. Each run stores the collected profile as a single dataset item.

#### What happens when a Free-plan limit is reached?

The Actor exits normally before browser collection and returns a clear `RATE_LIMITED` run summary. It does not create or charge a profile result. Apify's automatic $0.00005 Actor-start event still applies because the run has already started.

#### Can I scrape a LinkedIn company profile?

No. This Actor accepts person profiles under `/in/`. Use Curly's [LinkedIn Company Profile Scraper](https://apify.com/curly/linkedin-company-profile-scraper) for company pages.

#### Why are some profile fields empty?

LinkedIn exposes different public fields for different profiles and requests. The Actor does not infer unavailable values or use an authenticated session to reveal additional fields.

#### What happens when one profile is unavailable?

Available profiles are still returned. An unavailable or invalid profile does not remove results collected for the other submitted URLs and does not create a billable result event.

#### What happens when no submitted profile is accessible?

The run completes normally with an empty dataset instead of reporting an Actor error. Open **Run summary** and **Unavailable or invalid inputs** on the Output tab for the safe per-input outcome. Because no person-profile dataset item is stored, no pay-per-result event is emitted.

#### Does LinkedIn allow profile scraping?

LinkedIn's terms restrict certain automated collection. Laws and permitted uses also vary by jurisdiction and context. Review the applicable terms and privacy requirements, obtain any required permission, and seek legal advice before production or recurring collection.

#### Can I schedule recurring runs?

Yes. Save the input as an Apify task, attach a schedule, and send completed datasets to a webhook or integration.

### Support

For questions, missing fields, or unexpected results, contact <hello@trycurly.xyz>.

# Actor input Schema

## `profile` (type: `string`):

Paste one public LinkedIn person slug or linkedin.com/in profile URL. Free-plan users can use one accepted run every 12 hours. Inaccessible profiles do not create a billable profile result.

## Actor input object example

```json
{
  "profile": "https://www.linkedin.com/in/example-founder/"
}
```

# Actor output Schema

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

No description

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

No description

## `failedInputs` (type: `string`):

No description

# 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 = {
    "profile": "https://www.linkedin.com/in/example-founder/"
};

// Run the Actor and wait for it to finish
const run = await client.actor("curly/linkedin-profile-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 = { "profile": "https://www.linkedin.com/in/example-founder/" }

# Run the Actor and wait for it to finish
run = client.actor("curly/linkedin-profile-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 '{
  "profile": "https://www.linkedin.com/in/example-founder/"
}' |
apify call curly/linkedin-profile-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,curly/linkedin-profile-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/F4w3KW2yV5WyhaDe9/builds/voV86mSr0B0jiVNAl/openapi.json
