# LinkedIn Profile Scraper (Database) — No Cookies ✅ $3.20/1k (`sputnikapi/profile-lookup`) Actor

Turn LinkedIn profile URLs into the complete career record — every position with dates and descriptions, education, skills, certifications, patents — for $3.20 per 1,000 found profiles, 20% under the busiest Actor on this shelf. Emails with fullOutput. No cookies. Misses are free.

- **URL**: https://apify.com/sputnikapi/profile-lookup.md
- **Developed by:** [Sputnik API](https://apify.com/sputnikapi) (community)
- **Categories:** Lead generation, AI, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.20 / 1,000 profile founds

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?

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 Scraper (Database) — profile data without scraping

> **$3.20 per 1,000 complete profiles — 20% under the busiest Actor on this
> shelf, and less than half what a search-plus-profile Actor costs for the
> same data.** The standard output is the whole career record, not a teaser:
> every position with dates and descriptions, education, skills,
> certifications, accomplishments, publications and patents. Contact
> addresses are the only thing behind the paid tier.

Turn public LinkedIn profile URLs into structured data. Paste links, bare
handles, or mobile URLs — get one clean row per profile.

**This is a database lookup, not a live scrape.** Results come back in
seconds from a database of **1B+ professional profiles**. No cookies, no
login, no account risk, no per-profile browser session — by design.

### What it costs against the shelf

The common way to buy this data is a search Actor that charges a page fee
and then a per-profile fee on top. Priced per 1,000 profiles:

| What you get | Typical shelf price | Here |
|---|---|---|
| Complete profile — full work history, education, skills | $4 per 1,000 | **$3.20 per 1,000** |
| Complete profile **+ email addresses** | $10 per 1,000 | **$8 per 1,000** |
| The same data reached through a search Actor | ~$8 / ~$14 per 1,000 | **$3.20 / $8** |
| Profiles you asked for but we could not find | billed by some | **$0** |
| Run start fee | $0–$0.02 per run | **$0.001 per run** |

(Read off the public Apify listings on 2026-09-18: $0.004 per profile and
$0.01 with email search on the direct listing; $0.10 per 25-result page plus
the same per-profile fee when you arrive through a search Actor. Those are
the prices on the plans most buyers are on — the discounts published
alongside them start at the higher subscription tiers. Ours is one flat
price on every plan, free tier included.)

### Why this one

1. **Complete data at the standard price.** Not a summary card — the full
   career record. Every position with its description, the whole education
   list, skills, languages, certifications, patents, publications,
   accomplishments, articles and interests.
2. **You pay only for found.** URLs we cannot match come back as free
   `not_found` rows. Removed profiles are free `profile_removed` rows. Empty
   input lines cost nothing. No charges for misses, ever.
3. **Contacts when you want them.** `fullOutput: true` adds work and
   personal email addresses, phone numbers, and up to 50 related profiles —
   still below what the shelf charges for a profile without any email.

### Who is this for

- **Sales & GTM teams** enriching sign-ups and CRM contacts at scale.
- **Recruiters** turning sourced profile links into structured candidate data.
- **Data teams** feeding scoring or screening models with career histories.

### Input

```json
{
  "profileUrls": ["satyanadella"],
  "fullOutput": false
}
```

Different spellings of the same profile (mobile links, tracking parameters,
bare handles) are folded together and looked up once.

### What you get — the whole record at $0.0032, contacts at $0.008

| Group | Standard (default, $0.0032/found) | `fullOutput: true` ($0.008/found) |
|---|---|---|
| Identity | full name, first/last, headline, photo, background image, profile slug | same |
| Current role | job title, employer name + slug (flat columns), dates, industry, employment type, job function | same |
| Career history | **every position, past and present** — titles, employers, dates, locations, descriptions | same |
| Education | **complete list** — schools, degrees, fields of study, dates, descriptions, grades, activities | same |
| Skills & languages | full skills list, languages with proficiency | same |
| Certifications | **complete** — name, authority, dates, license numbers, links | same |
| Accomplishments | projects, courses, honors, organizations, test scores | same |
| Publications & patents | **included** | same |
| Volunteer work | **included** | same |
| Articles & interests | **included** | same |
| Bio | full "about" text | same |
| Location | city, state, country (ISO code + full names) | same |
| Seniority signals | level, total experience years, tenure, decision-maker flag | same |
| Salary estimate | inferred min–max | same |
| Social links | professional profile URL, GitHub, Twitter/X, Facebook, website | same |
| **Contacts** | — | **work + personal email addresses and phone numbers** |
| **Related profiles** | — | **up to 50 further people per profile** |
| Honesty meta | `_status`, `_freshness`, `updatedAt`, `_matchCandidates` | same + per-section coverage map (`_meta`) |

Two things stay out of the standard row on purpose: contact details, which
are metered separately, and demographic attributes (birth date, gender),
which only travel when the complete record is asked for explicitly.

### Output — a real row

Every found row carries `_status`, `_freshness` plus the exact `updatedAt`
timestamp, `_fullData` — a link to the complete document — and flat
`companyName` / `companySlug` columns when a current position is on record.
Misses are compact `_status` + `_input` rows that keep your spreadsheet
aligned. A real row:

```json
{
  "_status": "found",
  "_input": { "profile": "satyanadella" },
  "_freshness": "fresh_90d",
  "companyName": "Microsoft",
  "companySlug": "microsoft",
  "_view": "lite-v4",
  "fullName": "Satya Nadella",
  "headline": "Chairman and CEO at Microsoft",
  "jobTitle": "Chairman and CEO",
  "industry": "Software Development",
  "about": "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.",
  "connectionsCount": 500,
  "followersCount": 12052722,
  "profileImageUrl": "https://assets.sputnik.io/pp/profilepic/7d36…",
  "location": { "city": "Redmond", "state": "WA", "country": "US", "countryFullName": "United States" },
  "seniority": { "totalExperienceYears": 12, "currentTenureYears": 12, "averageTenureYears": 7 },
  "experience": {
    "work": [
      { "title": "Chairman and CEO", "company": "Microsoft", "startDate": "2014-02-01", "endDate": null },
      { "title": "Member Board Of Trustees", "company": "University of Chicago", "startDate": "2018-01-01", "endDate": null }
    ]
  },
  "education": [
    { "school": "The University of Chicago Booth School of Business", "startDate": "1994-01-01", "endDate": "1996-12-31" },
    { "school": "University of Wisconsin-Milwaukee", "degreeName": "Master’s Degree", "fieldOfStudy": "Computer Science" },
    { "school": "Manipal Institute of Technology, Manipal", "degreeName": "Bachelor’s Degree", "fieldOfStudy": "Electrical Engineering" }
  ]
}
```

*(trimmed for display — the row also carries `slug`, `firstName`/`lastName`,
`updatedAt`, social links, and `skills` / `languages` / `certifications` /
`inferredSalary` whenever the profile has them)*

With `fullOutput: true` the same row becomes the complete document: every
past position with descriptions, full education and certification detail,
publications, patents, awards, projects, articles, related profiles, and
the contact block (emails, phone numbers when on record).

The **Output tab** shows three views: *Overview*, *Career & education*,
and *Contacts & signals*.

### Pricing

| Event | Price | When |
|---|---|---|
| Profile found | $0.0032 | matched URL — the complete career record |
| Profile found (with contacts) | $0.008 | `fullOutput: true` — adds emails, phones, related profiles |
| Not found / removed | **$0** | always free |

Your free $5 Apify credit ≈ **1,560 complete profiles**.

### FAQ

**How fresh is the data?** Every row tells you: `_freshness` buckets
(`fresh_90d`, `updated_1y`, `older`) plus the exact timestamp. For
most enrichment flows a database answer beats waiting minutes for a live
fetch that can fail.

**What happens with a wrong or dead URL?** A free row with
`_status: "not_found"` or `"profile_removed"` and the echo of your input —
your spreadsheet stays aligned.

**What exactly does `fullOutput` add?** Contact details — work and personal
email addresses and phone numbers — plus up to 50 related profiles per
person and the document's own coverage map. The career record itself
(history, education, certifications, publications, patents, projects,
articles) is already in the standard row. A standard row never carries
contact data.

**Is there a rate limit?** The actor paces itself; a 1,000-URL run finishes
in minutes. For 10,000+ rows use our Bulk People Enrichment (CSV) actor.

**Is this compliant?** The database holds public professional profile data.
We honor removal requests — contact us via the Issues tab.

### The family

Same engine, other doors: **Reverse Email Lookup** (email → person),
**Work Email Finder** (name + domain → email), **Company Employees Finder**
(domain → the whole roster), **People/Company Database Search** (filters →
lists), **Name-to-Profile** (name + company → profile), **Social Handle Lookup** (dev/social handle → person), **Bulk People Enrichment** (CSV, 50k rows). One data core, one
billing promise: misses are free.

### Disclaimer

This Actor is an independent product and is not affiliated with, endorsed
by, or sponsored by LinkedIn Corporation. It does not access, crawl, or
scrape LinkedIn at run time — answers come from our own database of
publicly available professional data; "LinkedIn" is used only to describe
the kind of public profile data the database covers. Removal requests are
honored via the Issues tab.

# Actor input Schema

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

One public professional profile URL or bare profile handle per line. Unmatched profiles come back as free "not\_found" rows.

## `fullOutput` (type: `boolean`):

Return the complete profile document — 164 fields in 37 sections: full career history with role descriptions, education detail, certifications, publications, patents, awards, projects and all contact fields — instead of the 60+ field summary card. Misses stay free in both modes.

## Actor input object example

```json
{
  "profileUrls": [
    "satyanadella"
  ],
  "fullOutput": false
}
```

# Actor output Schema

## `results` (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 = {
    "profileUrls": [
        "satyanadella"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sputnikapi/profile-lookup").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": ["satyanadella"] }

# Run the Actor and wait for it to finish
run = client.actor("sputnikapi/profile-lookup").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": [
    "satyanadella"
  ]
}' |
apify call sputnikapi/profile-lookup --silent --output-dataset

```

## MCP server setup

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

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/CEsRjGeOf5Riu0vx8/builds/D99BbkBKLQnsk7Qy5/openapi.json
