{
  "data": {
    "id": "IByFHfhuyPT56ciDc",
    "actId": "aMgKFivt7rPvytSbm",
    "userId": "ahCzxnwfcj5Jy1qRJ",
    "startedAt": "2026-10-13T09:12:40.242Z",
    "finishedAt": "2026-10-13T09:13:01.134Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "API"
    },
    "stats": {
      "durationMillis": 20788,
      "runTimeSecs": 20.788,
      "computeUnits": 0.023097777777777776,
      "imageSizeBytes": 578072576
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "tag": "latest",
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"LinkedIn Profile Scraper — No Cookies input\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"profileUrls\": {\n      \"title\": \"👤 Profiles\",\n      \"type\": \"array\",\n      \"editor\": \"stringList\",\n      \"description\": \"LinkedIn profile URLs or slugs, one per line — <b>https://www.linkedin.com/in/satyanadella</b> or <b>satyanadella</b>. One row and one charge per profile; profiles that do not exist or are private are free. Sales Navigator / Recruiter links (<b>linkedin.com/sales/lead/…</b>) open only with a login — paste the public <b>/in/</b> URL instead.\",\n      \"prefill\": [\n        \"https://www.linkedin.com/in/satyanadella\",\n        \"https://www.linkedin.com/in/jeffweiner08\",\n        \"justinwelsh\"\n      ]\n    },\n    \"startUrls\": {\n      \"title\": \"🔗 Profiles from a file or sheet\",\n      \"type\": \"array\",\n      \"editor\": \"requestListSources\",\n      \"default\": [],\n      \"description\": \"The same thing for long lists — upload a file or link a Google Sheet of profile URLs.\"\n    },\n    \"includePosts\": {\n      \"title\": \"📰 Add the latest posts and articles\",\n      \"type\": \"boolean\",\n      \"default\": false,\n      \"description\": \"The person's recent posts (usually 5–9) and articles (up to 10) inside the same row. No extra charge.\",\n      \"sectionCaption\": \"What to put in the row\"\n    },\n    \"maxItems\": {\n      \"title\": \"Maximum profiles per run\",\n      \"type\": \"integer\",\n      \"default\": 10000,\n      \"minimum\": 1,\n      \"description\": \"A hard ceiling on what one run reads and bills.\",\n      \"sectionCaption\": \"Advanced\"\n    },\n    \"concurrency\": {\n      \"title\": \"Parallel pages\",\n      \"type\": \"integer\",\n      \"default\": 3,\n      \"minimum\": 1,\n      \"maximum\": 10,\n      \"description\": \"How many LinkedIn pages to read at the same time. Keep it low — LinkedIn dislikes bursts.\"\n    },\n    \"proxyConfiguration\": {\n      \"title\": \"Proxy configuration\",\n      \"type\": \"object\",\n      \"editor\": \"proxy\",\n      \"default\": {\n        \"useApifyProxy\": true,\n        \"apifyProxyGroups\": [\n          \"RESIDENTIAL\"\n        ]\n      },\n      \"prefill\": {\n        \"useApifyProxy\": true,\n        \"apifyProxyGroups\": [\n          \"RESIDENTIAL\"\n        ]\n      },\n      \"description\": \"Residential, a new address for every profile — included in the price, nothing to set up. LinkedIn blocks direct and datacenter requests after a few dozen profiles, so those settings are ignored. Only your own proxy URLs replace it.\",\n      \"sectionCaption\": \"Advanced\"\n    }\n  },\n  \"required\": []\n}",
    "readme": "**LinkedIn Profile Scraper — No Cookies** turns LinkedIn profile URLs into clean rows: **name, headline, current title and company, location, about, followers, connections, the full experience history with dates, education, certifications, volunteering, publications, skills, recommendations, website** and, if you want, the person's **latest posts and articles**.\n\n**$0.002 per profile** ($0.003 from 15 October 2026). No login, no cookies, no LinkedIn account to get restricted, no start fee. Profiles that do not exist or are private are free.\n\n## Tested head-to-head — 26 September 2026\n\n![LinkedIn profile scrapers tested on five public profiles: this Actor returned all five at $2 per 1,000, half the price of the others](https://raw.githubusercontent.com/lergassy/apify-actor-assets/main/benchmarks/liprof-tested-2026-09-26.png)\n\nSame five public profiles for every Actor, run through the four most-used LinkedIn profile Actors on the\nApify Store from an ordinary account.\n\n| | This Actor | The four others |\n|---|---|---|\n| Profiles returned (5 asked) | **5** | 5, 5, 1 — and one would not start without full access to your Apify account |\n| Price per 1,000 profiles | **$2** | $4–$10 |\n| Certifications, volunteering, publications, skills and recommendations | **Yes**, whatever the public profile shows | All of them at 1 of the 3 that ran |\n| No LinkedIn login or cookies | **Yes** | Yes |\n\n## Tested head-to-head — 5 October 2026\n\n![Tested against the 4 most-used LinkedIn profile scrapers: degrees, similar profiles and a lower price per profile](https://raw.githubusercontent.com/lergassy/apify-actor-assets/main/benchmarks/linkedinprofile-tested-2026-10-05.png)\n\nThree public profiles (Bill Gates, Satya Nadella, Reid Hoffman) went to this Actor and to the four most-used LinkedIn profile scrapers on the Apify Store, from an ordinary free account. Follower counts matched exactly wherever both returned them.\n\n| | This Actor | The others |\n|---|---|---|\n| Price per 1,000 profiles | **$3.00** | $4 – $10 |\n| Similar profiles per profile | **10 – 20** | 0 – 20 |\n| Profiles per run | **any number** | 1 – any; 2 of 4 did not run on a free account |\n\n## What is LinkedIn Profile Scraper?\n\nA people-enrichment tool for recruiting, sales and research. It reads the **public profile page** — the version LinkedIn shows search engines and logged-out visitors — and returns it as structured data. Nothing is logged in, so there is no session cookie to paste and no account at risk. Paste one URL or a hundred thousand; call it from the console, the API, a spreadsheet, n8n, Make, Zapier or an AI agent.\n\n## What is in every row\n\n| Field | Meaning |\n|---|---|\n| `fullName`, `firstName`, `lastName`, `headline` | Identity as shown on the profile |\n| `title`, `company`, `companyLinkedinUrl`, `currentPositions` | Current role(s) with the company page |\n| `location`, `country`, `about`, `website` | Location, about text, website from the profile |\n| `city`, `region`, `countryCode` | The location split into parts: `Redmond` / `Washington` / `US`. City and region stay empty when LinkedIn shows only a country or a metro area (\"San Francisco Bay Area\") |\n| `followers`, `connections`, `badges` | Follower count, \"500+\" connections, Creator / Top Voice |\n| `experience` | Every role in the Experience section — including each role inside a company group (several roles at one company): title, company, company URL, `companyLogo`, `location`, `employmentType` (when the page shows it), start, end, current flag, duration, full description |\n| `currentPositions` | Current roles with company URL, `companyLogo`, location, start |\n| `education` | Every school with `degree` and `fieldOfStudy` (\"Master's Degree\", \"Computer Science\"), `activities`, `grade`, `description`, `schoolLogo`, start and end |\n| `certifications`, `volunteering`, `publications`, `honorsAndAwards`, `organizations` | Every such section the public profile shows — names, issuers or organizations, dates, links, descriptions; certifications also carry `credentialId`, `issuerLinkedinUrl` and `logoUrl` |\n| `languages`, `languageProficiencies` | Languages, and each with its proficiency (\"Native or bilingual proficiency\") |\n| `courses`, `projects`, `testScores` | Courses (name and number), projects (title, link, dates, description) and test scores the person lists |\n| `coursesTaught` | LinkedIn Learning courses the person teaches: title, link, image, duration, viewers |\n| `skills`, `recommendations` | Listed skills, and recommendations received (who wrote it, their profile, the text) |\n| `imageUrl`, `coverImageUrl` | Profile photo and cover (background) image |\n| `memberId`, `profileUrn` | LinkedIn member id and URN from the page (`1213`, `urn:li:member:1213`) |\n| `similarProfiles` | \"Other similar profiles\" (LinkedIn's \"People also viewed\" rail as logged-out visitors see it, usually 10–20): name, headline as the card shows it (usually the current company), location, followers, profile URL, photo |\n| `sameNameProfiles` | \"Others named …\" — other people with the same name, when LinkedIn shows that rail: name, location, profile URL, photo |\n| `latestPosts`, `articles` | With **Add the latest posts and articles** on: 5–9 recent posts (text, date, likes, link) and up to 10 articles |\n\nEvery field is present in every row; a section the profile does not show comes back as an empty list or `null`.\n\n**What a logged-out visitor cannot see** — and so this Actor does not return, because it never logs in: the exact number of connections (LinkedIn shows \"500+\"), the Featured section, interests, \"open to work\" / \"hiring\" flags, and on some long careers the oldest roles (Reid Hoffman's public page shows 13 of his 20 roles). We do not make these up.\n\n## How much does it cost?\n\n**$0.002 per profile** — one row, one charge. From **15 October 2026** the price is **$0.003 per profile** (lower on Apify's higher discount tiers).\n\n- Profiles that do not exist, are private or are refused after retries: **$0**. Input values that are not profile URLs: **$0** (an error row says why).\n- Experience (every role, with company logos), education with degree and field of study, certifications, languages, courses, projects, test scores, volunteering, publications, skills, recommendations, posts and articles: included.\n\n### Bulk export: what 50,000 rows actually cost\n\nThis Actor is built for bulk jobs — paste a whole candidate or lead list into one run, or refresh\nrecords on a schedule. There is **no fee per run, no fee per page and no proxy charge**: you pay for\nthe profile rows you keep, and error rows are free.\n\n| Job | This Actor | Most-used Actor in this category |\n|---|---|---|\n| 50,000 profiles across 100 runs | **$100** ($150 from 15 October 2026) | $200 |\n\nChecked on the Apify Store on 23 September 2026 against the Actor with the most monthly users in\nthis category ($0.004 per profile). Some Actors here ask less per row — this table compares against\nthe one buyers actually use most.\n\n### Hidden profiles\n\nEvery profile is read through a residential address, a new one for each profile, included in the price.\nAbout one profile in five (more on lists of ordinary employees) is not shown to logged-out visitors on\nthat route — LinkedIn answers HTTP 999 or a login wall for it. Those hidden profiles are opened through\na second route: a web unblocker first, and a heavier unblocking service for the ones it cannot open.\nThe second route is included in the price and paid from the run's own margin, so on a very long list\nof almost only hidden profiles some may not get it. This Actor never logs in: a profile that still\ndoes not open comes back as an error row that says so and costs nothing. If you put your own proxy URLs\nin the proxy field, they are used for every profile and the second route is off. A value that is not a\nprofile URL or slug (say, `not a url`) also comes back as a free error row that says so, instead of being skipped. Sales Navigator and\nRecruiter links (`linkedin.com/sales/lead/ACwAA…`) carry an internal ID that LinkedIn opens only for a\nlogged-in user, so they come back as free error rows telling you to paste the public `linkedin.com/in/<name>`\nURL instead (in Sales Navigator: lead page → ⋯ → View LinkedIn profile). Need the person's work\ne-mail too? Use [LinkedIn Profile Scraper with Email](https://apify.com/lergassy/linkedin-profile-email-scraper).\n\n### Run health\n\nWhen a run ends with many error rows, the Actor sends its developer the counts (rows delivered, error\ntypes, run ID) so the cause gets fixed fast. Your input and your results are never sent.\n\n### Very long lists\n\nLinkedIn rate-limits public profile pages. When most of the last 30 profiles in a run are refused\nby rate limits, the rest of the list goes straight to the second route (with your own proxies: the run\npauses for 90 seconds, and after two pauses stops instead of grinding through the rest). A run that gets\nwithin 30 seconds of its timeout stops taking new profiles the same way. Refused profiles stay free, and\nthe URLs that were never tried are saved in the run's key-value store as `NOT_ATTEMPTED` — start a new\nrun with them later.\n\n## How to use it in three steps\n\n1. Paste LinkedIn profile URLs or slugs into **👤 Profiles** — `https://www.linkedin.com/in/satyanadella` or `satyanadella` — or link a Google Sheet.\n2. Turn on **📰 Add the latest posts and articles** if you want recent activity in the row.\n3. Press **Start**, then download JSON, CSV or Excel — or call it from the API, n8n, Make, Zapier or an AI agent.\n\n## ⬇️ Input\n\n```json\n{\n  \"profileUrls\": [\"https://www.linkedin.com/in/satyanadella\", \"jeffweiner08\", \"justinwelsh\"],\n  \"includePosts\": false\n}\n```\n\n## ⬆️ Output\n\n```json\n{\n  \"type\": \"profile\",\n  \"fullName\": \"Satya Nadella\",\n  \"firstName\": \"Satya\",\n  \"lastName\": \"Nadella\",\n  \"headline\": \"Chairman and CEO at Microsoft\",\n  \"title\": \"Chairman and CEO\",\n  \"company\": \"Microsoft\",\n  \"companyLinkedinUrl\": \"https://www.linkedin.com/company/microsoft\",\n  \"location\": \"Redmond, Washington, United States\",\n  \"country\": \"US\",\n  \"city\": \"Redmond\",\n  \"region\": \"Washington\",\n  \"countryCode\": \"US\",\n  \"followers\": 12203128,\n  \"connections\": \"500+\",\n  \"badges\": \"Creator, Top Voice\",\n  \"experience\": [\n    { \"title\": \"Chairman and CEO\", \"company\": \"Microsoft\", \"companyLinkedinUrl\": \"https://www.linkedin.com/company/microsoft\", \"startDate\": \"Feb 2014\", \"endDate\": null, \"current\": true, \"duration\": \"12 years 9 months\", \"description\": null, \"companyLogo\": \"https://media.licdn.com/dms/image/v2/D560BAQH32RJQCl3dDQ/company-logo_100_100/…\", \"location\": \"Greater Seattle Area\", \"employmentType\": null },\n    { \"title\": \"Board Member\", \"company\": \"Starbucks\", \"companyLinkedinUrl\": \"https://www.linkedin.com/company/starbucks\", \"startDate\": \"2017\", \"endDate\": \"2024\", \"current\": false, \"duration\": \"7 years\", \"description\": null, \"companyLogo\": \"https://media.licdn.com/dms/image/v2/C4D0BAQEQxk9y2rk7Hw/company-logo_100_100/…\", \"location\": null, \"employmentType\": null }\n  ],\n  \"education\": [\n    { \"school\": \"The University of Chicago Booth School of Business\", \"startDate\": \"1994\", \"endDate\": \"1996\", \"degree\": null, \"fieldOfStudy\": null },\n    { \"school\": \"University of Wisconsin-Milwaukee\", \"startDate\": null, \"endDate\": null, \"degree\": \"Master’s Degree\", \"fieldOfStudy\": \"Computer Science\" }\n  ],\n  \"languageProficiencies\": [],\n  \"coverImageUrl\": \"https://media.licdn.com/dms/image/v2/D5616AQFVwYcBLAcPqQ/profile-displaybackgroundimage-shrink_200_800/…\",\n  \"memberId\": \"19186432\",\n  \"profileUrn\": \"urn:li:member:19186432\",\n  \"similarProfiles\": [\n    { \"name\": \"Tony Bates\", \"headline\": \"Genesys\", \"location\": \"San Francisco Bay Area\", \"followers\": 18000, \"linkedinUrl\": \"https://www.linkedin.com/in/tony-bates-679227a5\", \"imageUrl\": \"https://media.licdn.com/dms/image/v2/…\" }\n  ],\n  \"sameNameProfiles\": [],\n  \"linkedinUrl\": \"https://www.linkedin.com/in/satyanadella\",\n  \"scrapedAt\": \"2026-09-23T12:04:11.004Z\"\n}\n```\n\n## Use cases\n\n### Recruiting\nCurrent role, tenure and the full career path for every candidate on a shortlist — no seat licence, no account ban risk.\n\n### Sales enrichment\nTitle and company for every contact in a CRM, refreshed on a schedule so job changes show up. Pair with our **LinkedIn Email Finder** for the work address.\n\n### Research and influencer analysis\nFollowers, Creator badges and recent posts with likes for a list of voices in your market.\n\n### AI agents\nThrough the Apify MCP server an agent can ask *\"what is this person's current role and background?\"* and get a row back.\n\n## Integrations\n\nEvery run is available through the Apify API, and the Actor works out of the box with n8n, Make, Zapier, Google Sheets, LangChain and the Apify MCP server.\n\n## FAQ\n\n**Do I need cookies or a LinkedIn account?** No. That is the point of this Actor: it reads public profiles only, so nothing can be restricted.\n\n**Why are some fields empty?** LinkedIn hides parts of some profiles from logged-out visitors. The Actor delivers what the public profile shows and never invents the rest.\n\n**Does it return e-mails or phone numbers?** No — public profiles do not show them. For a work e-mail, use **LinkedIn Email Finder**.\n\n**Is this legal?** The Actor reads profiles that people have made public. The rows are personal data: under GDPR, CCPA and similar laws you need a lawful basis to process them, must respect opt-outs, and must follow LinkedIn's terms. Use it for legitimate business purposes only.\n",
    "changelog": "# Changelog\n\n## 2026-10-09\n- Internal: cost-safety switches for the paid routes; run-health module updated (reports reliably when a run ends).\n\n## 2026-10-05 (2)\n- New fields `similarProfiles` (\"Other similar profiles\" — LinkedIn's \"People also viewed\" rail as logged-out visitors see it, usually 10–20 people with name, headline, location, followers, URL and photo) and `sameNameProfiles` (\"Others named …\", when shown). Same page, no extra request or charge.\n\n## 2026-10-05\n- Experience now lists every role, including each role inside a company group (several roles at one company were missing before — e.g. 24 roles instead of 11 on a long career). Each role gains `companyLogo`, `location` and `employmentType` (when shown); descriptions are the full text instead of a cut \"… Show more\".\n- Education lists every school on the page (some were missing) with `degree`, `fieldOfStudy`, `activities`, `grade`, `description` and `schoolLogo`.\n- New fields: `city`, `region`, `countryCode`, `coverImageUrl`, `memberId`, `profileUrn`, `languageProficiencies`, `courses`, `projects`, `testScores`, `coursesTaught`; certifications gain `credentialId`, `issuerLinkedinUrl`, `logoUrl`; current positions gain `companyLogo`.\n- An input value that is not a profile URL now gets a free error row instead of being skipped silently.\n\n## 2026-10-03\n- Profiles hidden from logged-out visitors are opened again, through a second route (a web unblocker first, a heavier unblocking service last). Profiles that still do not open remain free error rows.\n- Runs stop taking new profiles shortly before their timeout and list the rest in `NOT_ATTEMPTED`.\n\n## 2026-10-02\n- Profiles LinkedIn hides from logged-out visitors come back as free error rows that say so.\n- Default memory tuned to measured usage.\n\n## 2026-10-01\n- Every profile is read through a fresh address, so long lists are refused far less often.\n- If LinkedIn starts refusing many profiles in a row, the run pauses and retries before stopping; profiles not reached are saved in a NOT_ATTEMPTED record and not charged.\n- Refused profiles (HTTP 999) are no longer retried, so runs finish sooner.\n- `website` now holds only the person's own external website, never a LinkedIn link.\n- Fixed runs with a maximum cost stopping before the limit was actually reached.\n\n## 2026-09-29\n- Clearer input field descriptions and examples.\n\n## 2026-09-27\n- Runs stop cleanly at your maximum cost instead of being aborted; nothing beyond your limit is written or charged.\n\n## 2026-09-26\n- New fields: certifications, volunteering, publications, honors, organizations, skills and recommendations, whenever the public profile shows them.\n\n## 2026-09-23\n- Initial release: LinkedIn profile URLs to clean rows with name, headline, current title and company, location, about, followers, connections, experience with dates and education, with no login or cookies.\n",
    "gitCommitId": "2cf56e59ad2d343911faa4966964dbdf86fe722e",
    "gitBranchName": "main",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "linkedin-profile-scraper",
      "title": "LinkedIn Profile Scraper — No Cookies",
      "description": "LinkedIn profile data without login or cookies: name, headline, current title and company, location, about, followers, connections, full experience with dates, education, website, latest posts. One row per profile, one charge each; missing profiles are free. No account at risk.",
      "version": "0.1",
      "maxMemoryMbytes": 2048,
      "defaultMemoryMbytes": "256",
      "dockerfile": "./Dockerfile",
      "input": {
        "title": "LinkedIn Profile Scraper — No Cookies input",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "profileUrls": {
            "title": "👤 Profiles",
            "type": "array",
            "editor": "stringList",
            "description": "LinkedIn profile URLs or slugs, one per line — <b>https://www.linkedin.com/in/satyanadella</b> or <b>satyanadella</b>. One row and one charge per profile; profiles that do not exist or are private are free. Sales Navigator / Recruiter links (<b>linkedin.com/sales/lead/…</b>) open only with a login — paste the public <b>/in/</b> URL instead.",
            "prefill": [
              "https://www.linkedin.com/in/satyanadella",
              "https://www.linkedin.com/in/jeffweiner08",
              "justinwelsh"
            ]
          },
          "startUrls": {
            "title": "🔗 Profiles from a file or sheet",
            "type": "array",
            "editor": "requestListSources",
            "default": [],
            "description": "The same thing for long lists — upload a file or link a Google Sheet of profile URLs."
          },
          "includePosts": {
            "title": "📰 Add the latest posts and articles",
            "type": "boolean",
            "default": false,
            "description": "The person's recent posts (usually 5–9) and articles (up to 10) inside the same row. No extra charge.",
            "sectionCaption": "What to put in the row"
          },
          "maxItems": {
            "title": "Maximum profiles per run",
            "type": "integer",
            "default": 10000,
            "minimum": 1,
            "description": "A hard ceiling on what one run reads and bills.",
            "sectionCaption": "Advanced"
          },
          "concurrency": {
            "title": "Parallel pages",
            "type": "integer",
            "default": 3,
            "minimum": 1,
            "maximum": 10,
            "description": "How many LinkedIn pages to read at the same time. Keep it low — LinkedIn dislikes bursts."
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "editor": "proxy",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            },
            "prefill": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            },
            "description": "Residential, a new address for every profile — included in the price, nothing to set up. LinkedIn blocks direct and datacenter requests after a few dozen profiles, so those settings are ignored. Only your own proxy URLs replace it.",
            "sectionCaption": "Advanced"
          }
        },
        "required": []
      },
      "output": {
        "$schema": "https://apify-projects.github.io/actor-json-schemas/output.json",
        "actorOutputSchemaVersion": 1,
        "title": "Output of LinkedIn Profile Scraper — No Cookies",
        "properties": {
          "results": {
            "type": "string",
            "title": "Profiles (JSON)",
            "description": "One row per profile: current role, experience, education, followers, optional posts.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          },
          "runSummary": {
            "type": "string",
            "title": "Run summary (JSON)",
            "description": "JSON summary of the run: rows delivered, rows filtered out, failed inputs (free) and request statistics.",
            "template": "{{links.apiDefaultKeyValueStoreUrl}}/records/SUMMARY"
          },
          "notAttempted": {
            "type": "string",
            "title": "Inputs not attempted (JSON)",
            "description": "JSON list of inputs the run did not reach (time limit or \"Max cost per run\"). Not charged — pass them as input to a new run to continue. Present only when the run stopped early.",
            "template": "{{links.apiDefaultKeyValueStoreUrl}}/records/NOT_ATTEMPTED"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "fields": {
            "type": "object",
            "properties": {
              "type": {
                "type": [
                  "string",
                  "null"
                ],
                "nullable": true,
                "description": "profile or error"
              },
              "fullName": {
                "type": [
                  "string",
                  "null"
                ],
                "nullable": true,
                "description": "Name"
              },
              "firstName": {
                "type": [
                  "string",
                  "null"
                ],
                "nullable": true,
                "description": "First name"
              },
              "lastName": {
                "type": [
                  "string",
                  "null"
                ],
                "nullable": true,
                "description": "Last name"
              },
              "headline": {
                "type": [
                  "string",
                  "null"
                ],
                "nullable": true,
                "description": "Headline"
              },
              "title": {
                "type": [
                  "string",
                  "null"
                ],
                "nullable": true,
                "description": "Current title"
              },
              "company": {
                "type": [
                  "string",
                  "null"
                ],
                "nullable": true,
                "description": "Current company"
              },
              "companyLinkedinUrl": {
                "type": [
                  "string",
                  "null"
                ],
                "nullable": true,
                "description": "Current company page"
              },
              "location": {
                "type": [
                  "string",
                  "null"
                ],
                "nullable": true,
                "description": "Location"
              },
              "country": {
                "type": [
                  "string",
                  "null"
                ],
                "nullable": true,
                "description": "Country code"
              },
              "city": {
                "type": [
                  "string",
                  "null"
                ],
                "nullable": true,
                "description": "City parsed from the profile location ('Redmond, Washington, United States' → Redmond). Null when LinkedIn shows only a country, a region or a metro area such as 'San Francisco Bay Area'.",
                "example": "Redmond"
              },
              "region": {
                "type": [
                  "string",
                  "null"
                ],
                "nullable": true,
                "description": "State / region parsed from the profile location.",
                "example": "Washington"
              },
              "countryCode": {
                "type": [
                  "string",
                  "null"
                ],
                "nullable": true,
                "description": "ISO 3166 two-letter country code of the profile location.",
                "example": "US"
              },
              "about": {
                "type": [
                  "string",
                  "null"
                ],
                "nullable": true,
                "description": "About"
              },
              "followers": {
                "type": [
                  "number",
                  "null"
                ],
                "nullable": true,
                "description": "Followers"
              },
              "connections": {
                "type": [
                  "string",
                  "null"
                ],
                "nullable": true,
                "description": "Connections as shown (e.g. 500+)"
              },
              "badges": {
                "type": [
                  "string",
                  "null"
                ],
                "nullable": true,
                "description": "Creator / Top Voice badges"
              },
              "website": {
                "type": [
                  "string",
                  "null"
                ],
                "nullable": true,
                "description": "Website on the profile"
              },
              "experience": {
                "type": [
                  "array",
                  "null"
                ],
                "nullable": true,
                "description": "Every role in the Experience section, including each role inside a company group: title, company, companyLinkedinUrl, companyLogo, location, employmentType (only when the page shows it), startDate, endDate, current, duration, description. Logged-out visitors see at most the roles LinkedIn shows on the public page."
              },
              "currentPositions": {
                "type": [
                  "array",
                  "null"
                ],
                "nullable": true,
                "description": "Current positions: company, companyLinkedinUrl, companyLogo, title, location, employmentType, startDate, endDate, current."
              },
              "education": {
                "type": [
                  "array",
                  "null"
                ],
                "nullable": true,
                "description": "Every school in the Education section: school, schoolLinkedinUrl, schoolLogo, degree, fieldOfStudy, grade, activities, description, startDate, endDate."
              },
              "languages": {
                "type": [
                  "array",
                  "null"
                ],
                "nullable": true,
                "description": "Language names (see languageProficiencies for the proficiency)."
              },
              "awards": {
                "type": [
                  "array",
                  "null"
                ],
                "nullable": true,
                "description": "Awards"
              },
              "certifications": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Licenses and certifications: name, issuer, issuedAt, expiresAt, url, credentialId, issuerLinkedinUrl, logoUrl."
              },
              "volunteering": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Volunteer roles: role, organization, dates, description."
              },
              "publications": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Publications: title, publisher, date, link, description."
              },
              "honorsAndAwards": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Honors and awards: title, issuer, date, description."
              },
              "organizations": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Organizations: name, role, startDate, endDate, current, description."
              },
              "skills": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Skills listed on the public profile."
              },
              "recommendations": {
                "type": [
                  "array",
                  "null"
                ],
                "description": "Recommendations received: who wrote it, their profile link, the text."
              },
              "languageProficiencies": {
                "type": [
                  "array",
                  "null"
                ],
                "nullable": true,
                "description": "Languages with the proficiency the person states: [{name, proficiency}]. Empty when the profile shows no Languages section.",
                "example": [
                  {
                    "name": "English",
                    "proficiency": "Native or bilingual proficiency"
                  }
                ]
              },
              "courses": {
                "type": [
                  "array",
                  "null"
                ],
                "nullable": true,
                "description": "Courses the person lists (Courses section): [{name, number}].",
                "example": [
                  {
                    "name": "Business Finance",
                    "number": "BUS M 520"
                  }
                ]
              },
              "projects": {
                "type": [
                  "array",
                  "null"
                ],
                "nullable": true,
                "description": "Projects section: [{title, url, startDate, endDate, current, description}].",
                "example": [
                  {
                    "title": "Spend My Cents",
                    "url": "http://www.spendmycents.com/",
                    "startDate": "May 2013",
                    "endDate": null,
                    "current": false,
                    "description": "A reverse product search engine…"
                  }
                ]
              },
              "testScores": {
                "type": [
                  "array",
                  "null"
                ],
                "nullable": true,
                "description": "Test scores section: [{name, score, date, description}].",
                "example": [
                  {
                    "name": "GMAT",
                    "score": "590",
                    "date": "Aug 2011",
                    "description": null
                  }
                ]
              },
              "coursesTaught": {
                "type": [
                  "array",
                  "null"
                ],
                "nullable": true,
                "description": "LinkedIn Learning courses the person teaches ('Courses by …'): [{title, url, imageUrl, duration, viewers}].",
                "example": [
                  {
                    "title": "How to Use Generative AI: Building an AI-First Mindset",
                    "url": "https://www.linkedin.com/learning/how-to-use-generative-ai-building-an-ai-first-mindset",
                    "imageUrl": "https://media.licdn.com/dms/image/v2/…",
                    "duration": "48m",
                    "viewers": 414851
                  }
                ]
              },
              "imageUrl": {
                "type": [
                  "string",
                  "null"
                ],
                "nullable": true,
                "description": "Photo"
              },
              "coverImageUrl": {
                "type": [
                  "string",
                  "null"
                ],
                "nullable": true,
                "description": "Profile cover (background) image URL.",
                "example": "https://media.licdn.com/dms/image/v2/D4D16AQ…/profile-displaybackgroundimage-shrink_200_800/…"
              },
              "memberId": {
                "type": [
                  "string",
                  "null"
                ],
                "nullable": true,
                "description": "LinkedIn member id shown on the public page (the number in urn:li:member:…). Null when the page does not carry it.",
                "example": "1213"
              },
              "profileUrn": {
                "type": [
                  "string",
                  "null"
                ],
                "nullable": true,
                "description": "LinkedIn member URN of the profile.",
                "example": "urn:li:member:1213"
              },
              "similarProfiles": {
                "type": [
                  "array",
                  "null"
                ],
                "nullable": true,
                "description": "\"Other similar profiles\" from the side rail of the public profile (LinkedIn's \"People also viewed\" list as logged-out visitors see it, usually 10–20): [{name, headline, location, followers, linkedinUrl, imageUrl}]. headline is what the card shows — usually the person's current company. [] when the page has no such rail.",
                "example": [
                  {
                    "name": "Melinda French Gates",
                    "headline": "Pivotal",
                    "location": "United States",
                    "followers": 7000000,
                    "linkedinUrl": "https://www.linkedin.com/in/melindagates",
                    "imageUrl": "https://media.licdn.com/dms/image/v2/…"
                  }
                ]
              },
              "sameNameProfiles": {
                "type": [
                  "array",
                  "null"
                ],
                "nullable": true,
                "description": "\"Others named <name>\" from the side rail, when LinkedIn shows it (only for some names): [{name, headline, location, followers, linkedinUrl, imageUrl}] — other people with the same name; headline and followers are usually null.",
                "example": [
                  {
                    "name": "Reid Hoffman",
                    "headline": null,
                    "location": "Florence, KY",
                    "followers": null,
                    "linkedinUrl": "https://www.linkedin.com/in/reid-hoffman-7143a718a",
                    "imageUrl": "https://media.licdn.com/dms/image/v2/…"
                  }
                ]
              },
              "linkedinUrl": {
                "type": [
                  "string",
                  "null"
                ],
                "nullable": true,
                "description": "Profile URL"
              },
              "slug": {
                "type": [
                  "string",
                  "null"
                ],
                "nullable": true,
                "description": "Profile slug"
              },
              "latestPosts": {
                "type": [
                  "array",
                  "null"
                ],
                "nullable": true,
                "description": "Recent posts (optional)"
              },
              "articles": {
                "type": [
                  "array",
                  "null"
                ],
                "nullable": true,
                "description": "Articles (optional)"
              },
              "error": {
                "type": [
                  "string",
                  "null"
                ],
                "nullable": true,
                "description": "Why the profile could not be read"
              },
              "input": {
                "type": [
                  "string",
                  "null"
                ],
                "nullable": true,
                "description": "Error rows only: the input value that could not be used.",
                "example": "not a url"
              },
              "scrapedAt": {
                "type": [
                  "string",
                  "null"
                ],
                "nullable": true,
                "description": "When the row was made"
              }
            }
          },
          "views": {
            "profiles": {
              "title": "Profiles",
              "transformation": {
                "fields": [
                  "fullName",
                  "title",
                  "company",
                  "location",
                  "followers",
                  "connections",
                  "headline",
                  "linkedinUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "fullName": {
                    "label": "Name"
                  },
                  "title": {
                    "label": "Title"
                  },
                  "company": {
                    "label": "Company"
                  },
                  "location": {
                    "label": "Location"
                  },
                  "followers": {
                    "label": "Followers",
                    "format": "number"
                  },
                  "connections": {
                    "label": "Connections"
                  },
                  "headline": {
                    "label": "Headline"
                  },
                  "linkedinUrl": {
                    "label": "LinkedIn",
                    "format": "link"
                  }
                }
              }
            }
          }
        },
        "keyValueStore": {
          "actorKeyValueStoreSchemaVersion": 1,
          "title": "Run records of LinkedIn Profile Scraper — No Cookies",
          "description": "Records the Actor saves next to its dataset: a JSON run summary and, when the run stops early, the inputs it did not reach.",
          "collections": {
            "runSummary": {
              "title": "Run summary",
              "description": "JSON summary of the run: rows delivered, rows filtered out, failed inputs (free) and request statistics.",
              "key": "SUMMARY"
            },
            "notAttempted": {
              "title": "Inputs not attempted",
              "description": "JSON list of inputs the run did not reach (time limit or \"Max cost per run\"). Not charged — pass them as input to a new run to continue.",
              "key": "NOT_ATTEMPTED"
            }
          }
        }
      },
      "readme": "**LinkedIn Profile Scraper — No Cookies** turns LinkedIn profile URLs into clean rows: **name, headline, current title and company, location, about, followers, connections, the full experience history with dates, education, certifications, volunteering, publications, skills, recommendations, website** and, if you want, the person's **latest posts and articles**.\n\n**$0.002 per profile** ($0.003 from 15 October 2026). No login, no cookies, no LinkedIn account to get restricted, no start fee. Profiles that do not exist or are private are free.\n\n## Tested head-to-head — 26 September 2026\n\n![LinkedIn profile scrapers tested on five public profiles: this Actor returned all five at $2 per 1,000, half the price of the others](https://raw.githubusercontent.com/lergassy/apify-actor-assets/main/benchmarks/liprof-tested-2026-09-26.png)\n\nSame five public profiles for every Actor, run through the four most-used LinkedIn profile Actors on the\nApify Store from an ordinary account.\n\n| | This Actor | The four others |\n|---|---|---|\n| Profiles returned (5 asked) | **5** | 5, 5, 1 — and one would not start without full access to your Apify account |\n| Price per 1,000 profiles | **$2** | $4–$10 |\n| Certifications, volunteering, publications, skills and recommendations | **Yes**, whatever the public profile shows | All of them at 1 of the 3 that ran |\n| No LinkedIn login or cookies | **Yes** | Yes |\n\n## Tested head-to-head — 5 October 2026\n\n![Tested against the 4 most-used LinkedIn profile scrapers: degrees, similar profiles and a lower price per profile](https://raw.githubusercontent.com/lergassy/apify-actor-assets/main/benchmarks/linkedinprofile-tested-2026-10-05.png)\n\nThree public profiles (Bill Gates, Satya Nadella, Reid Hoffman) went to this Actor and to the four most-used LinkedIn profile scrapers on the Apify Store, from an ordinary free account. Follower counts matched exactly wherever both returned them.\n\n| | This Actor | The others |\n|---|---|---|\n| Price per 1,000 profiles | **$3.00** | $4 – $10 |\n| Similar profiles per profile | **10 – 20** | 0 – 20 |\n| Profiles per run | **any number** | 1 – any; 2 of 4 did not run on a free account |\n\n## What is LinkedIn Profile Scraper?\n\nA people-enrichment tool for recruiting, sales and research. It reads the **public profile page** — the version LinkedIn shows search engines and logged-out visitors — and returns it as structured data. Nothing is logged in, so there is no session cookie to paste and no account at risk. Paste one URL or a hundred thousand; call it from the console, the API, a spreadsheet, n8n, Make, Zapier or an AI agent.\n\n## What is in every row\n\n| Field | Meaning |\n|---|---|\n| `fullName`, `firstName`, `lastName`, `headline` | Identity as shown on the profile |\n| `title`, `company`, `companyLinkedinUrl`, `currentPositions` | Current role(s) with the company page |\n| `location`, `country`, `about`, `website` | Location, about text, website from the profile |\n| `city`, `region`, `countryCode` | The location split into parts: `Redmond` / `Washington` / `US`. City and region stay empty when LinkedIn shows only a country or a metro area (\"San Francisco Bay Area\") |\n| `followers`, `connections`, `badges` | Follower count, \"500+\" connections, Creator / Top Voice |\n| `experience` | Every role in the Experience section — including each role inside a company group (several roles at one company): title, company, company URL, `companyLogo`, `location`, `employmentType` (when the page shows it), start, end, current flag, duration, full description |\n| `currentPositions` | Current roles with company URL, `companyLogo`, location, start |\n| `education` | Every school with `degree` and `fieldOfStudy` (\"Master's Degree\", \"Computer Science\"), `activities`, `grade`, `description`, `schoolLogo`, start and end |\n| `certifications`, `volunteering`, `publications`, `honorsAndAwards`, `organizations` | Every such section the public profile shows — names, issuers or organizations, dates, links, descriptions; certifications also carry `credentialId`, `issuerLinkedinUrl` and `logoUrl` |\n| `languages`, `languageProficiencies` | Languages, and each with its proficiency (\"Native or bilingual proficiency\") |\n| `courses`, `projects`, `testScores` | Courses (name and number), projects (title, link, dates, description) and test scores the person lists |\n| `coursesTaught` | LinkedIn Learning courses the person teaches: title, link, image, duration, viewers |\n| `skills`, `recommendations` | Listed skills, and recommendations received (who wrote it, their profile, the text) |\n| `imageUrl`, `coverImageUrl` | Profile photo and cover (background) image |\n| `memberId`, `profileUrn` | LinkedIn member id and URN from the page (`1213`, `urn:li:member:1213`) |\n| `similarProfiles` | \"Other similar profiles\" (LinkedIn's \"People also viewed\" rail as logged-out visitors see it, usually 10–20): name, headline as the card shows it (usually the current company), location, followers, profile URL, photo |\n| `sameNameProfiles` | \"Others named …\" — other people with the same name, when LinkedIn shows that rail: name, location, profile URL, photo |\n| `latestPosts`, `articles` | With **Add the latest posts and articles** on: 5–9 recent posts (text, date, likes, link) and up to 10 articles |\n\nEvery field is present in every row; a section the profile does not show comes back as an empty list or `null`.\n\n**What a logged-out visitor cannot see** — and so this Actor does not return, because it never logs in: the exact number of connections (LinkedIn shows \"500+\"), the Featured section, interests, \"open to work\" / \"hiring\" flags, and on some long careers the oldest roles (Reid Hoffman's public page shows 13 of his 20 roles). We do not make these up.\n\n## How much does it cost?\n\n**$0.002 per profile** — one row, one charge. From **15 October 2026** the price is **$0.003 per profile** (lower on Apify's higher discount tiers).\n\n- Profiles that do not exist, are private or are refused after retries: **$0**. Input values that are not profile URLs: **$0** (an error row says why).\n- Experience (every role, with company logos), education with degree and field of study, certifications, languages, courses, projects, test scores, volunteering, publications, skills, recommendations, posts and articles: included.\n\n### Bulk export: what 50,000 rows actually cost\n\nThis Actor is built for bulk jobs — paste a whole candidate or lead list into one run, or refresh\nrecords on a schedule. There is **no fee per run, no fee per page and no proxy charge**: you pay for\nthe profile rows you keep, and error rows are free.\n\n| Job | This Actor | Most-used Actor in this category |\n|---|---|---|\n| 50,000 profiles across 100 runs | **$100** ($150 from 15 October 2026) | $200 |\n\nChecked on the Apify Store on 23 September 2026 against the Actor with the most monthly users in\nthis category ($0.004 per profile). Some Actors here ask less per row — this table compares against\nthe one buyers actually use most.\n\n### Hidden profiles\n\nEvery profile is read through a residential address, a new one for each profile, included in the price.\nAbout one profile in five (more on lists of ordinary employees) is not shown to logged-out visitors on\nthat route — LinkedIn answers HTTP 999 or a login wall for it. Those hidden profiles are opened through\na second route: a web unblocker first, and a heavier unblocking service for the ones it cannot open.\nThe second route is included in the price and paid from the run's own margin, so on a very long list\nof almost only hidden profiles some may not get it. This Actor never logs in: a profile that still\ndoes not open comes back as an error row that says so and costs nothing. If you put your own proxy URLs\nin the proxy field, they are used for every profile and the second route is off. A value that is not a\nprofile URL or slug (say, `not a url`) also comes back as a free error row that says so, instead of being skipped. Sales Navigator and\nRecruiter links (`linkedin.com/sales/lead/ACwAA…`) carry an internal ID that LinkedIn opens only for a\nlogged-in user, so they come back as free error rows telling you to paste the public `linkedin.com/in/<name>`\nURL instead (in Sales Navigator: lead page → ⋯ → View LinkedIn profile). Need the person's work\ne-mail too? Use [LinkedIn Profile Scraper with Email](https://apify.com/lergassy/linkedin-profile-email-scraper).\n\n### Run health\n\nWhen a run ends with many error rows, the Actor sends its developer the counts (rows delivered, error\ntypes, run ID) so the cause gets fixed fast. Your input and your results are never sent.\n\n### Very long lists\n\nLinkedIn rate-limits public profile pages. When most of the last 30 profiles in a run are refused\nby rate limits, the rest of the list goes straight to the second route (with your own proxies: the run\npauses for 90 seconds, and after two pauses stops instead of grinding through the rest). A run that gets\nwithin 30 seconds of its timeout stops taking new profiles the same way. Refused profiles stay free, and\nthe URLs that were never tried are saved in the run's key-value store as `NOT_ATTEMPTED` — start a new\nrun with them later.\n\n## How to use it in three steps\n\n1. Paste LinkedIn profile URLs or slugs into **👤 Profiles** — `https://www.linkedin.com/in/satyanadella` or `satyanadella` — or link a Google Sheet.\n2. Turn on **📰 Add the latest posts and articles** if you want recent activity in the row.\n3. Press **Start**, then download JSON, CSV or Excel — or call it from the API, n8n, Make, Zapier or an AI agent.\n\n## ⬇️ Input\n\n```json\n{\n  \"profileUrls\": [\"https://www.linkedin.com/in/satyanadella\", \"jeffweiner08\", \"justinwelsh\"],\n  \"includePosts\": false\n}\n```\n\n## ⬆️ Output\n\n```json\n{\n  \"type\": \"profile\",\n  \"fullName\": \"Satya Nadella\",\n  \"firstName\": \"Satya\",\n  \"lastName\": \"Nadella\",\n  \"headline\": \"Chairman and CEO at Microsoft\",\n  \"title\": \"Chairman and CEO\",\n  \"company\": \"Microsoft\",\n  \"companyLinkedinUrl\": \"https://www.linkedin.com/company/microsoft\",\n  \"location\": \"Redmond, Washington, United States\",\n  \"country\": \"US\",\n  \"city\": \"Redmond\",\n  \"region\": \"Washington\",\n  \"countryCode\": \"US\",\n  \"followers\": 12203128,\n  \"connections\": \"500+\",\n  \"badges\": \"Creator, Top Voice\",\n  \"experience\": [\n    { \"title\": \"Chairman and CEO\", \"company\": \"Microsoft\", \"companyLinkedinUrl\": \"https://www.linkedin.com/company/microsoft\", \"startDate\": \"Feb 2014\", \"endDate\": null, \"current\": true, \"duration\": \"12 years 9 months\", \"description\": null, \"companyLogo\": \"https://media.licdn.com/dms/image/v2/D560BAQH32RJQCl3dDQ/company-logo_100_100/…\", \"location\": \"Greater Seattle Area\", \"employmentType\": null },\n    { \"title\": \"Board Member\", \"company\": \"Starbucks\", \"companyLinkedinUrl\": \"https://www.linkedin.com/company/starbucks\", \"startDate\": \"2017\", \"endDate\": \"2024\", \"current\": false, \"duration\": \"7 years\", \"description\": null, \"companyLogo\": \"https://media.licdn.com/dms/image/v2/C4D0BAQEQxk9y2rk7Hw/company-logo_100_100/…\", \"location\": null, \"employmentType\": null }\n  ],\n  \"education\": [\n    { \"school\": \"The University of Chicago Booth School of Business\", \"startDate\": \"1994\", \"endDate\": \"1996\", \"degree\": null, \"fieldOfStudy\": null },\n    { \"school\": \"University of Wisconsin-Milwaukee\", \"startDate\": null, \"endDate\": null, \"degree\": \"Master’s Degree\", \"fieldOfStudy\": \"Computer Science\" }\n  ],\n  \"languageProficiencies\": [],\n  \"coverImageUrl\": \"https://media.licdn.com/dms/image/v2/D5616AQFVwYcBLAcPqQ/profile-displaybackgroundimage-shrink_200_800/…\",\n  \"memberId\": \"19186432\",\n  \"profileUrn\": \"urn:li:member:19186432\",\n  \"similarProfiles\": [\n    { \"name\": \"Tony Bates\", \"headline\": \"Genesys\", \"location\": \"San Francisco Bay Area\", \"followers\": 18000, \"linkedinUrl\": \"https://www.linkedin.com/in/tony-bates-679227a5\", \"imageUrl\": \"https://media.licdn.com/dms/image/v2/…\" }\n  ],\n  \"sameNameProfiles\": [],\n  \"linkedinUrl\": \"https://www.linkedin.com/in/satyanadella\",\n  \"scrapedAt\": \"2026-09-23T12:04:11.004Z\"\n}\n```\n\n## Use cases\n\n### Recruiting\nCurrent role, tenure and the full career path for every candidate on a shortlist — no seat licence, no account ban risk.\n\n### Sales enrichment\nTitle and company for every contact in a CRM, refreshed on a schedule so job changes show up. Pair with our **LinkedIn Email Finder** for the work address.\n\n### Research and influencer analysis\nFollowers, Creator badges and recent posts with likes for a list of voices in your market.\n\n### AI agents\nThrough the Apify MCP server an agent can ask *\"what is this person's current role and background?\"* and get a row back.\n\n## Integrations\n\nEvery run is available through the Apify API, and the Actor works out of the box with n8n, Make, Zapier, Google Sheets, LangChain and the Apify MCP server.\n\n## FAQ\n\n**Do I need cookies or a LinkedIn account?** No. That is the point of this Actor: it reads public profiles only, so nothing can be restricted.\n\n**Why are some fields empty?** LinkedIn hides parts of some profiles from logged-out visitors. The Actor delivers what the public profile shows and never invents the rest.\n\n**Does it return e-mails or phone numbers?** No — public profiles do not show them. For a work e-mail, use **LinkedIn Email Finder**.\n\n**Is this legal?** The Actor reads profiles that people have made public. The rows are personal data: under GDPR, CCPA and similar laws you need a lawful basis to process them, must respect opt-outs, and must follow LinkedIn's terms. Use it for legitimate business purposes only.\n",
      "changelog": "# Changelog\n\n## 2026-10-09\n- Internal: cost-safety switches for the paid routes; run-health module updated (reports reliably when a run ends).\n\n## 2026-10-05 (2)\n- New fields `similarProfiles` (\"Other similar profiles\" — LinkedIn's \"People also viewed\" rail as logged-out visitors see it, usually 10–20 people with name, headline, location, followers, URL and photo) and `sameNameProfiles` (\"Others named …\", when shown). Same page, no extra request or charge.\n\n## 2026-10-05\n- Experience now lists every role, including each role inside a company group (several roles at one company were missing before — e.g. 24 roles instead of 11 on a long career). Each role gains `companyLogo`, `location` and `employmentType` (when shown); descriptions are the full text instead of a cut \"… Show more\".\n- Education lists every school on the page (some were missing) with `degree`, `fieldOfStudy`, `activities`, `grade`, `description` and `schoolLogo`.\n- New fields: `city`, `region`, `countryCode`, `coverImageUrl`, `memberId`, `profileUrn`, `languageProficiencies`, `courses`, `projects`, `testScores`, `coursesTaught`; certifications gain `credentialId`, `issuerLinkedinUrl`, `logoUrl`; current positions gain `companyLogo`.\n- An input value that is not a profile URL now gets a free error row instead of being skipped silently.\n\n## 2026-10-03\n- Profiles hidden from logged-out visitors are opened again, through a second route (a web unblocker first, a heavier unblocking service last). Profiles that still do not open remain free error rows.\n- Runs stop taking new profiles shortly before their timeout and list the rest in `NOT_ATTEMPTED`.\n\n## 2026-10-02\n- Profiles LinkedIn hides from logged-out visitors come back as free error rows that say so.\n- Default memory tuned to measured usage.\n\n## 2026-10-01\n- Every profile is read through a fresh address, so long lists are refused far less often.\n- If LinkedIn starts refusing many profiles in a row, the run pauses and retries before stopping; profiles not reached are saved in a NOT_ATTEMPTED record and not charged.\n- Refused profiles (HTTP 999) are no longer retried, so runs finish sooner.\n- `website` now holds only the person's own external website, never a LinkedIn link.\n- Fixed runs with a maximum cost stopping before the limit was actually reached.\n\n## 2026-09-29\n- Clearer input field descriptions and examples.\n\n## 2026-09-27\n- Runs stop cleanly at your maximum cost instead of being aborted; nothing beyond your limit is written or charged.\n\n## 2026-09-26\n- New fields: certifications, volunteering, publications, honors, organizations, skills and recommendations, whenever the public profile shows them.\n\n## 2026-09-23\n- Initial release: LinkedIn profile URLs to clean rows with name, headline, current title and company, location, about, followers, connections, experience with dates and education, with no login or cookies.\n"
    },
    "buildNumber": "0.1.62",
    "imageDigest": "3ed134738a5498a6e67e56b098e0e4e079f93317cc2c7d372243ff94bfcdb000",
    "actVersion": {
      "sourceType": "GIT_REPO",
      "buildTag": "latest",
      "versionNumber": "0.1"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.023097777777777776
    }
  }
}