{
  "data": {
    "id": "s2xwd2xJLrqJgMYjC",
    "actId": "J3zhh32m1J1uacIb6",
    "userId": "fwphAep6LMVHNdKy6",
    "startedAt": "2026-09-27T04:16:49.512Z",
    "finishedAt": "2026-09-27T04:16:58.001Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "WEB"
    },
    "stats": {
      "durationMillis": 8429,
      "runTimeSecs": 8.429,
      "computeUnits": 0.009365555555555556,
      "imageSizeBytes": 671971328
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"LinkedIn Profile Scraper — Public Profile Data without Login\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"profile_urls\": {\n      \"title\": \"LinkedIn Profiles (batch)\",\n      \"description\": \"LinkedIn usernames or profile URLs, one per line.\\n\\nAccepted formats:\\nsatyanadella\\n@sundarpichai\\nhttps://linkedin.com/in/tim-cook\\nSatya Nadella (full name — will search Google)\\nlinkedin.com/in/jeffweiner\",\n      \"type\": \"string\",\n      \"editor\": \"textarea\",\n      \"prefill\": \"satyanadella\\nsundarpichai\\ntim-cook\"\n    },\n    \"profile_url\": {\n      \"title\": \"Single Profile\",\n      \"description\": \"Single LinkedIn @username or profile URL\",\n      \"type\": \"string\",\n      \"editor\": \"textfield\"\n    },\n    \"keyword\": {\n      \"title\": \"Keyword Filter\",\n      \"description\": \"Only return profiles where headline, company or about contains this keyword. E.g: 'CEO', 'engineer', 'marketing'\",\n      \"type\": \"string\",\n      \"editor\": \"textfield\"\n    },\n    \"max_results\": {\n      \"title\": \"Max Profiles\",\n      \"description\": \"Maximum profiles to scrape\",\n      \"type\": \"integer\",\n      \"default\": 20\n    },\n    \"proxyConfiguration\": {\n      \"title\": \"Proxy (RESIDENTIAL Required)\",\n      \"description\": \"RESIDENTIAL proxy is required — LinkedIn blocks all datacenter IPs.\",\n      \"type\": \"object\",\n      \"editor\": \"proxy\",\n      \"prefill\": {\n        \"useApifyProxy\": true,\n        \"apifyProxyGroups\": [\n          \"RESIDENTIAL\"\n        ]\n      }\n    }\n  },\n  \"required\": []\n}",
    "readme": "# LinkedIn Profile Scraper | Name, Headline, Company, Location & Experience — No Login Required\n\n> **Scrape LinkedIn profiles by username, profile URL, or full name — without login, without cookies, and without a LinkedIn API key. The most resilient LinkedIn profile scraper on Apify — with auth wall detection, 3-layer fallback, and Google Knowledge Panel backup.**\n\n---\n\n## 📌 Table of Contents\n\n- [What Does This Actor Do?](#what-does-this-actor-do)\n- [Quick Start — 3 Steps](#quick-start--3-steps)\n- [Why This LinkedIn Profile Scraper?](#why-this-linkedin-profile-scraper)\n- [Use Cases](#use-cases)\n- [What Data You Get](#what-data-you-get)\n- [3-Layer Extraction System](#3-layer-extraction-system)\n- [Auth Wall Detection & Handling](#auth-wall-detection--handling)\n- [3 Input Formats Supported](#3-input-formats-supported)\n- [Search Status — FOUND, PARTIAL, AUTH_REQUIRED](#search-status--found-partial-auth_required)\n- [Input Parameters](#input-parameters)\n- [Example Input & Output](#example-input--output)\n- [Performance & Speed](#performance--speed)\n- [Cost Estimate](#cost-estimate)\n- [Limitations — Honest Overview](#limitations--honest-overview)\n- [Integrations](#integrations)\n- [FAQ](#faq)\n- [Changelog](#changelog)\n- [Legal & Terms](#legal--terms)\n\n---\n\n## 🔍 What Does This Actor Do?\n\nThis **LinkedIn profile scraper** extracts structured profile data from LinkedIn — name, headline, current position, company, location, about section, experience, education, and connections — without requiring a LinkedIn account, login session, or API key.\n\nWhat makes this actor different from every other LinkedIn scraper:\n\n- ✅ **Works without login** — tries three LinkedIn URL variants in sequence before ever asking for credentials\n- ✅ **Detects auth walls** — recognizes when LinkedIn is blocking a request (soft redirect to login page) and automatically switches to the next strategy instead of returning garbage data\n- ✅ **Falls back to Google Knowledge Panel** — when all LinkedIn URLs are blocked, extracts profile data from Google's rich results for the person\n- ✅ **Accepts full names as input** — type `\"Satya Nadella\"` instead of a LinkedIn URL and the actor finds the profile automatically\n- ✅ **Transparent status per profile** — every record includes `FOUND`, `PARTIAL`, or `AUTH_REQUIRED` so you always know data quality\n\nNo login. No cookies. No API key. Paste usernames, profile URLs, or full names — get structured profile data back.\n\n---\n\n## ⚡ Quick Start — 3 Steps\n\n**Step 1 — Add LinkedIn usernames, URLs, or full names**\n```json\n{\n  \"profile_urls\": [\n    \"satyanadella\",\n    \"https://www.linkedin.com/in/sundarpichai\",\n    \"Tim Cook\",\n    \"https://www.linkedin.com/in/bill-gates\"\n  ],\n  \"max_results\": 20\n}\n```\n\n**Step 2 — Click Run**\nThe actor tries three LinkedIn URL variants per profile, detects any auth walls, falls back to Google Knowledge Panel if blocked, and returns the richest data available.\n\n**Step 3 — Get your LinkedIn profile data**\n```json\n{\n  \"name\":               \"Satya Nadella\",\n  \"profile_url\":        \"https://www.linkedin.com/in/satyanadella\",\n  \"headline\":           \"Chairman and CEO at Microsoft\",\n  \"current_position\":   \"Chairman and CEO\",\n  \"company\":            \"Microsoft\",\n  \"location\":           \"Redmond, Washington, United States\",\n  \"connections\":        \"500+\",\n  \"about\":              \"We all need a purpose that animates us...\",\n  \"experience_summary\": \"Chairman and CEO at Microsoft (2014–present); EVP Cloud at Microsoft (2011–2014)\",\n  \"education\":          \"MBA - University of Chicago; MS Computer Science - University of Wisconsin\",\n  \"search_status\":      \"FOUND\",\n  \"data_quality\":       \"Public\"\n}\n```\n\nYour profiles are in the **Dataset** tab — export as JSON, CSV, or Excel immediately.\n\n---\n\n## 🏆 Why This LinkedIn Profile Scraper?\n\n| Feature | This Actor | Other LinkedIn Scrapers | Manual Research |\n|---|---|---|---|\n| **No login required** | ✅ Attempts without auth | ⚠️ Require cookies/session | ✅ But slow |\n| **Auth wall detection** | ✅ Auto-detects + switches strategy | ❌ Returns garbage data | ❌ |\n| **3 URL variants tried per profile** | ✅ linkedin.com + www + mobile | ❌ One URL only | ❌ |\n| **Google Knowledge Panel fallback** | ✅ Last-resort data source | ❌ | ❌ |\n| **Full name as input** | ✅ \"Satya Nadella\" → finds username | ❌ Username/URL only | ✅ |\n| **FOUND / PARTIAL / AUTH_REQUIRED status** | ✅ Per profile | ❌ Silent failures | ❌ |\n| **Experience summary extracted** | ✅ Up to 3 roles | ⚠️ Often missing | ❌ |\n| **Education extracted** | ✅ Up to 2 entries | ⚠️ Often missing | ❌ |\n| **Bulk processing (any volume)** | ✅ | ⚠️ Limited | ❌ |\n| **Keyword filter across profiles** | ✅ Built-in | ❌ | ❌ |\n| **Transparent data provenance** | ✅ `url_used` + `data_quality` fields | ❌ | ❌ |\n\n> **The only LinkedIn profile scraper with built-in auth wall detection, automatic fallback across 3 URL variants, Google Knowledge Panel backup, and full-name search — all in one run.**\n\n---\n\n## 🎯 Use Cases\n\n### 🎯 Sales Prospecting & Account Research\nScrape LinkedIn profiles for decision-makers at target accounts before cold outreach. Get current position, company, location, and about section to personalize emails and calls with relevant context. Works on username lists exported from Sales Navigator or Apollo.\n\n### 🤝 Recruitment & Talent Intelligence\nBuild candidate profiles from LinkedIn usernames at scale. Extract current title, company, experience summary, and education for initial screening — before investing recruiter time in manual research. Identify candidates' career progression and company tenure at a glance.\n\n### 🔎 Competitive Intelligence & Executive Tracking\nMonitor leadership changes at competitor companies by scraping their executives' LinkedIn profiles. Track when a CTO moves, when a VP of Sales is replaced, or when a new CMO joins — before the press release.\n\n### 📊 Lead Enrichment for CRM\nEnrich a list of LinkedIn profile URLs with structured data — name, title, company, location — and import directly into HubSpot, Salesforce, or Pipedrive. Replace expensive enrichment tools with a direct LinkedIn scrape.\n\n### 🏢 Investor & VC Due Diligence\nResearch founding team profiles for investment decisions. Verify claimed experience, check for gaps in employment history, identify educational background, and understand career trajectory — all from public LinkedIn data.\n\n### 📈 Market Research & People Analytics\nAnalyze the talent composition of an industry by scraping profiles with a keyword filter. Find all \"Head of AI\" profiles across companies, or all \"Growth Manager\" profiles in the fintech sector.\n\n### 🎓 Academic & HR Research\nBuild structured datasets of professional profiles for research on career mobility, industry skill distribution, or gender/geographic diversity in leadership roles. All from public LinkedIn data — ethically scraped without login.\n\n### 📰 Journalism & Background Research\nVerify professional claims for interview subjects, sources, or article subjects. The `experience_summary` and `education` fields provide a structured career history from the person's own public profile.\n\n---\n\n## 📋 What Data You Get\n\nEvery LinkedIn profile record contains up to **16 structured fields**:\n\n| Field | Type | Description | Example |\n|---|---|---|---|\n| `name` | string | Full name | `\"Satya Nadella\"` |\n| `profile_url` | string | LinkedIn profile URL | `\"https://www.linkedin.com/in/satyanadella\"` |\n| `url_used` | string | Which URL variant successfully returned data | `\"https://linkedin.com/in/satyanadella/\"` |\n| `headline` | string | LinkedIn headline (up to 300 chars) | `\"Chairman and CEO at Microsoft\"` |\n| `current_position` | string | Current job title | `\"Chairman and CEO\"` |\n| `company` | string | Current company name | `\"Microsoft\"` |\n| `company_url` | string | Company website (if in JSON-LD) | `\"https://microsoft.com\"` |\n| `location` | string | City, state, country | `\"Redmond, Washington, United States\"` |\n| `connections` | string | Connection/follower count | `\"500+\"` |\n| `about` | string | About section (up to 1000 chars) | `\"We all need a purpose...\"` |\n| `experience_summary` | string | Up to 3 recent roles formatted | `\"CEO at Microsoft (2014–present); EVP Cloud...\"` |\n| `education` | string | Up to 2 education entries | `\"MBA - University of Chicago; MS Computer Science...\"` |\n| `skills` | array | Listed skills (when available) | `[\"Leadership\", \"Cloud Computing\", \"AI\"]` |\n| `search_status` | string | Extraction result status | `\"FOUND\"` / `\"PARTIAL\"` / `\"AUTH_REQUIRED\"` |\n| `data_quality` | string | Data completeness label | `\"Public\"` |\n| `source_input` | string | Original input you provided | `\"satyanadella\"` |\n| `scraped_at` | string | ISO 8601 extraction timestamp | `\"2024-10-30T10:15:00Z\"` |\n\n---\n\n## 🔄 3-Layer Extraction System\n\nThis LinkedIn profile scraper uses three independent extraction methods in sequence — moving to the next only when the previous is definitively blocked:\n\n### Layer 1 — Direct LinkedIn (No-www)\n`https://linkedin.com/in/{username}/`\n\nLinkedIn's no-www domain often serves public profile data without triggering the login wall that `www.linkedin.com` sometimes shows. This is tried first — it works for a significant portion of public profiles without any proxy at all.\n\n### Layer 2 — Standard LinkedIn (www) + Mobile LinkedIn\n`https://www.linkedin.com/in/{username}/`\n`https://m.linkedin.com/in/{username}/`\n\nIf Layer 1 is blocked or returns a soft redirect, the actor tries the standard domain, then the mobile domain. Each variant uses different headers (desktop vs mobile User-Agent) to maximize the chance of getting past rate limiting.\n\n### Layer 3 — Google Knowledge Panel (Ultimate Fallback)\nWhen all three LinkedIn URL variants return an auth wall, the actor searches Google for `[name] linkedin` and extracts whatever profile data appears in Google's Knowledge Panel — name, job title, description, and the direct LinkedIn profile link.\n\nThis 3-layer system means that even in the worst case — when LinkedIn blocks your IP entirely — you still get a `PARTIAL` record with publicly available data rather than an empty failure.\n\n---\n\n## 🛡️ Auth Wall Detection & Handling\n\nLinkedIn's most common defense is a **soft auth wall** — the server returns HTTP 200 (not an error) but serves a login-prompt page instead of the profile. Generic scrapers cannot tell the difference and return this garbage data as a real result.\n\nThis actor detects auth walls by scanning the first 5,000 characters of each response for LinkedIn's known login-page phrases:\n\n- `\"welcome to your professional community\"`\n- `\"sign in to linkedin\"`\n- `\"join linkedin\"`\n- `\"linkedin: log in\"`\n- `\"be great at what you do\"`\n- `\"1 billion members\"`\n- `\"make the most of your professional life\"`\n\n**When an auth wall is detected:**\n1. The current URL variant is immediately discarded\n2. A warning is logged: `\"Auth wall detected at: [URL]\"`\n3. The next URL variant is tried automatically\n4. If all variants are auth-walled → Google Knowledge Panel fallback is triggered\n5. `search_status` is set to `PARTIAL` or `AUTH_REQUIRED` — never a false `FOUND`\n\n**You never get silently wrong data.** Every record tells you exactly what happened.\n\n---\n\n## 📥 3 Input Formats Supported\n\nThis LinkedIn profile scraper accepts three input formats — mix them freely in a single run:\n\n### Format 1 — LinkedIn Username\n```\nsatyanadella\nbill-gates\njeff-weiner\n```\nThe actor constructs the full LinkedIn URL automatically.\n\n### Format 2 — Full LinkedIn Profile URL\n```\nhttps://www.linkedin.com/in/sundarpichai\nhttps://linkedin.com/in/tim-cook\n```\nBoth `www.` and non-www variants are accepted and normalized.\n\n### Format 3 — Full Name (Auto-Discovery)\n```\nSatya Nadella\nSundar Pichai\nJensen Huang\n```\nWhen the input contains a space and no LinkedIn URL pattern, the actor treats it as a full name, Google-searches `site:linkedin.com/in \"Full Name\"`, extracts the LinkedIn username from the results, and proceeds with normal profile scraping. If the username cannot be found, Google Knowledge Panel data is returned with `search_status: PARTIAL`.\n\n---\n\n## 📊 Search Status — FOUND, PARTIAL, AUTH_REQUIRED\n\nEvery record includes a `search_status` field — so you always know exactly what you got:\n\n| Status | Meaning | What's in the Record |\n|---|---|---|\n| **FOUND** | LinkedIn served the public profile successfully | Full profile data — name, headline, company, location, about, experience, education |\n| **PARTIAL** | LinkedIn was blocked but Google Knowledge Panel returned data | Name, headline/title, about (from Google's rich results) — no experience or education |\n| **AUTH_REQUIRED** | All LinkedIn URLs blocked AND Google KP returned nothing | Only `profile_url`, note explaining the block, and `scraped_at` timestamp |\n\n**How to use status in your workflow:**\n- Filter `FOUND` records for highest-confidence data\n- `PARTIAL` records are still useful for name, title, and company confirmation\n- `AUTH_REQUIRED` records indicate the profile needs a fresher residential proxy IP — re-run with a new proxy session\n\n---\n\n## ⚙️ Input Parameters\n\n```json\n{\n  \"profile_urls\": [\n    \"satyanadella\",\n    \"https://www.linkedin.com/in/sundarpichai\",\n    \"Jensen Huang\",\n    \"https://linkedin.com/in/elonmusk\"\n  ],\n  \"profile_url\":  \"\",\n  \"username\":     \"\",\n  \"keyword\":      \"CEO\",\n  \"max_results\":  20,\n  \"proxyConfiguration\": {\n    \"useApifyProxy\":    true,\n    \"apifyProxyGroups\": [\"RESIDENTIAL\"]\n  }\n}\n```\n\n| Parameter | Type | Default | Description |\n|---|---|---|---|\n| `profile_urls` | array or string | `[]` | List of LinkedIn usernames, profile URLs, or full names. Mix formats freely. |\n| `profile_url` | string | `\"\"` | Single profile URL or username shortcut — added to `profile_urls` automatically |\n| `username` | string | `\"\"` | Single LinkedIn username shortcut |\n| `keyword` | string | `\"\"` | Filter results — only return profiles where this keyword appears in headline, company, or about section |\n| `max_results` | integer | `20` | Maximum number of profiles to scrape |\n| `proxyConfiguration` | object | ⚠️ Required | Apify proxy config — **RESIDENTIAL proxy is required** for reliable LinkedIn access |\n\n---\n\n## 📦 Example Input & Output\n\n### Single Profile — Full Data Extraction\n\n**Input:**\n```json\n{\n  \"profile_urls\": [\"satyanadella\"]\n}\n```\n\n**Output:**\n```json\n{\n  \"name\":               \"Satya Nadella\",\n  \"profile_url\":        \"https://www.linkedin.com/in/satyanadella\",\n  \"url_used\":           \"https://linkedin.com/in/satyanadella/\",\n  \"headline\":           \"Chairman and CEO at Microsoft\",\n  \"current_position\":   \"Chairman and CEO\",\n  \"company\":            \"Microsoft\",\n  \"company_url\":        \"https://microsoft.com\",\n  \"location\":           \"Redmond, Washington, United States\",\n  \"connections\":        \"500+\",\n  \"about\":              \"We all need a purpose that animates us. Mine is to empower every person and every organization on the planet to achieve more.\",\n  \"experience_summary\": \"Chairman and CEO at Microsoft (2014–present); EVP Cloud and Enterprise at Microsoft (2011–2014); SVP Server and Tools at Microsoft (2009–2011)\",\n  \"education\":          \"MBA - Booth School of Business, University of Chicago; MS Computer Science - University of Wisconsin-Milwaukee\",\n  \"skills\":             [],\n  \"search_status\":      \"FOUND\",\n  \"data_quality\":       \"Public\",\n  \"security\":           \"No Login Required\",\n  \"source_input\":       \"satyanadella\",\n  \"scraped_at\":         \"2024-10-30T10:15:00Z\"\n}\n```\n\n---\n\n### Full Name Input — Auto Username Discovery\n\n**Input:**\n```json\n{\n  \"profile_urls\": [\"Jensen Huang\", \"Lisa Su\", \"Pat Gelsinger\"]\n}\n```\n\n**What happens:** The actor Google-searches `site:linkedin.com/in \"Jensen Huang\"`, finds `jenhsunhuang`, then scrapes the LinkedIn profile normally. Returns `FOUND` or `PARTIAL` depending on what LinkedIn serves.\n\n---\n\n### Bulk Executive Scraping — 50 Profiles\n\n**Input:**\n```json\n{\n  \"profile_urls\": [\n    \"satyanadella\", \"sundarpichai\", \"tim-cook\",\n    \"andy-jassy\", \"mark-zuckerberg\", \"...47 more...\"\n  ],\n  \"keyword\":     \"CEO\",\n  \"max_results\": 50\n}\n```\n\n**Output:** Up to 50 profiles filtered to only include those with \"CEO\" in their headline, company, or about section. Each tagged with `FOUND`, `PARTIAL`, or `AUTH_REQUIRED` so you know exactly what to trust.\n\n---\n\n### Google Knowledge Panel Fallback — What You Get When Blocked\n\nWhen LinkedIn blocks all URL variants, you still get:\n```json\n{\n  \"name\":          \"Reid Hoffman\",\n  \"profile_url\":   \"https://www.linkedin.com/in/reidhoffman\",\n  \"headline\":      \"Co-Founder at LinkedIn, Partner at Greylock\",\n  \"about\":         \"Reid Hoffman is a Silicon Valley entrepreneur and venture capitalist...\",\n  \"search_status\": \"PARTIAL\",\n  \"data_source\":   \"Google Knowledge Panel\",\n  \"source_input\":  \"reidhoffman\",\n  \"scraped_at\":    \"2024-10-30T10:18:00Z\"\n}\n```\n\nA partial record with real data — not an empty failure.\n\n---\n\n## ⚡ Performance & Speed\n\n| Batch Size | Estimated Time |\n|---|---|\n| 1 profile | ~15–40 seconds |\n| 5 profiles | ~1.5–3 minutes |\n| 10 profiles | ~3–6 minutes |\n| 25 profiles | ~8–15 minutes |\n| 50 profiles | ~15–30 minutes |\n| 100 profiles | ~30–60 minutes |\n\nEach profile includes a 2–4 second random delay between requests. This is mandatory for LinkedIn — aggressive rate will result in IP blocks. The delay is what keeps long runs stable.\n\n**Full name inputs** add ~5–10 seconds each (a Google search step is required first).\n\n---\n\n## 💰 Cost Estimate\n\n**Subscription:** $20.99/month · **Free Trial: 1 Full Day** (no credit card required)\n\n| Run Size | Apify Compute Units | Approx. Compute Cost |\n|---|---|---|\n| 10 profiles | ~0.05–0.10 CU | < $0.01 |\n| 25 profiles | ~0.10–0.20 CU | ~$0.01 |\n| 50 profiles | ~0.20–0.40 CU | ~$0.02–$0.03 |\n| 100 profiles | ~0.40–0.80 CU | ~$0.03–$0.06 |\n| 500 profiles/month (daily runs) | ~2–4 CU/month | ~$0.16–$0.32 |\n\n> **Proxy cost note:** Residential proxy is required for reliable LinkedIn access. Apify's RESIDENTIAL proxy is consumed per GB of data — LinkedIn profile pages are small (~50–200KB each), so proxy costs are minimal even for large batches.\n\n**Use the 1-day free trial** to test on your target profiles and verify data quality before subscribing.\n\n---\n\n## ⚠️ Limitations — Honest Overview\n\nBeing fully transparent about what this LinkedIn profile scraper can and cannot do:\n\n- ❌ **Login-gated data** — Connections list, contact info tab, full skill endorsements, and private profiles require LinkedIn login. This actor only accesses publicly visible profile data.\n- ❌ **100% FOUND rate not guaranteed** — LinkedIn actively protects profiles. Even with residential proxy, some profiles will return `PARTIAL` or `AUTH_REQUIRED`. The `search_status` field tells you exactly what happened for every profile.\n- ⚠️ **Residential proxy is mandatory** — Without a residential proxy, LinkedIn will block datacenter IPs quickly. The actor logs a clear warning if proxy is not configured.\n- ❌ **Real-time connection count** — LinkedIn shows `500+` for most profiles without login. The exact connection count requires a logged-in session.\n- ❌ **Full experience and education lists** — The actor extracts up to 3 experience entries and 2 education entries from the publicly visible section. Complete employment history is behind login.\n- ❌ **Skills endorsement counts** — Skills are extracted when visible but endorsement counts are not available without login.\n- ❌ **Private profiles** — Profiles set to private or connection-only by their owner cannot be scraped by any tool without login.\n- ❌ **LinkedIn Sales Navigator** — This actor does not access Sales Navigator or LinkedIn Recruiter data.\n- ⚠️ **Profile availability may vary by region** — LinkedIn's auth wall aggressiveness varies by geography and IP history. Profiles accessible today may require a proxy IP refresh tomorrow.\n\n---\n\n## 🔌 Integrations\n\n### HubSpot / Salesforce / Pipedrive — CRM Enrichment\nExport the Dataset to CSV and import into your CRM. Map `name` → Contact Name, `current_position` → Job Title, `company` → Company, `location` → Location, `profile_url` → LinkedIn URL.\n\n### Google Sheets — Prospect Research Tracker\nExport results to Google Sheets. Color-code by `search_status` — green for FOUND, yellow for PARTIAL, red for AUTH_REQUIRED. Add outreach status columns for your sales team.\n\n### Apify API — Automated Lead Research\n```javascript\n// Trigger a LinkedIn profile scrape via API\nconst run = await fetch(\"https://api.apify.com/v2/acts/YOUR_ACTOR_ID/runs\", {\n  method: \"POST\",\n  headers: {\n    \"Content-Type\":  \"application/json\",\n    \"Authorization\": \"Bearer YOUR_TOKEN\"\n  },\n  body: JSON.stringify({\n    profile_urls: [\n      \"satyanadella\",\n      \"sundarpichai\",\n      \"https://linkedin.com/in/tim-cook\"\n    ],\n    keyword:     \"CEO\",\n    max_results: 50\n  })\n});\n```\n\n### Zapier / Make — Enrichment Trigger\nTrigger a profile scrape from a Zapier workflow. When a new lead is added to your CRM with a LinkedIn URL, automatically run this actor and push the enriched data back to the CRM contact record.\n\n### n8n — Multi-Stage Research Pipeline\nBuild an n8n workflow: pull company names from one data source → search LinkedIn usernames → scrape profiles with this actor → score leads → route to outreach sequences.\n\n---\n\n## ❓ FAQ\n\n**Q: Does this LinkedIn profile scraper require a LinkedIn account?**\nA: No. The actor attempts all three LinkedIn URL variants without any login or cookies. When all variants are blocked, it falls back to Google Knowledge Panel — which also requires no login.\n\n**Q: Why is residential proxy required?**\nA: LinkedIn aggressively blocks datacenter IPs (AWS, Google Cloud, Azure). Residential proxy routes requests through real consumer IP addresses that LinkedIn treats as regular browser traffic. Without it, most profiles will return `AUTH_REQUIRED`.\n\n**Q: What's the difference between FOUND and PARTIAL?**\nA: `FOUND` means the actor successfully loaded the LinkedIn profile page and extracted data from it. `PARTIAL` means LinkedIn was blocked for all URL variants, but Google's Knowledge Panel for the person returned some data. FOUND records have more fields (experience, education, connections). PARTIAL records typically have name, title, and about only.\n\n**Q: Can I input full names instead of usernames?**\nA: Yes. Input `\"Satya Nadella\"` and the actor searches `site:linkedin.com/in \"Satya Nadella\"` on Google, extracts the username from the first result, and proceeds. This adds ~5–10 seconds per profile. Works best for well-known professionals with unique names.\n\n**Q: How many profiles can I scrape in one run?**\nA: Set `max_results` to any value. The actor processes profiles one at a time with 2–4 second delays. For 500 profiles, expect approximately 30–90 minutes depending on LinkedIn's response rate. Use residential proxy for large runs.\n\n**Q: Why does it cost more than other LinkedIn scrapers?**\nA: Because it actually works when LinkedIn fights back. Auth wall detection, 3-layer fallback, Google Knowledge Panel backup, and full-name search are engineering investments that other scrapers skip. The `search_status` field means you never pay for false data — you always know exactly what you got.\n\n**Q: Can I use keyword filtering to find only CMOs or VPs?**\nA: Yes. Set `\"keyword\": \"CMO\"` and only profiles where \"CMO\" appears in the headline, company, or about section are returned. Combine with a large input list to target-filter a specific executive segment.\n\n**Q: What happens if a profile username doesn't exist?**\nA: LinkedIn returns a 404. The actor logs it, skips the profile, and continues with the next input. No crash, no stall.\n\n**Q: Can I scrape the same profiles again later for changes?**\nA: Yes. Schedule the actor to run monthly on the same username list. Compare `current_position` and `company` fields across runs to detect job changes, promotions, or company moves.\n\n---\n\n## 📜 Changelog\n\n### v3.0.0 (Current)\n- ✅ 3-layer extraction: linkedin.com (no-www) → www.linkedin.com → m.linkedin.com (mobile)\n- ✅ Auth wall detection using 7 LinkedIn login-page phrase patterns\n- ✅ Google Knowledge Panel fallback when all LinkedIn URLs are blocked\n- ✅ Full name input support — auto-discovers LinkedIn username via Google search\n- ✅ OG meta tag parsing for name, headline, company, and location\n- ✅ JSON-LD `Person`/`ProfilePage` schema extraction for structured data\n- ✅ HTML fallback selectors for name, headline, location, about, experience, and education\n- ✅ `search_status` field: FOUND / PARTIAL / AUTH_REQUIRED per profile\n- ✅ `url_used` field — records which URL variant succeeded\n- ✅ Experience summary extraction — up to 3 most recent roles\n- ✅ Education extraction — up to 2 entries\n- ✅ Keyword filter across headline, company, and about section\n- ✅ 2–4 second random delay between profiles\n- ✅ Graceful 404 handling — missing profiles logged and skipped\n- ✅ Results pushed to Dataset and Key-Value Store (`results.json`)\n- ✅ Residential proxy support via `curl_cffi` Chrome 110 impersonation\n\n**v2.x** — Fixed m.linkedin.com soft auth wall returning false positives as valid data\n\n**v1.x** — Initial LinkedIn profile extraction (single URL variant, no fallback)\n\n---\n\n## ⚖️ Legal & Terms\n\nThis **LinkedIn profile scraper** accesses **publicly visible** LinkedIn profile data — the same information visible to any person viewing a LinkedIn profile in a browser without logging in.\n\n**Please use responsibly:**\n- Only scrape profiles of public figures or in contexts where you have a legitimate business reason\n- Comply with **GDPR**, **CCPA**, and applicable data protection laws — LinkedIn profile data of individuals is personal data under most jurisdictions\n- Do not use extracted data to build contact databases for mass unsolicited outreach (spam)\n- Do not use this actor to bypass LinkedIn's authentication to access private profiles or paid features\n- Respect LinkedIn's [User Agreement](https://www.linkedin.com/legal/user-agreement) — this actor only accesses public data that requires no login\n- This actor is intended for B2B sales research, recruitment, due diligence, journalism, and legitimate professional workflows\n\n**GDPR Note:** LinkedIn profile data of living individuals is personal data under GDPR Article 4. Processing requires a valid legal basis under Article 6. For B2B prospecting using professional contact information, Article 6(1)(f) (legitimate interest) is commonly relied upon — but consult a legal professional for your specific use case and jurisdiction.\n\n---\n\n## 🤝 Support\n\n- **Getting AUTH_REQUIRED on many profiles?** Make sure RESIDENTIAL proxy is enabled — this is the most common cause of blocked profiles\n- **Full name not finding the right profile?** Try the LinkedIn username directly — search `[Name] site:linkedin.com` in your browser to find it\n- **Need a field that's missing?** Drop a feature request on the Apify actor page\n- **Works well for your research or sales workflow?** A ⭐ review on the Apify Store helps others find this LinkedIn profile scraper and keeps it actively maintained\n\n---\n\n<p align=\"center\">\n  <strong>LinkedIn Profile Scraper · Built on Apify</strong><br/>\n  <em>No Login · 3-Layer Fallback · Auth Wall Detection · Full Name Search · Google Knowledge Panel · Bulk · Status Tracking</em>\n</p>",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "linkedin-profile-scraper",
      "title": "LinkedIn Profile Scraper — Public Profile Data without Login",
      "description": "Scrape public LinkedIn profile data without requiring login. Returns name, headline, current position, company, location, about, education and experience summary. Accepts @username, t.me URL, full name or LinkedIn URL as input. RESIDENTIAL proxy required.",
      "version": "1.0",
      "minMemoryMbytes": 4096,
      "maxMemoryMbytes": 16384,
      "dockerfile": "./Dockerfile",
      "readme": "# LinkedIn Profile Scraper | Name, Headline, Company, Location & Experience — No Login Required\n\n> **Scrape LinkedIn profiles by username, profile URL, or full name — without login, without cookies, and without a LinkedIn API key. The most resilient LinkedIn profile scraper on Apify — with auth wall detection, 3-layer fallback, and Google Knowledge Panel backup.**\n\n---\n\n## 📌 Table of Contents\n\n- [What Does This Actor Do?](#what-does-this-actor-do)\n- [Quick Start — 3 Steps](#quick-start--3-steps)\n- [Why This LinkedIn Profile Scraper?](#why-this-linkedin-profile-scraper)\n- [Use Cases](#use-cases)\n- [What Data You Get](#what-data-you-get)\n- [3-Layer Extraction System](#3-layer-extraction-system)\n- [Auth Wall Detection & Handling](#auth-wall-detection--handling)\n- [3 Input Formats Supported](#3-input-formats-supported)\n- [Search Status — FOUND, PARTIAL, AUTH_REQUIRED](#search-status--found-partial-auth_required)\n- [Input Parameters](#input-parameters)\n- [Example Input & Output](#example-input--output)\n- [Performance & Speed](#performance--speed)\n- [Cost Estimate](#cost-estimate)\n- [Limitations — Honest Overview](#limitations--honest-overview)\n- [Integrations](#integrations)\n- [FAQ](#faq)\n- [Changelog](#changelog)\n- [Legal & Terms](#legal--terms)\n\n---\n\n## 🔍 What Does This Actor Do?\n\nThis **LinkedIn profile scraper** extracts structured profile data from LinkedIn — name, headline, current position, company, location, about section, experience, education, and connections — without requiring a LinkedIn account, login session, or API key.\n\nWhat makes this actor different from every other LinkedIn scraper:\n\n- ✅ **Works without login** — tries three LinkedIn URL variants in sequence before ever asking for credentials\n- ✅ **Detects auth walls** — recognizes when LinkedIn is blocking a request (soft redirect to login page) and automatically switches to the next strategy instead of returning garbage data\n- ✅ **Falls back to Google Knowledge Panel** — when all LinkedIn URLs are blocked, extracts profile data from Google's rich results for the person\n- ✅ **Accepts full names as input** — type `\"Satya Nadella\"` instead of a LinkedIn URL and the actor finds the profile automatically\n- ✅ **Transparent status per profile** — every record includes `FOUND`, `PARTIAL`, or `AUTH_REQUIRED` so you always know data quality\n\nNo login. No cookies. No API key. Paste usernames, profile URLs, or full names — get structured profile data back.\n\n---\n\n## ⚡ Quick Start — 3 Steps\n\n**Step 1 — Add LinkedIn usernames, URLs, or full names**\n```json\n{\n  \"profile_urls\": [\n    \"satyanadella\",\n    \"https://www.linkedin.com/in/sundarpichai\",\n    \"Tim Cook\",\n    \"https://www.linkedin.com/in/bill-gates\"\n  ],\n  \"max_results\": 20\n}\n```\n\n**Step 2 — Click Run**\nThe actor tries three LinkedIn URL variants per profile, detects any auth walls, falls back to Google Knowledge Panel if blocked, and returns the richest data available.\n\n**Step 3 — Get your LinkedIn profile data**\n```json\n{\n  \"name\":               \"Satya Nadella\",\n  \"profile_url\":        \"https://www.linkedin.com/in/satyanadella\",\n  \"headline\":           \"Chairman and CEO at Microsoft\",\n  \"current_position\":   \"Chairman and CEO\",\n  \"company\":            \"Microsoft\",\n  \"location\":           \"Redmond, Washington, United States\",\n  \"connections\":        \"500+\",\n  \"about\":              \"We all need a purpose that animates us...\",\n  \"experience_summary\": \"Chairman and CEO at Microsoft (2014–present); EVP Cloud at Microsoft (2011–2014)\",\n  \"education\":          \"MBA - University of Chicago; MS Computer Science - University of Wisconsin\",\n  \"search_status\":      \"FOUND\",\n  \"data_quality\":       \"Public\"\n}\n```\n\nYour profiles are in the **Dataset** tab — export as JSON, CSV, or Excel immediately.\n\n---\n\n## 🏆 Why This LinkedIn Profile Scraper?\n\n| Feature | This Actor | Other LinkedIn Scrapers | Manual Research |\n|---|---|---|---|\n| **No login required** | ✅ Attempts without auth | ⚠️ Require cookies/session | ✅ But slow |\n| **Auth wall detection** | ✅ Auto-detects + switches strategy | ❌ Returns garbage data | ❌ |\n| **3 URL variants tried per profile** | ✅ linkedin.com + www + mobile | ❌ One URL only | ❌ |\n| **Google Knowledge Panel fallback** | ✅ Last-resort data source | ❌ | ❌ |\n| **Full name as input** | ✅ \"Satya Nadella\" → finds username | ❌ Username/URL only | ✅ |\n| **FOUND / PARTIAL / AUTH_REQUIRED status** | ✅ Per profile | ❌ Silent failures | ❌ |\n| **Experience summary extracted** | ✅ Up to 3 roles | ⚠️ Often missing | ❌ |\n| **Education extracted** | ✅ Up to 2 entries | ⚠️ Often missing | ❌ |\n| **Bulk processing (any volume)** | ✅ | ⚠️ Limited | ❌ |\n| **Keyword filter across profiles** | ✅ Built-in | ❌ | ❌ |\n| **Transparent data provenance** | ✅ `url_used` + `data_quality` fields | ❌ | ❌ |\n\n> **The only LinkedIn profile scraper with built-in auth wall detection, automatic fallback across 3 URL variants, Google Knowledge Panel backup, and full-name search — all in one run.**\n\n---\n\n## 🎯 Use Cases\n\n### 🎯 Sales Prospecting & Account Research\nScrape LinkedIn profiles for decision-makers at target accounts before cold outreach. Get current position, company, location, and about section to personalize emails and calls with relevant context. Works on username lists exported from Sales Navigator or Apollo.\n\n### 🤝 Recruitment & Talent Intelligence\nBuild candidate profiles from LinkedIn usernames at scale. Extract current title, company, experience summary, and education for initial screening — before investing recruiter time in manual research. Identify candidates' career progression and company tenure at a glance.\n\n### 🔎 Competitive Intelligence & Executive Tracking\nMonitor leadership changes at competitor companies by scraping their executives' LinkedIn profiles. Track when a CTO moves, when a VP of Sales is replaced, or when a new CMO joins — before the press release.\n\n### 📊 Lead Enrichment for CRM\nEnrich a list of LinkedIn profile URLs with structured data — name, title, company, location — and import directly into HubSpot, Salesforce, or Pipedrive. Replace expensive enrichment tools with a direct LinkedIn scrape.\n\n### 🏢 Investor & VC Due Diligence\nResearch founding team profiles for investment decisions. Verify claimed experience, check for gaps in employment history, identify educational background, and understand career trajectory — all from public LinkedIn data.\n\n### 📈 Market Research & People Analytics\nAnalyze the talent composition of an industry by scraping profiles with a keyword filter. Find all \"Head of AI\" profiles across companies, or all \"Growth Manager\" profiles in the fintech sector.\n\n### 🎓 Academic & HR Research\nBuild structured datasets of professional profiles for research on career mobility, industry skill distribution, or gender/geographic diversity in leadership roles. All from public LinkedIn data — ethically scraped without login.\n\n### 📰 Journalism & Background Research\nVerify professional claims for interview subjects, sources, or article subjects. The `experience_summary` and `education` fields provide a structured career history from the person's own public profile.\n\n---\n\n## 📋 What Data You Get\n\nEvery LinkedIn profile record contains up to **16 structured fields**:\n\n| Field | Type | Description | Example |\n|---|---|---|---|\n| `name` | string | Full name | `\"Satya Nadella\"` |\n| `profile_url` | string | LinkedIn profile URL | `\"https://www.linkedin.com/in/satyanadella\"` |\n| `url_used` | string | Which URL variant successfully returned data | `\"https://linkedin.com/in/satyanadella/\"` |\n| `headline` | string | LinkedIn headline (up to 300 chars) | `\"Chairman and CEO at Microsoft\"` |\n| `current_position` | string | Current job title | `\"Chairman and CEO\"` |\n| `company` | string | Current company name | `\"Microsoft\"` |\n| `company_url` | string | Company website (if in JSON-LD) | `\"https://microsoft.com\"` |\n| `location` | string | City, state, country | `\"Redmond, Washington, United States\"` |\n| `connections` | string | Connection/follower count | `\"500+\"` |\n| `about` | string | About section (up to 1000 chars) | `\"We all need a purpose...\"` |\n| `experience_summary` | string | Up to 3 recent roles formatted | `\"CEO at Microsoft (2014–present); EVP Cloud...\"` |\n| `education` | string | Up to 2 education entries | `\"MBA - University of Chicago; MS Computer Science...\"` |\n| `skills` | array | Listed skills (when available) | `[\"Leadership\", \"Cloud Computing\", \"AI\"]` |\n| `search_status` | string | Extraction result status | `\"FOUND\"` / `\"PARTIAL\"` / `\"AUTH_REQUIRED\"` |\n| `data_quality` | string | Data completeness label | `\"Public\"` |\n| `source_input` | string | Original input you provided | `\"satyanadella\"` |\n| `scraped_at` | string | ISO 8601 extraction timestamp | `\"2024-10-30T10:15:00Z\"` |\n\n---\n\n## 🔄 3-Layer Extraction System\n\nThis LinkedIn profile scraper uses three independent extraction methods in sequence — moving to the next only when the previous is definitively blocked:\n\n### Layer 1 — Direct LinkedIn (No-www)\n`https://linkedin.com/in/{username}/`\n\nLinkedIn's no-www domain often serves public profile data without triggering the login wall that `www.linkedin.com` sometimes shows. This is tried first — it works for a significant portion of public profiles without any proxy at all.\n\n### Layer 2 — Standard LinkedIn (www) + Mobile LinkedIn\n`https://www.linkedin.com/in/{username}/`\n`https://m.linkedin.com/in/{username}/`\n\nIf Layer 1 is blocked or returns a soft redirect, the actor tries the standard domain, then the mobile domain. Each variant uses different headers (desktop vs mobile User-Agent) to maximize the chance of getting past rate limiting.\n\n### Layer 3 — Google Knowledge Panel (Ultimate Fallback)\nWhen all three LinkedIn URL variants return an auth wall, the actor searches Google for `[name] linkedin` and extracts whatever profile data appears in Google's Knowledge Panel — name, job title, description, and the direct LinkedIn profile link.\n\nThis 3-layer system means that even in the worst case — when LinkedIn blocks your IP entirely — you still get a `PARTIAL` record with publicly available data rather than an empty failure.\n\n---\n\n## 🛡️ Auth Wall Detection & Handling\n\nLinkedIn's most common defense is a **soft auth wall** — the server returns HTTP 200 (not an error) but serves a login-prompt page instead of the profile. Generic scrapers cannot tell the difference and return this garbage data as a real result.\n\nThis actor detects auth walls by scanning the first 5,000 characters of each response for LinkedIn's known login-page phrases:\n\n- `\"welcome to your professional community\"`\n- `\"sign in to linkedin\"`\n- `\"join linkedin\"`\n- `\"linkedin: log in\"`\n- `\"be great at what you do\"`\n- `\"1 billion members\"`\n- `\"make the most of your professional life\"`\n\n**When an auth wall is detected:**\n1. The current URL variant is immediately discarded\n2. A warning is logged: `\"Auth wall detected at: [URL]\"`\n3. The next URL variant is tried automatically\n4. If all variants are auth-walled → Google Knowledge Panel fallback is triggered\n5. `search_status` is set to `PARTIAL` or `AUTH_REQUIRED` — never a false `FOUND`\n\n**You never get silently wrong data.** Every record tells you exactly what happened.\n\n---\n\n## 📥 3 Input Formats Supported\n\nThis LinkedIn profile scraper accepts three input formats — mix them freely in a single run:\n\n### Format 1 — LinkedIn Username\n```\nsatyanadella\nbill-gates\njeff-weiner\n```\nThe actor constructs the full LinkedIn URL automatically.\n\n### Format 2 — Full LinkedIn Profile URL\n```\nhttps://www.linkedin.com/in/sundarpichai\nhttps://linkedin.com/in/tim-cook\n```\nBoth `www.` and non-www variants are accepted and normalized.\n\n### Format 3 — Full Name (Auto-Discovery)\n```\nSatya Nadella\nSundar Pichai\nJensen Huang\n```\nWhen the input contains a space and no LinkedIn URL pattern, the actor treats it as a full name, Google-searches `site:linkedin.com/in \"Full Name\"`, extracts the LinkedIn username from the results, and proceeds with normal profile scraping. If the username cannot be found, Google Knowledge Panel data is returned with `search_status: PARTIAL`.\n\n---\n\n## 📊 Search Status — FOUND, PARTIAL, AUTH_REQUIRED\n\nEvery record includes a `search_status` field — so you always know exactly what you got:\n\n| Status | Meaning | What's in the Record |\n|---|---|---|\n| **FOUND** | LinkedIn served the public profile successfully | Full profile data — name, headline, company, location, about, experience, education |\n| **PARTIAL** | LinkedIn was blocked but Google Knowledge Panel returned data | Name, headline/title, about (from Google's rich results) — no experience or education |\n| **AUTH_REQUIRED** | All LinkedIn URLs blocked AND Google KP returned nothing | Only `profile_url`, note explaining the block, and `scraped_at` timestamp |\n\n**How to use status in your workflow:**\n- Filter `FOUND` records for highest-confidence data\n- `PARTIAL` records are still useful for name, title, and company confirmation\n- `AUTH_REQUIRED` records indicate the profile needs a fresher residential proxy IP — re-run with a new proxy session\n\n---\n\n## ⚙️ Input Parameters\n\n```json\n{\n  \"profile_urls\": [\n    \"satyanadella\",\n    \"https://www.linkedin.com/in/sundarpichai\",\n    \"Jensen Huang\",\n    \"https://linkedin.com/in/elonmusk\"\n  ],\n  \"profile_url\":  \"\",\n  \"username\":     \"\",\n  \"keyword\":      \"CEO\",\n  \"max_results\":  20,\n  \"proxyConfiguration\": {\n    \"useApifyProxy\":    true,\n    \"apifyProxyGroups\": [\"RESIDENTIAL\"]\n  }\n}\n```\n\n| Parameter | Type | Default | Description |\n|---|---|---|---|\n| `profile_urls` | array or string | `[]` | List of LinkedIn usernames, profile URLs, or full names. Mix formats freely. |\n| `profile_url` | string | `\"\"` | Single profile URL or username shortcut — added to `profile_urls` automatically |\n| `username` | string | `\"\"` | Single LinkedIn username shortcut |\n| `keyword` | string | `\"\"` | Filter results — only return profiles where this keyword appears in headline, company, or about section |\n| `max_results` | integer | `20` | Maximum number of profiles to scrape |\n| `proxyConfiguration` | object | ⚠️ Required | Apify proxy config — **RESIDENTIAL proxy is required** for reliable LinkedIn access |\n\n---\n\n## 📦 Example Input & Output\n\n### Single Profile — Full Data Extraction\n\n**Input:**\n```json\n{\n  \"profile_urls\": [\"satyanadella\"]\n}\n```\n\n**Output:**\n```json\n{\n  \"name\":               \"Satya Nadella\",\n  \"profile_url\":        \"https://www.linkedin.com/in/satyanadella\",\n  \"url_used\":           \"https://linkedin.com/in/satyanadella/\",\n  \"headline\":           \"Chairman and CEO at Microsoft\",\n  \"current_position\":   \"Chairman and CEO\",\n  \"company\":            \"Microsoft\",\n  \"company_url\":        \"https://microsoft.com\",\n  \"location\":           \"Redmond, Washington, United States\",\n  \"connections\":        \"500+\",\n  \"about\":              \"We all need a purpose that animates us. Mine is to empower every person and every organization on the planet to achieve more.\",\n  \"experience_summary\": \"Chairman and CEO at Microsoft (2014–present); EVP Cloud and Enterprise at Microsoft (2011–2014); SVP Server and Tools at Microsoft (2009–2011)\",\n  \"education\":          \"MBA - Booth School of Business, University of Chicago; MS Computer Science - University of Wisconsin-Milwaukee\",\n  \"skills\":             [],\n  \"search_status\":      \"FOUND\",\n  \"data_quality\":       \"Public\",\n  \"security\":           \"No Login Required\",\n  \"source_input\":       \"satyanadella\",\n  \"scraped_at\":         \"2024-10-30T10:15:00Z\"\n}\n```\n\n---\n\n### Full Name Input — Auto Username Discovery\n\n**Input:**\n```json\n{\n  \"profile_urls\": [\"Jensen Huang\", \"Lisa Su\", \"Pat Gelsinger\"]\n}\n```\n\n**What happens:** The actor Google-searches `site:linkedin.com/in \"Jensen Huang\"`, finds `jenhsunhuang`, then scrapes the LinkedIn profile normally. Returns `FOUND` or `PARTIAL` depending on what LinkedIn serves.\n\n---\n\n### Bulk Executive Scraping — 50 Profiles\n\n**Input:**\n```json\n{\n  \"profile_urls\": [\n    \"satyanadella\", \"sundarpichai\", \"tim-cook\",\n    \"andy-jassy\", \"mark-zuckerberg\", \"...47 more...\"\n  ],\n  \"keyword\":     \"CEO\",\n  \"max_results\": 50\n}\n```\n\n**Output:** Up to 50 profiles filtered to only include those with \"CEO\" in their headline, company, or about section. Each tagged with `FOUND`, `PARTIAL`, or `AUTH_REQUIRED` so you know exactly what to trust.\n\n---\n\n### Google Knowledge Panel Fallback — What You Get When Blocked\n\nWhen LinkedIn blocks all URL variants, you still get:\n```json\n{\n  \"name\":          \"Reid Hoffman\",\n  \"profile_url\":   \"https://www.linkedin.com/in/reidhoffman\",\n  \"headline\":      \"Co-Founder at LinkedIn, Partner at Greylock\",\n  \"about\":         \"Reid Hoffman is a Silicon Valley entrepreneur and venture capitalist...\",\n  \"search_status\": \"PARTIAL\",\n  \"data_source\":   \"Google Knowledge Panel\",\n  \"source_input\":  \"reidhoffman\",\n  \"scraped_at\":    \"2024-10-30T10:18:00Z\"\n}\n```\n\nA partial record with real data — not an empty failure.\n\n---\n\n## ⚡ Performance & Speed\n\n| Batch Size | Estimated Time |\n|---|---|\n| 1 profile | ~15–40 seconds |\n| 5 profiles | ~1.5–3 minutes |\n| 10 profiles | ~3–6 minutes |\n| 25 profiles | ~8–15 minutes |\n| 50 profiles | ~15–30 minutes |\n| 100 profiles | ~30–60 minutes |\n\nEach profile includes a 2–4 second random delay between requests. This is mandatory for LinkedIn — aggressive rate will result in IP blocks. The delay is what keeps long runs stable.\n\n**Full name inputs** add ~5–10 seconds each (a Google search step is required first).\n\n---\n\n## 💰 Cost Estimate\n\n**Subscription:** $20.99/month · **Free Trial: 1 Full Day** (no credit card required)\n\n| Run Size | Apify Compute Units | Approx. Compute Cost |\n|---|---|---|\n| 10 profiles | ~0.05–0.10 CU | < $0.01 |\n| 25 profiles | ~0.10–0.20 CU | ~$0.01 |\n| 50 profiles | ~0.20–0.40 CU | ~$0.02–$0.03 |\n| 100 profiles | ~0.40–0.80 CU | ~$0.03–$0.06 |\n| 500 profiles/month (daily runs) | ~2–4 CU/month | ~$0.16–$0.32 |\n\n> **Proxy cost note:** Residential proxy is required for reliable LinkedIn access. Apify's RESIDENTIAL proxy is consumed per GB of data — LinkedIn profile pages are small (~50–200KB each), so proxy costs are minimal even for large batches.\n\n**Use the 1-day free trial** to test on your target profiles and verify data quality before subscribing.\n\n---\n\n## ⚠️ Limitations — Honest Overview\n\nBeing fully transparent about what this LinkedIn profile scraper can and cannot do:\n\n- ❌ **Login-gated data** — Connections list, contact info tab, full skill endorsements, and private profiles require LinkedIn login. This actor only accesses publicly visible profile data.\n- ❌ **100% FOUND rate not guaranteed** — LinkedIn actively protects profiles. Even with residential proxy, some profiles will return `PARTIAL` or `AUTH_REQUIRED`. The `search_status` field tells you exactly what happened for every profile.\n- ⚠️ **Residential proxy is mandatory** — Without a residential proxy, LinkedIn will block datacenter IPs quickly. The actor logs a clear warning if proxy is not configured.\n- ❌ **Real-time connection count** — LinkedIn shows `500+` for most profiles without login. The exact connection count requires a logged-in session.\n- ❌ **Full experience and education lists** — The actor extracts up to 3 experience entries and 2 education entries from the publicly visible section. Complete employment history is behind login.\n- ❌ **Skills endorsement counts** — Skills are extracted when visible but endorsement counts are not available without login.\n- ❌ **Private profiles** — Profiles set to private or connection-only by their owner cannot be scraped by any tool without login.\n- ❌ **LinkedIn Sales Navigator** — This actor does not access Sales Navigator or LinkedIn Recruiter data.\n- ⚠️ **Profile availability may vary by region** — LinkedIn's auth wall aggressiveness varies by geography and IP history. Profiles accessible today may require a proxy IP refresh tomorrow.\n\n---\n\n## 🔌 Integrations\n\n### HubSpot / Salesforce / Pipedrive — CRM Enrichment\nExport the Dataset to CSV and import into your CRM. Map `name` → Contact Name, `current_position` → Job Title, `company` → Company, `location` → Location, `profile_url` → LinkedIn URL.\n\n### Google Sheets — Prospect Research Tracker\nExport results to Google Sheets. Color-code by `search_status` — green for FOUND, yellow for PARTIAL, red for AUTH_REQUIRED. Add outreach status columns for your sales team.\n\n### Apify API — Automated Lead Research\n```javascript\n// Trigger a LinkedIn profile scrape via API\nconst run = await fetch(\"https://api.apify.com/v2/acts/YOUR_ACTOR_ID/runs\", {\n  method: \"POST\",\n  headers: {\n    \"Content-Type\":  \"application/json\",\n    \"Authorization\": \"Bearer YOUR_TOKEN\"\n  },\n  body: JSON.stringify({\n    profile_urls: [\n      \"satyanadella\",\n      \"sundarpichai\",\n      \"https://linkedin.com/in/tim-cook\"\n    ],\n    keyword:     \"CEO\",\n    max_results: 50\n  })\n});\n```\n\n### Zapier / Make — Enrichment Trigger\nTrigger a profile scrape from a Zapier workflow. When a new lead is added to your CRM with a LinkedIn URL, automatically run this actor and push the enriched data back to the CRM contact record.\n\n### n8n — Multi-Stage Research Pipeline\nBuild an n8n workflow: pull company names from one data source → search LinkedIn usernames → scrape profiles with this actor → score leads → route to outreach sequences.\n\n---\n\n## ❓ FAQ\n\n**Q: Does this LinkedIn profile scraper require a LinkedIn account?**\nA: No. The actor attempts all three LinkedIn URL variants without any login or cookies. When all variants are blocked, it falls back to Google Knowledge Panel — which also requires no login.\n\n**Q: Why is residential proxy required?**\nA: LinkedIn aggressively blocks datacenter IPs (AWS, Google Cloud, Azure). Residential proxy routes requests through real consumer IP addresses that LinkedIn treats as regular browser traffic. Without it, most profiles will return `AUTH_REQUIRED`.\n\n**Q: What's the difference between FOUND and PARTIAL?**\nA: `FOUND` means the actor successfully loaded the LinkedIn profile page and extracted data from it. `PARTIAL` means LinkedIn was blocked for all URL variants, but Google's Knowledge Panel for the person returned some data. FOUND records have more fields (experience, education, connections). PARTIAL records typically have name, title, and about only.\n\n**Q: Can I input full names instead of usernames?**\nA: Yes. Input `\"Satya Nadella\"` and the actor searches `site:linkedin.com/in \"Satya Nadella\"` on Google, extracts the username from the first result, and proceeds. This adds ~5–10 seconds per profile. Works best for well-known professionals with unique names.\n\n**Q: How many profiles can I scrape in one run?**\nA: Set `max_results` to any value. The actor processes profiles one at a time with 2–4 second delays. For 500 profiles, expect approximately 30–90 minutes depending on LinkedIn's response rate. Use residential proxy for large runs.\n\n**Q: Why does it cost more than other LinkedIn scrapers?**\nA: Because it actually works when LinkedIn fights back. Auth wall detection, 3-layer fallback, Google Knowledge Panel backup, and full-name search are engineering investments that other scrapers skip. The `search_status` field means you never pay for false data — you always know exactly what you got.\n\n**Q: Can I use keyword filtering to find only CMOs or VPs?**\nA: Yes. Set `\"keyword\": \"CMO\"` and only profiles where \"CMO\" appears in the headline, company, or about section are returned. Combine with a large input list to target-filter a specific executive segment.\n\n**Q: What happens if a profile username doesn't exist?**\nA: LinkedIn returns a 404. The actor logs it, skips the profile, and continues with the next input. No crash, no stall.\n\n**Q: Can I scrape the same profiles again later for changes?**\nA: Yes. Schedule the actor to run monthly on the same username list. Compare `current_position` and `company` fields across runs to detect job changes, promotions, or company moves.\n\n---\n\n## 📜 Changelog\n\n### v3.0.0 (Current)\n- ✅ 3-layer extraction: linkedin.com (no-www) → www.linkedin.com → m.linkedin.com (mobile)\n- ✅ Auth wall detection using 7 LinkedIn login-page phrase patterns\n- ✅ Google Knowledge Panel fallback when all LinkedIn URLs are blocked\n- ✅ Full name input support — auto-discovers LinkedIn username via Google search\n- ✅ OG meta tag parsing for name, headline, company, and location\n- ✅ JSON-LD `Person`/`ProfilePage` schema extraction for structured data\n- ✅ HTML fallback selectors for name, headline, location, about, experience, and education\n- ✅ `search_status` field: FOUND / PARTIAL / AUTH_REQUIRED per profile\n- ✅ `url_used` field — records which URL variant succeeded\n- ✅ Experience summary extraction — up to 3 most recent roles\n- ✅ Education extraction — up to 2 entries\n- ✅ Keyword filter across headline, company, and about section\n- ✅ 2–4 second random delay between profiles\n- ✅ Graceful 404 handling — missing profiles logged and skipped\n- ✅ Results pushed to Dataset and Key-Value Store (`results.json`)\n- ✅ Residential proxy support via `curl_cffi` Chrome 110 impersonation\n\n**v2.x** — Fixed m.linkedin.com soft auth wall returning false positives as valid data\n\n**v1.x** — Initial LinkedIn profile extraction (single URL variant, no fallback)\n\n---\n\n## ⚖️ Legal & Terms\n\nThis **LinkedIn profile scraper** accesses **publicly visible** LinkedIn profile data — the same information visible to any person viewing a LinkedIn profile in a browser without logging in.\n\n**Please use responsibly:**\n- Only scrape profiles of public figures or in contexts where you have a legitimate business reason\n- Comply with **GDPR**, **CCPA**, and applicable data protection laws — LinkedIn profile data of individuals is personal data under most jurisdictions\n- Do not use extracted data to build contact databases for mass unsolicited outreach (spam)\n- Do not use this actor to bypass LinkedIn's authentication to access private profiles or paid features\n- Respect LinkedIn's [User Agreement](https://www.linkedin.com/legal/user-agreement) — this actor only accesses public data that requires no login\n- This actor is intended for B2B sales research, recruitment, due diligence, journalism, and legitimate professional workflows\n\n**GDPR Note:** LinkedIn profile data of living individuals is personal data under GDPR Article 4. Processing requires a valid legal basis under Article 6. For B2B prospecting using professional contact information, Article 6(1)(f) (legitimate interest) is commonly relied upon — but consult a legal professional for your specific use case and jurisdiction.\n\n---\n\n## 🤝 Support\n\n- **Getting AUTH_REQUIRED on many profiles?** Make sure RESIDENTIAL proxy is enabled — this is the most common cause of blocked profiles\n- **Full name not finding the right profile?** Try the LinkedIn username directly — search `[Name] site:linkedin.com` in your browser to find it\n- **Need a field that's missing?** Drop a feature request on the Apify actor page\n- **Works well for your research or sales workflow?** A ⭐ review on the Apify Store helps others find this LinkedIn profile scraper and keeps it actively maintained\n\n---\n\n<p align=\"center\">\n  <strong>LinkedIn Profile Scraper · Built on Apify</strong><br/>\n  <em>No Login · 3-Layer Fallback · Auth Wall Detection · Full Name Search · Google Knowledge Panel · Bulk · Status Tracking</em>\n</p>",
      "input": {
        "title": "LinkedIn Profile Scraper — Public Profile Data without Login",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "profile_urls": {
            "title": "LinkedIn Profiles (batch)",
            "description": "LinkedIn usernames or profile URLs, one per line.\n\nAccepted formats:\nsatyanadella\n@sundarpichai\nhttps://linkedin.com/in/tim-cook\nSatya Nadella (full name — will search Google)\nlinkedin.com/in/jeffweiner",
            "type": "string",
            "editor": "textarea",
            "prefill": "satyanadella\nsundarpichai\ntim-cook"
          },
          "profile_url": {
            "title": "Single Profile",
            "description": "Single LinkedIn @username or profile URL",
            "type": "string",
            "editor": "textfield"
          },
          "keyword": {
            "title": "Keyword Filter",
            "description": "Only return profiles where headline, company or about contains this keyword. E.g: 'CEO', 'engineer', 'marketing'",
            "type": "string",
            "editor": "textfield"
          },
          "max_results": {
            "title": "Max Profiles",
            "description": "Maximum profiles to scrape",
            "type": "integer",
            "default": 20
          },
          "proxyConfiguration": {
            "title": "Proxy (RESIDENTIAL Required)",
            "description": "RESIDENTIAL proxy is required — LinkedIn blocks all datacenter IPs.",
            "type": "object",
            "editor": "proxy",
            "prefill": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          }
        },
        "required": []
      }
    },
    "buildNumber": "0.0.7",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "0.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.009365555555555556
    }
  }
}