{
  "data": {
    "id": "E7OhE45VaYfl2279W",
    "actId": "o6kG0foqWs6cu5Orb",
    "userId": "ngn8vRESTkseyWE6p",
    "startedAt": "2026-10-15T20:27:19.380Z",
    "finishedAt": "2026-10-15T20:29:34.202Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 134663,
      "runTimeSecs": 134.663,
      "computeUnits": 0.14962555555555557,
      "imageSizeBytes": 898740736
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Linkedin.com Profiles Scraper\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"scrapeMyConnections\": {\n      \"title\": \"Scrape my own connections\",\n      \"type\": \"boolean\",\n      \"description\": \"Turn this on to scrape <b>your own first-degree connections</b> instead of supplying URLs yourself. The actor reads your My Network list, then scrapes the full profile of every connection it finds. Leave Start URLs empty when using this. There is no 1,000-result limit — it walks your whole network. <b>Needs your cookies</b> (see the Cookies section below).\",\n      \"default\": false,\n      \"groupCaption\": \"What to scrape\"\n    },\n    \"maxConnections\": {\n      \"title\": \"Max connections to enumerate\",\n      \"type\": \"integer\",\n      \"description\": \"Only used when 'Scrape my own connections' is on. Caps how many connections are collected before scraping starts.\",\n      \"default\": 5000,\n      \"minimum\": 1\n    },\n    \"startUrls\": {\n      \"title\": \"Start URLs\",\n      \"type\": \"array\",\n      \"description\": \"Profile URLs to scrape. Leave empty if you turned on 'Scrape my own connections' above. Works without cookies: leave the Cookies field empty and the actor reads each public profile without a LinkedIn login.\",\n      \"editor\": \"requestListSources\",\n      \"prefill\": [\n        {\n          \"url\": \"https://www.linkedin.com/in/harsh-shuddhalwar/\"\n        }\n      ]\n    },\n    \"maxItems\": {\n      \"title\": \"Max Profiles/Items to scrape per crawl\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of Profiles/Items to scrape per crawl.\",\n      \"default\": 100\n    },\n    \"language\": {\n      \"title\": \"Profile language\",\n      \"type\": \"string\",\n      \"description\": \"Ask LinkedIn for profile text (headlines, job titles, school and skill names) in this locale. Members who published a translation come back in that language; everyone else keeps their original wording, so you never lose rows. Leave empty for US English. Needs cookies; public profiles read without cookies come back in their original language.\",\n      \"editor\": \"select\",\n      \"default\": \"\",\n      \"enum\": [\n        \"\",\n        \"en_US\",\n        \"de_DE\",\n        \"fr_FR\",\n        \"es_ES\",\n        \"pt_BR\",\n        \"it_IT\",\n        \"nl_NL\",\n        \"sv_SE\",\n        \"da_DK\",\n        \"no_NO\",\n        \"pl_PL\",\n        \"ro_RO\",\n        \"cs_CZ\",\n        \"tr_TR\",\n        \"ru_RU\",\n        \"ar_AE\",\n        \"ja_JP\",\n        \"ko_KR\",\n        \"zh_CN\",\n        \"zh_TW\",\n        \"in_ID\",\n        \"th_TH\"\n      ],\n      \"enumTitles\": [\n        \"Default (English)\",\n        \"English (US)\",\n        \"German\",\n        \"French\",\n        \"Spanish\",\n        \"Portuguese (Brazil)\",\n        \"Italian\",\n        \"Dutch\",\n        \"Swedish\",\n        \"Danish\",\n        \"Norwegian\",\n        \"Polish\",\n        \"Romanian\",\n        \"Czech\",\n        \"Turkish\",\n        \"Russian\",\n        \"Arabic\",\n        \"Japanese\",\n        \"Korean\",\n        \"Chinese (Simplified)\",\n        \"Chinese (Traditional)\",\n        \"Indonesian\",\n        \"Thai\"\n      ]\n    },\n    \"maxSkills\": {\n      \"title\": \"Max skills per profile\",\n      \"type\": \"integer\",\n      \"description\": \"Keep only the first N skills on each profile. LinkedIn returns them ordered by endorsement strength, so the top ones survive. Leave at 0 to keep every skill returned.\",\n      \"default\": 0,\n      \"minimum\": 0\n    },\n    \"maxConcurrency\": {\n      \"title\": \"Max Concurrency\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of pages that can be processed at the same time.\",\n      \"default\": 10\n    },\n    \"minConcurrency\": {\n      \"title\": \"Min Concurrency\",\n      \"type\": \"integer\",\n      \"description\": \"Minimum number of pages that will be processed at the same time.\",\n      \"default\": 1\n    },\n    \"maxRequestRetries\": {\n      \"title\": \"Max Request Retries\",\n      \"type\": \"integer\",\n      \"description\": \"Number of times the crawler will retry a failed request before giving up.\",\n      \"default\": 10\n    },\n    \"cookies\": {\n      \"title\": \"Cookies (optional)\",\n      \"type\": \"array\",\n      \"description\": \"<p><b>Optional.</b> Leave this empty to scrape the Start URLs as public profiles without a LinkedIn login. Add your cookies for the fuller logged-in profile (volunteering, languages, certifications, LinkedIn IDs), for profiles hidden from logged-out visitors, and for 'Scrape my own connections'.</p><p>Cookie used to authorize actor with linkedin.com. Install <a rel=\\\"noopener noreferrer nofollow\\\" target=\\\"_blank\\\" href=\\\"https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg\\\" previewlistener=\\\"true\\\">EditThisCookie</a> chrome extension. Login to your linkedin.com account. Click on the extension and press <b>Export</b> to copy all linkedin.com cookies, then paste them here.</p><p><b>Paste the full exported list of cookie objects — not a single value.</b> Both <code>li_at</code> and <code>JSESSIONID</code> must be present: <code>li_at</code> is the session, and <code>JSESSIONID</code> is used as the CSRF token for LinkedIn's internal API. It should look like this:</p><pre>[\\n  {\\\"name\\\":\\\"li_at\\\",\\\"value\\\":\\\"AQED...\\\",\\\"domain\\\":\\\".linkedin.com\\\"},\\n  {\\\"name\\\":\\\"JSESSIONID\\\",\\\"value\\\":\\\"ajax:...\\\",\\\"domain\\\":\\\".linkedin.com\\\"}\\n]</pre>\",\n      \"sectionCaption\": \"Cookies\",\n      \"sectionDescription\": \"Optional. Leave empty to read public profiles without a login. To use your own LinkedIn session, clear the box below first, then paste the whole export from EditThisCookie, including the square brackets at the start and end. Pasting only the li_at value will not work — the run will stop immediately and tell you so.\",\n      \"editor\": \"json\",\n      \"prefill\": []\n    },\n    \"proxy\": {\n      \"sectionCaption\": \"Proxy configuration\",\n      \"title\": \"Proxy configuration (optional override)\",\n      \"type\": \"object\",\n      \"description\": \"Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies.\",\n      \"editor\": \"proxy\"\n    }\n  }\n}",
    "readme": "# LinkedIn Connections Exporter — Your Network + Full Profiles\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/linkedin-profile-logo.png\" alt=\"LinkedIn Profile Scraper\" width=\"140\" height=\"140\">\n</p>\n\n**Export your whole first-degree LinkedIn network in one run, with a full profile for every connection.** Tick one box and the actor reads your own connection list, then scrapes each person on it: name, headline, location, about, full work history and education, as clean JSON or CSV. There is no 1,000-contact cap. You can also paste profile URLs, and those work without a cookie.\n\nExporting *your* connections needs *your* LinkedIn session, so that mode asks for your cookie. A list of profile URLs does not: leave the Cookies field empty and each profile is read as LinkedIn shows it to logged-out visitors, with no account of yours involved.\n\n| Input | Cookie | Rows emitted |\n|---|---|---|\n| Profile URLs | not needed | One public profile per URL |\n| Profile URLs | your cookie | One full profile per URL, adding volunteering, languages, certifications and LinkedIn's IDs |\n| **Your own connections** (toggle, no URLs needed) | your cookie | One row per first-degree connection |\n\n> No browser and no headless Chrome. With your cookie the actor talks to LinkedIn's own internal API over plain HTTP; without one, public profiles come from a public-profile data source.\n\n**You pay per profile delivered: $0.001 each with your cookie, $0.003 without one.** A run that returns nothing costs half a cent (the $0.005 start fee), never dollars.\n\n---\n\n## Switching from another LinkedIn profile scraper?\n\nIf you've been burned elsewhere, here is exactly how this actor behaves on the failure modes people complain about most:\n\n| What happens elsewhere | What happens here |\n|---|---|\n| \"Charged $2 and got an empty JSON\" | Profile charges fire **only when a profile row lands in your dataset**. Nothing delivered = $0.005 total for the run start, nothing more. |\n| \"Aborted runs charged in full\" | Pay-per-event billing accrues per delivered row. Abort a run and you pay only for the profiles already in your dataset at that moment. |\n| \"Anomalous billing across runs\" | Every event is listed on the pricing tab: $0.005 per run start, $0.001 per profile, and $0.002 more for a profile read without a cookie. A 1,000-profile run is about **$1.01** with a cookie and **$3.01** without, so you can predict the bill before you press Start. |\n| Silent failures | A malformed or incomplete cookie stops the run within seconds with a plain-language explanation of what to fix, instead of burning your time and money first. |\n\n---\n\n## Related LinkedIn Scrapers\n\n- **[LinkedIn Company Profile Scraper](https://apify.com/memo23/linkedin-company-profile-scraper)** — company details from About pages\n- **[LinkedIn Search Jobs Scraper (Without Cookies)](https://apify.com/memo23/apify-linkedin-search-results-scraper)** — job listings, no authentication\n- **[LinkedIn Search Groups Scraper](https://apify.com/memo23/linkedin-search-groups-scraper)** — find and extract groups\n- **[LinkedIn Company Employees/People Scraper](https://apify.com/memo23/linkedin-company-people-scraper)** — employee profiles from companies\n- **[LinkedIn People Search Scraper](https://apify.com/memo23/linkedin-people-search)** — search people by keyword, title, company or school\n\n---\n\n## How it works\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-linkedin-profile.png\" alt=\"How the LinkedIn Profile Scraper works\" width=\"100%\">\n</p>\n\n1. **With a cookie or without.** Without one, the actor reads each profile's public view and nothing of yours is used. With one, it uses your own session, which LinkedIn requires for the full profile and for your connection list. Nothing is stored: the cookie is used for this run and discarded.\n2. **It works out who to scrape.** Either from the Start URLs you paste, or — with *Scrape my own connections* on — by reading your My Network list and turning every connection into a profile URL.\n3. **It resolves each profile.** With a cookie, the actor fetches the profile page, extracts the internal profile URN, then calls LinkedIn's own GraphQL endpoints for the top card and profile cards. Without one, it asks a public-profile data source for the profile and writes it under the same field names.\n4. **It writes one row per person** to the dataset, ready to export as JSON, CSV or Excel.\n\nLogged-in traffic runs through residential proxy, because datacenter IPs get blocked.\n\n---\n\n## Three ways to use it\n\n### A. Profile URLs, no cookie\n\nPaste them into **Start URLs** and leave the Cookies field empty.\n\n```json\n{\n  \"startUrls\": [\n    { \"url\": \"https://www.linkedin.com/in/williamhgates/\" },\n    { \"url\": \"https://www.linkedin.com/in/satyanadella/\" }\n  ],\n  \"maxItems\": 100\n}\n```\n\nYou get each person's public profile: name, headline, location, about, current company, work history with dates, schools with degrees, top skills, and follower and connection counts. A profile its owner hides from logged-out visitors comes back as not found and is not billed; add your cookie to read those.\n\n### B. Profile URLs, with your cookie\n\nPaste them into **Start URLs**, add your cookie, and leave the connections toggle off. The rows add volunteering, languages, certifications and LinkedIn's internal IDs.\n\n```json\n{\n  \"startUrls\": [\n    { \"url\": \"https://www.linkedin.com/in/williamhgates/\" },\n    { \"url\": \"https://www.linkedin.com/in/satyanadella/\" }\n  ],\n  \"cookies\": [\n    { \"name\": \"li_at\", \"value\": \"AQED...\", \"domain\": \".linkedin.com\" },\n    { \"name\": \"JSESSIONID\", \"value\": \"ajax:...\", \"domain\": \".linkedin.com\" }\n  ],\n  \"maxItems\": 100\n}\n```\n\n### C. You want your own network\n\nMost people cannot produce a list of their connections' profile URLs by hand. Turn on **Scrape my own connections** and leave Start URLs empty — the actor builds the list for you.\n\n```json\n{\n  \"scrapeMyConnections\": true,\n  \"maxConnections\": 5000,\n  \"cookies\": [\n    { \"name\": \"li_at\", \"value\": \"AQED...\", \"domain\": \".linkedin.com\" },\n    { \"name\": \"JSESSIONID\", \"value\": \"ajax:...\", \"domain\": \".linkedin.com\" }\n  ],\n  \"maxItems\": 5000\n}\n```\n\nThis reads your **My Network → Connections** list directly, so there is no 1,000-result search limit. Whether you have 300 connections or 12,000, it walks the whole list.\n\n---\n\n## Input\n\n| Field | Type | Required | Notes |\n|---|---|---|---|\n| `cookies` | array | no | Leave empty to read public profiles without a login. For the full profile or your connections, paste the full EditThisCookie export, with `li_at` **and** `JSESSIONID`. |\n| `scrapeMyConnections` | boolean | no | Scrape your own first-degree connections instead of supplying URLs. Needs `cookies`. Default `false`. |\n| `maxConnections` | integer | no | Cap on connections enumerated when the toggle is on. Default `5000`. |\n| `startUrls` | array | no | Profile URLs. Leave empty when the toggle is on. |\n| `maxItems` | integer | no | Max profiles scraped per run. Default `100`. |\n| `maxConcurrency` | integer | no | Parallel requests. Default `10`, which is also the most used for public profiles. |\n| `maxRequestRetries` | integer | no | Retries before giving up on a request. Default `10`. |\n| `proxy` | object | no | Optional override. Leave empty to use the built-in residential proxy. |\n\n### Getting your cookie (optional)\n\n1. Install [EditThisCookie](https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg) for Chrome.\n2. Log in to linkedin.com in that browser.\n3. With linkedin.com open, click the extension icon and press **Export**.\n4. Clear the Cookies field in this actor and paste.\n\nPaste the **whole exported list**, keeping the brackets. Both cookies are needed: `li_at` is the session, `JSESSIONID` is the CSRF token for LinkedIn's internal API. Pasting only the `li_at` value stops the run in a few seconds with an explanation rather than failing silently.\n\n---\n\n## Output\n\nOne row per profile. Values below are illustrative. This is a row read with your cookie; the row without one follows below.\n\n```jsonc\n{\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"headline\": \"Product Operations Manager @ Panax | Chartered Accountant\",\n  \"location\": \"Melbourne, Victoria, Australia\",\n  \"publicIdentifier\": \"jane-doe-4242\",\n  \"profileUrl\": \"https://www.linkedin.com/in/jane-doe-4242\",\n  \"connectionDegree\": \"We don't know each other\",\n  \"about\": \"Chartered accountant turned product operator...\",\n  \"workHistory\": [\n    {\n      \"title\": \"Product Operations Manager\",\n      \"company\": \"Panax\",\n      \"date\": \"Aug 2023 - Present\",\n      \"location\": \"\",\n      \"description\": \"\"\n    }\n  ],\n  \"education\": [\n    { \"school\": \"The Hebrew University of Jerusalem\", \"degree\": \"\", \"date\": \"\", \"description\": \"\" }\n  ],\n  \"volunteering\": [],\n  \"languages\": [],\n  \"certifications\": [],\n  \"skills\": [],\n  \"profileUrn\": \"urn:li:fsd_profile:ACoAA...\",\n  \"memberUrn\": \"urn:li:member:123456789\",\n  \"companyUrn\": \"urn:li:fsd_company:90915183\",\n  \"schoolUrn\": \"urn:li:fsd_school:41964\",\n  \"geoUrn\": \"urn:li:fsd_geo:100992797\",\n  \"userHandle\": \"jane-doe-4242\",\n  \"scrapedAt\": \"2026-10-15T09:00:00.000Z\"\n}\n```\n\n### Key fields\n\n| Field | Description |\n|---|---|\n| `firstName`, `lastName` | Name as displayed on the profile. |\n| `headline` | Professional headline. |\n| `location` | Display location, city through country. |\n| `publicIdentifier` | Profile slug, the part after `linkedin.com/in/`. |\n| `profileUrl` | Full profile URL. |\n| `about` | The About section. |\n| `workHistory[]` | `title`, `company`, `date` (for example `Aug 2023 - Present`), `location`, `description`. A title the profile does not show is left empty rather than guessed. |\n| `education[]` | `school`, `degree`, `date`, `description`. Dates and degrees are often empty: members hide them, and a date the actor cannot tie to a school is left out rather than guessed. |\n| `volunteering[]`, `languages[]`, `certifications[]` | Returned when the profile lists them. |\n| `skills[]` | Currently always empty. LinkedIn serves skills from a separate request the actor does not make yet. |\n| `profileUrn`, `memberUrn`, `companyUrn`, `schoolUrn`, `geoUrn` | LinkedIn's internal IDs, stable across name changes. `geoUrn` is the location's own ID. |\n\n### Without a cookie\n\nThe public view, with `loggedIn: false` so a dataset mixing both kinds of row can be filtered. Field names match the row above where the data is the same thing.\n\n```jsonc\n{\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"headline\": \"Product Operations Manager @ Panax | Chartered Accountant\",\n  \"location\": \"Melbourne, Victoria, Australia\",\n  \"publicIdentifier\": \"jane-doe-4242\",\n  \"profileUrl\": \"https://www.linkedin.com/in/jane-doe-4242\",\n  \"about\": \"Chartered accountant turned product operator...\",\n  \"currentCompany\": \"Panax\",\n  \"currentCompanyUrl\": \"https://www.linkedin.com/company/panax\",\n  \"followerCount\": 1662,\n  \"connectionCount\": 500,\n  \"workHistory\": [\n    { \"title\": \"Product Operations Manager\", \"company\": \"Panax\", \"companyUrl\": \"https://www.linkedin.com/company/90915183/\", \"date\": \"Aug 2023 - Present\", \"isCurrent\": true }\n  ],\n  \"education\": [\n    { \"school\": \"The Hebrew University of Jerusalem\", \"schoolUrl\": \"https://www.linkedin.com/company/41964/\", \"degree\": \"BCom, Accounting\", \"date\": \"2012 - 2015\" }\n  ],\n  \"skills\": [\"Product Operations\", \"Financial Modeling\", \"SQL\"],\n  \"isPremium\": false,\n  \"isVerified\": true,\n  \"openToWork\": false,\n  \"profilePictureUrl\": \"https://media.licdn.com/...\",\n  \"backgroundPictureUrl\": \"https://media.licdn.com/...\",\n  \"accountCreatedAt\": \"2016-03-14T10:22:05.000000+00:00\",\n  \"loggedIn\": false,\n  \"userHandle\": \"jane-doe-4242\",\n  \"scrapedAt\": \"2026-10-15T09:00:00.000Z\"\n}\n```\n\n`skills` holds the top three skills the profile shows. The first/last name split is the display name cut at the first space. Volunteering, languages, certifications, connection degree and the URNs need your cookie.\n\n---\n\n## Pricing\n\nPay per event. No monthly rental.\n\n| Event | When it fires | Price |\n|---|---|---|\n| Actor start | Once per run, per GB of memory | $0.005 |\n| Dataset item | Each profile written | $0.001 |\n| Profile without login | Each profile written by a run with no cookie, on top of the dataset item | $0.002 |\n\nA 1,000-profile run costs about **$1.01** with your cookie and **$3.01** without one. The extra $0.002 pays for the public-profile lookup that replaces your session.\n\n**No profiles, no profile charges.** Both profile events fire only when a profile row is actually written. A profile that does not exist or is hidden is not billed, and an empty run costs $0.005, full stop.\n\n---\n\n## FAQ\n\n**Do I need a LinkedIn cookie?**\nNot for profile URLs: leave the field empty and you get each person's public profile. You need one to export your own connections, for volunteering, languages, certifications and LinkedIn's IDs, and for profiles their owners hide from logged-out visitors.\n\n**Is my cookie stored?**\nNo. It is used for the requests in this run and nothing else.\n\n**Can this scrape someone else's connections?**\nNo. LinkedIn exposes a connection list only to the account that owns it. The toggle reads your own network, never anyone else's.\n\n**Why are some dates or fields empty?**\nMembers can hide them, and the actor leaves a field empty rather than guessing a value it cannot confirm.\n\n**Why is `skills` always empty?**\nLinkedIn serves skills from a separate request that this actor does not make yet. The `maxSkills` input is ready for when it does.\n\n**My run failed with an HTTP 999 or a redirect to login.**\nThe session expired. Log in to LinkedIn again, export a fresh cookie and re-run.\n\n**The run returned nothing — am I still charged?**\nOnly the $0.005 start fee. The profile charges fire per row written to your dataset, so a run with zero results can never cost you dollars.\n\n**Will this get my account restricted?**\nWithout a cookie your account is not involved at all. Any tool that uses your session carries some risk. Traffic runs through residential proxy and at modest concurrency to reduce it, but scrape at a sensible pace and avoid very large runs on a brand-new account.\n\n---\n\n## 🤖 For AI Agents & LLM Apps\n\n**Purpose:** Extract LinkedIn profile records — identity, headline, location, about, work history, education — from profile URLs, or from the caller's own first-degree connection list.\n\n**Auth:** None for profile URLs: omit `cookies` and each profile's public view is returned. The end user's LinkedIn session cookies (`li_at` + `JSESSIONID`, as an array of cookie objects) are needed for connection-list mode and for the fuller logged-in row.\n\n**Minimal tested input:**\n```json\n{\n  \"startUrls\": [{\"url\":\"https://www.linkedin.com/in/williamhgates/\"}],\n  \"maxItems\": 1\n}\n```\n\n**Connection-list mode:** set `scrapeMyConnections: true` and omit `startUrls`. Returns one row per first-degree connection of the cookie's owner. No 1,000-result cap.\n\n**Output fields, no cookie** (`loggedIn: false`): `firstName`, `lastName`, `headline`, `location`, `publicIdentifier`, `profileUrl`, `about`, `currentCompany`, `currentCompanyUrl`, `followerCount`, `connectionCount`, `workHistory[]` (`title`, `company`, `companyUrl`, `date`, `isCurrent`), `education[]` (`school`, `schoolUrl`, `degree`, `date`), `skills[]` (top 3), `isPremium`, `isVerified`, `openToWork`, `profilePictureUrl`, `backgroundPictureUrl`, `accountCreatedAt`, `userHandle`, `scrapedAt`.\n\n**Output fields, with cookies:** `firstName`, `lastName`, `headline`, `location`, `publicIdentifier`, `profileUrl`, `connectionDegree`, `about`, `workHistory[]` (`title`, `company`, `date`, `location`, `description`), `education[]` (`school`, `degree`, `date`, `description`), `volunteering[]`, `languages[]`, `certifications[]`, `skills[]` (currently always empty), `profileUrn`, `memberUrn`, `companyUrn`, `schoolUrn`, `geoUrn`, `userHandle`, `scrapedAt`.\n\n**Billing:** $0.005 per run start (per GB), $0.001 per profile returned, plus $0.002 (event `public-profile`) per profile returned without cookies.\n\n**Failure modes worth handling:** without cookies, a deleted, mistyped or hidden profile is skipped and not billed, and the status message counts them; malformed cookies fail immediately with a descriptive status message; an expired session surfaces as HTTP 302/401/403 with a \"cookie expired\" message; hidden or unconfirmed fields come back as `\"\"` or `[]` rather than being omitted or guessed.\n\n---\n\n## Additional Services\n\nCustom fields, a full dataset, or a different LinkedIn surface — email [muhamed.didovic@gmail.com](mailto:muhamed.didovic@gmail.com).\n\n---\n\n## Support\n\nIssues and feature requests via the actor's Issues tab, or email above.\n\n---\n\n## ⚠️ Disclaimer\n\nWithout a cookie, this actor returns only what LinkedIn shows logged-out visitors. With one, it accesses only data visible to the logged-in account whose session you supply. Use it on data you are entitled to access, and comply with LinkedIn's Terms of Service and applicable data-protection law — including the GDPR and CCPA — when storing or processing results. Personal data carries obligations around lawful basis, retention and subject access. You are the data controller for anything you collect; the actor's author is not. Do not use output for unlawful discrimination, harassment, or unsolicited bulk messaging.\n\n---\n\n## SEO Keywords\n\nlinkedin connections exporter, export linkedin connections to csv, download linkedin connections, linkedin network export, linkedin scraper, linkedin profile scraper, linkedin data extraction, scrape linkedin profiles, linkedin connections export, export linkedin connections, first degree connections, linkedin my network export, linkedin profile api, linkedin profile scraper no cookies, linkedin scraper without login, public linkedin profile data, linkedin lead generation, recruitment data, candidate sourcing, linkedin crawler, linkedin json export, linkedin csv export, professional profile data, linkedin employment history, b2b prospecting, sales navigator alternative, reliable linkedin profile scraper, best linkedin profile scraper, linkedin scraper pay per result, cheap linkedin profile scraper, linkedin profile scraper alternative, linkedin scraper transparent billing, apify linkedin actor\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "linkedin-profile-scraper",
      "title": "LinkedIn Connections Exporter — Your Network + Full Profiles",
      "description": "Export your own LinkedIn first-degree connections to CSV or JSON, each with name, headline, location, full work history and education. No 1,000-contact cap. Or paste profile URLs. Runs on your own LinkedIn session. $0.001 per profile.",
      "version": "0.0",
      "meta": {
        "templateId": "ts-crawlee-cheerio"
      },
      "input": {
        "title": "Linkedin.com Profiles Scraper",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "scrapeMyConnections": {
            "title": "Scrape my own connections",
            "type": "boolean",
            "description": "Turn this on to scrape <b>your own first-degree connections</b> instead of supplying URLs yourself. The actor reads your My Network list, then scrapes the full profile of every connection it finds. Leave Start URLs empty when using this. There is no 1,000-result limit — it walks your whole network. <b>Needs your cookies</b> (see the Cookies section below).",
            "default": false,
            "groupCaption": "What to scrape"
          },
          "maxConnections": {
            "title": "Max connections to enumerate",
            "type": "integer",
            "description": "Only used when 'Scrape my own connections' is on. Caps how many connections are collected before scraping starts.",
            "default": 5000,
            "minimum": 1
          },
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "Profile URLs to scrape. Leave empty if you turned on 'Scrape my own connections' above. Works without cookies: leave the Cookies field empty and the actor reads each public profile without a LinkedIn login.",
            "editor": "requestListSources",
            "prefill": [
              {
                "url": "https://www.linkedin.com/in/harsh-shuddhalwar/"
              }
            ]
          },
          "maxItems": {
            "title": "Max Profiles/Items to scrape per crawl",
            "type": "integer",
            "description": "Maximum number of Profiles/Items to scrape per crawl.",
            "default": 100
          },
          "language": {
            "title": "Profile language",
            "type": "string",
            "description": "Ask LinkedIn for profile text (headlines, job titles, school and skill names) in this locale. Members who published a translation come back in that language; everyone else keeps their original wording, so you never lose rows. Leave empty for US English. Needs cookies; public profiles read without cookies come back in their original language.",
            "editor": "select",
            "default": "",
            "enum": [
              "",
              "en_US",
              "de_DE",
              "fr_FR",
              "es_ES",
              "pt_BR",
              "it_IT",
              "nl_NL",
              "sv_SE",
              "da_DK",
              "no_NO",
              "pl_PL",
              "ro_RO",
              "cs_CZ",
              "tr_TR",
              "ru_RU",
              "ar_AE",
              "ja_JP",
              "ko_KR",
              "zh_CN",
              "zh_TW",
              "in_ID",
              "th_TH"
            ],
            "enumTitles": [
              "Default (English)",
              "English (US)",
              "German",
              "French",
              "Spanish",
              "Portuguese (Brazil)",
              "Italian",
              "Dutch",
              "Swedish",
              "Danish",
              "Norwegian",
              "Polish",
              "Romanian",
              "Czech",
              "Turkish",
              "Russian",
              "Arabic",
              "Japanese",
              "Korean",
              "Chinese (Simplified)",
              "Chinese (Traditional)",
              "Indonesian",
              "Thai"
            ]
          },
          "maxSkills": {
            "title": "Max skills per profile",
            "type": "integer",
            "description": "Keep only the first N skills on each profile. LinkedIn returns them ordered by endorsement strength, so the top ones survive. Leave at 0 to keep every skill returned.",
            "default": 0,
            "minimum": 0
          },
          "maxConcurrency": {
            "title": "Max Concurrency",
            "type": "integer",
            "description": "Maximum number of pages that can be processed at the same time.",
            "default": 10
          },
          "minConcurrency": {
            "title": "Min Concurrency",
            "type": "integer",
            "description": "Minimum number of pages that will be processed at the same time.",
            "default": 1
          },
          "maxRequestRetries": {
            "title": "Max Request Retries",
            "type": "integer",
            "description": "Number of times the crawler will retry a failed request before giving up.",
            "default": 10
          },
          "cookies": {
            "title": "Cookies (optional)",
            "type": "array",
            "description": "<p><b>Optional.</b> Leave this empty to scrape the Start URLs as public profiles without a LinkedIn login. Add your cookies for the fuller logged-in profile (volunteering, languages, certifications, LinkedIn IDs), for profiles hidden from logged-out visitors, and for 'Scrape my own connections'.</p><p>Cookie used to authorize actor with linkedin.com. Install <a rel=\"noopener noreferrer nofollow\" target=\"_blank\" href=\"https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg\" previewlistener=\"true\">EditThisCookie</a> chrome extension. Login to your linkedin.com account. Click on the extension and press <b>Export</b> to copy all linkedin.com cookies, then paste them here.</p><p><b>Paste the full exported list of cookie objects — not a single value.</b> Both <code>li_at</code> and <code>JSESSIONID</code> must be present: <code>li_at</code> is the session, and <code>JSESSIONID</code> is used as the CSRF token for LinkedIn's internal API. It should look like this:</p><pre>[\n  {\"name\":\"li_at\",\"value\":\"AQED...\",\"domain\":\".linkedin.com\"},\n  {\"name\":\"JSESSIONID\",\"value\":\"ajax:...\",\"domain\":\".linkedin.com\"}\n]</pre>",
            "sectionCaption": "Cookies",
            "sectionDescription": "Optional. Leave empty to read public profiles without a login. To use your own LinkedIn session, clear the box below first, then paste the whole export from EditThisCookie, including the square brackets at the start and end. Pasting only the li_at value will not work — the run will stop immediately and tell you so.",
            "editor": "json",
            "prefill": []
          },
          "proxy": {
            "sectionCaption": "Proxy configuration",
            "title": "Proxy configuration (optional override)",
            "type": "object",
            "description": "Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies.",
            "editor": "proxy"
          }
        }
      },
      "dockerfile": "../Dockerfile",
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "LinkedIn Profile Scraper output",
        "description": "Scraped LinkedIn profiles, one row per person.",
        "properties": {
          "profiles": {
            "type": "string",
            "title": "Profiles",
            "description": "One row per profile with name, headline, location, about, and the workHistory, education, volunteering, languages and certifications arrays.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "title": "LinkedIn Profiles — Dataset",
          "description": "One row per LinkedIn profile: name, headline, location, about, work history and education.",
          "views": {
            "overview": {
              "title": "Overview",
              "transformation": {
                "fields": [
                  "firstName",
                  "lastName",
                  "headline",
                  "location",
                  "profileUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "profileUrl": {
                    "label": "Profile",
                    "format": "link"
                  },
                  "firstName": {
                    "label": "First name"
                  },
                  "lastName": {
                    "label": "Last name"
                  },
                  "headline": {
                    "label": "Headline"
                  },
                  "location": {
                    "label": "Location"
                  }
                }
              }
            },
            "all_fields": {
              "title": "All fields",
              "transformation": {},
              "display": {
                "component": "table",
                "properties": {
                  "profileUrl": {
                    "label": "Profile",
                    "format": "link"
                  }
                }
              }
            }
          }
        }
      },
      "readme": "# LinkedIn Connections Exporter — Your Network + Full Profiles\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/linkedin-profile-logo.png\" alt=\"LinkedIn Profile Scraper\" width=\"140\" height=\"140\">\n</p>\n\n**Export your whole first-degree LinkedIn network in one run, with a full profile for every connection.** Tick one box and the actor reads your own connection list, then scrapes each person on it: name, headline, location, about, full work history and education, as clean JSON or CSV. There is no 1,000-contact cap. You can also paste profile URLs, and those work without a cookie.\n\nExporting *your* connections needs *your* LinkedIn session, so that mode asks for your cookie. A list of profile URLs does not: leave the Cookies field empty and each profile is read as LinkedIn shows it to logged-out visitors, with no account of yours involved.\n\n| Input | Cookie | Rows emitted |\n|---|---|---|\n| Profile URLs | not needed | One public profile per URL |\n| Profile URLs | your cookie | One full profile per URL, adding volunteering, languages, certifications and LinkedIn's IDs |\n| **Your own connections** (toggle, no URLs needed) | your cookie | One row per first-degree connection |\n\n> No browser and no headless Chrome. With your cookie the actor talks to LinkedIn's own internal API over plain HTTP; without one, public profiles come from a public-profile data source.\n\n**You pay per profile delivered: $0.001 each with your cookie, $0.003 without one.** A run that returns nothing costs half a cent (the $0.005 start fee), never dollars.\n\n---\n\n## Switching from another LinkedIn profile scraper?\n\nIf you've been burned elsewhere, here is exactly how this actor behaves on the failure modes people complain about most:\n\n| What happens elsewhere | What happens here |\n|---|---|\n| \"Charged $2 and got an empty JSON\" | Profile charges fire **only when a profile row lands in your dataset**. Nothing delivered = $0.005 total for the run start, nothing more. |\n| \"Aborted runs charged in full\" | Pay-per-event billing accrues per delivered row. Abort a run and you pay only for the profiles already in your dataset at that moment. |\n| \"Anomalous billing across runs\" | Every event is listed on the pricing tab: $0.005 per run start, $0.001 per profile, and $0.002 more for a profile read without a cookie. A 1,000-profile run is about **$1.01** with a cookie and **$3.01** without, so you can predict the bill before you press Start. |\n| Silent failures | A malformed or incomplete cookie stops the run within seconds with a plain-language explanation of what to fix, instead of burning your time and money first. |\n\n---\n\n## Related LinkedIn Scrapers\n\n- **[LinkedIn Company Profile Scraper](https://apify.com/memo23/linkedin-company-profile-scraper)** — company details from About pages\n- **[LinkedIn Search Jobs Scraper (Without Cookies)](https://apify.com/memo23/apify-linkedin-search-results-scraper)** — job listings, no authentication\n- **[LinkedIn Search Groups Scraper](https://apify.com/memo23/linkedin-search-groups-scraper)** — find and extract groups\n- **[LinkedIn Company Employees/People Scraper](https://apify.com/memo23/linkedin-company-people-scraper)** — employee profiles from companies\n- **[LinkedIn People Search Scraper](https://apify.com/memo23/linkedin-people-search)** — search people by keyword, title, company or school\n\n---\n\n## How it works\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-linkedin-profile.png\" alt=\"How the LinkedIn Profile Scraper works\" width=\"100%\">\n</p>\n\n1. **With a cookie or without.** Without one, the actor reads each profile's public view and nothing of yours is used. With one, it uses your own session, which LinkedIn requires for the full profile and for your connection list. Nothing is stored: the cookie is used for this run and discarded.\n2. **It works out who to scrape.** Either from the Start URLs you paste, or — with *Scrape my own connections* on — by reading your My Network list and turning every connection into a profile URL.\n3. **It resolves each profile.** With a cookie, the actor fetches the profile page, extracts the internal profile URN, then calls LinkedIn's own GraphQL endpoints for the top card and profile cards. Without one, it asks a public-profile data source for the profile and writes it under the same field names.\n4. **It writes one row per person** to the dataset, ready to export as JSON, CSV or Excel.\n\nLogged-in traffic runs through residential proxy, because datacenter IPs get blocked.\n\n---\n\n## Three ways to use it\n\n### A. Profile URLs, no cookie\n\nPaste them into **Start URLs** and leave the Cookies field empty.\n\n```json\n{\n  \"startUrls\": [\n    { \"url\": \"https://www.linkedin.com/in/williamhgates/\" },\n    { \"url\": \"https://www.linkedin.com/in/satyanadella/\" }\n  ],\n  \"maxItems\": 100\n}\n```\n\nYou get each person's public profile: name, headline, location, about, current company, work history with dates, schools with degrees, top skills, and follower and connection counts. A profile its owner hides from logged-out visitors comes back as not found and is not billed; add your cookie to read those.\n\n### B. Profile URLs, with your cookie\n\nPaste them into **Start URLs**, add your cookie, and leave the connections toggle off. The rows add volunteering, languages, certifications and LinkedIn's internal IDs.\n\n```json\n{\n  \"startUrls\": [\n    { \"url\": \"https://www.linkedin.com/in/williamhgates/\" },\n    { \"url\": \"https://www.linkedin.com/in/satyanadella/\" }\n  ],\n  \"cookies\": [\n    { \"name\": \"li_at\", \"value\": \"AQED...\", \"domain\": \".linkedin.com\" },\n    { \"name\": \"JSESSIONID\", \"value\": \"ajax:...\", \"domain\": \".linkedin.com\" }\n  ],\n  \"maxItems\": 100\n}\n```\n\n### C. You want your own network\n\nMost people cannot produce a list of their connections' profile URLs by hand. Turn on **Scrape my own connections** and leave Start URLs empty — the actor builds the list for you.\n\n```json\n{\n  \"scrapeMyConnections\": true,\n  \"maxConnections\": 5000,\n  \"cookies\": [\n    { \"name\": \"li_at\", \"value\": \"AQED...\", \"domain\": \".linkedin.com\" },\n    { \"name\": \"JSESSIONID\", \"value\": \"ajax:...\", \"domain\": \".linkedin.com\" }\n  ],\n  \"maxItems\": 5000\n}\n```\n\nThis reads your **My Network → Connections** list directly, so there is no 1,000-result search limit. Whether you have 300 connections or 12,000, it walks the whole list.\n\n---\n\n## Input\n\n| Field | Type | Required | Notes |\n|---|---|---|---|\n| `cookies` | array | no | Leave empty to read public profiles without a login. For the full profile or your connections, paste the full EditThisCookie export, with `li_at` **and** `JSESSIONID`. |\n| `scrapeMyConnections` | boolean | no | Scrape your own first-degree connections instead of supplying URLs. Needs `cookies`. Default `false`. |\n| `maxConnections` | integer | no | Cap on connections enumerated when the toggle is on. Default `5000`. |\n| `startUrls` | array | no | Profile URLs. Leave empty when the toggle is on. |\n| `maxItems` | integer | no | Max profiles scraped per run. Default `100`. |\n| `maxConcurrency` | integer | no | Parallel requests. Default `10`, which is also the most used for public profiles. |\n| `maxRequestRetries` | integer | no | Retries before giving up on a request. Default `10`. |\n| `proxy` | object | no | Optional override. Leave empty to use the built-in residential proxy. |\n\n### Getting your cookie (optional)\n\n1. Install [EditThisCookie](https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg) for Chrome.\n2. Log in to linkedin.com in that browser.\n3. With linkedin.com open, click the extension icon and press **Export**.\n4. Clear the Cookies field in this actor and paste.\n\nPaste the **whole exported list**, keeping the brackets. Both cookies are needed: `li_at` is the session, `JSESSIONID` is the CSRF token for LinkedIn's internal API. Pasting only the `li_at` value stops the run in a few seconds with an explanation rather than failing silently.\n\n---\n\n## Output\n\nOne row per profile. Values below are illustrative. This is a row read with your cookie; the row without one follows below.\n\n```jsonc\n{\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"headline\": \"Product Operations Manager @ Panax | Chartered Accountant\",\n  \"location\": \"Melbourne, Victoria, Australia\",\n  \"publicIdentifier\": \"jane-doe-4242\",\n  \"profileUrl\": \"https://www.linkedin.com/in/jane-doe-4242\",\n  \"connectionDegree\": \"We don't know each other\",\n  \"about\": \"Chartered accountant turned product operator...\",\n  \"workHistory\": [\n    {\n      \"title\": \"Product Operations Manager\",\n      \"company\": \"Panax\",\n      \"date\": \"Aug 2023 - Present\",\n      \"location\": \"\",\n      \"description\": \"\"\n    }\n  ],\n  \"education\": [\n    { \"school\": \"The Hebrew University of Jerusalem\", \"degree\": \"\", \"date\": \"\", \"description\": \"\" }\n  ],\n  \"volunteering\": [],\n  \"languages\": [],\n  \"certifications\": [],\n  \"skills\": [],\n  \"profileUrn\": \"urn:li:fsd_profile:ACoAA...\",\n  \"memberUrn\": \"urn:li:member:123456789\",\n  \"companyUrn\": \"urn:li:fsd_company:90915183\",\n  \"schoolUrn\": \"urn:li:fsd_school:41964\",\n  \"geoUrn\": \"urn:li:fsd_geo:100992797\",\n  \"userHandle\": \"jane-doe-4242\",\n  \"scrapedAt\": \"2026-10-15T09:00:00.000Z\"\n}\n```\n\n### Key fields\n\n| Field | Description |\n|---|---|\n| `firstName`, `lastName` | Name as displayed on the profile. |\n| `headline` | Professional headline. |\n| `location` | Display location, city through country. |\n| `publicIdentifier` | Profile slug, the part after `linkedin.com/in/`. |\n| `profileUrl` | Full profile URL. |\n| `about` | The About section. |\n| `workHistory[]` | `title`, `company`, `date` (for example `Aug 2023 - Present`), `location`, `description`. A title the profile does not show is left empty rather than guessed. |\n| `education[]` | `school`, `degree`, `date`, `description`. Dates and degrees are often empty: members hide them, and a date the actor cannot tie to a school is left out rather than guessed. |\n| `volunteering[]`, `languages[]`, `certifications[]` | Returned when the profile lists them. |\n| `skills[]` | Currently always empty. LinkedIn serves skills from a separate request the actor does not make yet. |\n| `profileUrn`, `memberUrn`, `companyUrn`, `schoolUrn`, `geoUrn` | LinkedIn's internal IDs, stable across name changes. `geoUrn` is the location's own ID. |\n\n### Without a cookie\n\nThe public view, with `loggedIn: false` so a dataset mixing both kinds of row can be filtered. Field names match the row above where the data is the same thing.\n\n```jsonc\n{\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"headline\": \"Product Operations Manager @ Panax | Chartered Accountant\",\n  \"location\": \"Melbourne, Victoria, Australia\",\n  \"publicIdentifier\": \"jane-doe-4242\",\n  \"profileUrl\": \"https://www.linkedin.com/in/jane-doe-4242\",\n  \"about\": \"Chartered accountant turned product operator...\",\n  \"currentCompany\": \"Panax\",\n  \"currentCompanyUrl\": \"https://www.linkedin.com/company/panax\",\n  \"followerCount\": 1662,\n  \"connectionCount\": 500,\n  \"workHistory\": [\n    { \"title\": \"Product Operations Manager\", \"company\": \"Panax\", \"companyUrl\": \"https://www.linkedin.com/company/90915183/\", \"date\": \"Aug 2023 - Present\", \"isCurrent\": true }\n  ],\n  \"education\": [\n    { \"school\": \"The Hebrew University of Jerusalem\", \"schoolUrl\": \"https://www.linkedin.com/company/41964/\", \"degree\": \"BCom, Accounting\", \"date\": \"2012 - 2015\" }\n  ],\n  \"skills\": [\"Product Operations\", \"Financial Modeling\", \"SQL\"],\n  \"isPremium\": false,\n  \"isVerified\": true,\n  \"openToWork\": false,\n  \"profilePictureUrl\": \"https://media.licdn.com/...\",\n  \"backgroundPictureUrl\": \"https://media.licdn.com/...\",\n  \"accountCreatedAt\": \"2016-03-14T10:22:05.000000+00:00\",\n  \"loggedIn\": false,\n  \"userHandle\": \"jane-doe-4242\",\n  \"scrapedAt\": \"2026-10-15T09:00:00.000Z\"\n}\n```\n\n`skills` holds the top three skills the profile shows. The first/last name split is the display name cut at the first space. Volunteering, languages, certifications, connection degree and the URNs need your cookie.\n\n---\n\n## Pricing\n\nPay per event. No monthly rental.\n\n| Event | When it fires | Price |\n|---|---|---|\n| Actor start | Once per run, per GB of memory | $0.005 |\n| Dataset item | Each profile written | $0.001 |\n| Profile without login | Each profile written by a run with no cookie, on top of the dataset item | $0.002 |\n\nA 1,000-profile run costs about **$1.01** with your cookie and **$3.01** without one. The extra $0.002 pays for the public-profile lookup that replaces your session.\n\n**No profiles, no profile charges.** Both profile events fire only when a profile row is actually written. A profile that does not exist or is hidden is not billed, and an empty run costs $0.005, full stop.\n\n---\n\n## FAQ\n\n**Do I need a LinkedIn cookie?**\nNot for profile URLs: leave the field empty and you get each person's public profile. You need one to export your own connections, for volunteering, languages, certifications and LinkedIn's IDs, and for profiles their owners hide from logged-out visitors.\n\n**Is my cookie stored?**\nNo. It is used for the requests in this run and nothing else.\n\n**Can this scrape someone else's connections?**\nNo. LinkedIn exposes a connection list only to the account that owns it. The toggle reads your own network, never anyone else's.\n\n**Why are some dates or fields empty?**\nMembers can hide them, and the actor leaves a field empty rather than guessing a value it cannot confirm.\n\n**Why is `skills` always empty?**\nLinkedIn serves skills from a separate request that this actor does not make yet. The `maxSkills` input is ready for when it does.\n\n**My run failed with an HTTP 999 or a redirect to login.**\nThe session expired. Log in to LinkedIn again, export a fresh cookie and re-run.\n\n**The run returned nothing — am I still charged?**\nOnly the $0.005 start fee. The profile charges fire per row written to your dataset, so a run with zero results can never cost you dollars.\n\n**Will this get my account restricted?**\nWithout a cookie your account is not involved at all. Any tool that uses your session carries some risk. Traffic runs through residential proxy and at modest concurrency to reduce it, but scrape at a sensible pace and avoid very large runs on a brand-new account.\n\n---\n\n## 🤖 For AI Agents & LLM Apps\n\n**Purpose:** Extract LinkedIn profile records — identity, headline, location, about, work history, education — from profile URLs, or from the caller's own first-degree connection list.\n\n**Auth:** None for profile URLs: omit `cookies` and each profile's public view is returned. The end user's LinkedIn session cookies (`li_at` + `JSESSIONID`, as an array of cookie objects) are needed for connection-list mode and for the fuller logged-in row.\n\n**Minimal tested input:**\n```json\n{\n  \"startUrls\": [{\"url\":\"https://www.linkedin.com/in/williamhgates/\"}],\n  \"maxItems\": 1\n}\n```\n\n**Connection-list mode:** set `scrapeMyConnections: true` and omit `startUrls`. Returns one row per first-degree connection of the cookie's owner. No 1,000-result cap.\n\n**Output fields, no cookie** (`loggedIn: false`): `firstName`, `lastName`, `headline`, `location`, `publicIdentifier`, `profileUrl`, `about`, `currentCompany`, `currentCompanyUrl`, `followerCount`, `connectionCount`, `workHistory[]` (`title`, `company`, `companyUrl`, `date`, `isCurrent`), `education[]` (`school`, `schoolUrl`, `degree`, `date`), `skills[]` (top 3), `isPremium`, `isVerified`, `openToWork`, `profilePictureUrl`, `backgroundPictureUrl`, `accountCreatedAt`, `userHandle`, `scrapedAt`.\n\n**Output fields, with cookies:** `firstName`, `lastName`, `headline`, `location`, `publicIdentifier`, `profileUrl`, `connectionDegree`, `about`, `workHistory[]` (`title`, `company`, `date`, `location`, `description`), `education[]` (`school`, `degree`, `date`, `description`), `volunteering[]`, `languages[]`, `certifications[]`, `skills[]` (currently always empty), `profileUrn`, `memberUrn`, `companyUrn`, `schoolUrn`, `geoUrn`, `userHandle`, `scrapedAt`.\n\n**Billing:** $0.005 per run start (per GB), $0.001 per profile returned, plus $0.002 (event `public-profile`) per profile returned without cookies.\n\n**Failure modes worth handling:** without cookies, a deleted, mistyped or hidden profile is skipped and not billed, and the status message counts them; malformed cookies fail immediately with a descriptive status message; an expired session surfaces as HTTP 302/401/403 with a \"cookie expired\" message; hidden or unconfirmed fields come back as `\"\"` or `[]` rather than being omitted or guessed.\n\n---\n\n## Additional Services\n\nCustom fields, a full dataset, or a different LinkedIn surface — email [muhamed.didovic@gmail.com](mailto:muhamed.didovic@gmail.com).\n\n---\n\n## Support\n\nIssues and feature requests via the actor's Issues tab, or email above.\n\n---\n\n## ⚠️ Disclaimer\n\nWithout a cookie, this actor returns only what LinkedIn shows logged-out visitors. With one, it accesses only data visible to the logged-in account whose session you supply. Use it on data you are entitled to access, and comply with LinkedIn's Terms of Service and applicable data-protection law — including the GDPR and CCPA — when storing or processing results. Personal data carries obligations around lawful basis, retention and subject access. You are the data controller for anything you collect; the actor's author is not. Do not use output for unlawful discrimination, harassment, or unsolicited bulk messaging.\n\n---\n\n## SEO Keywords\n\nlinkedin connections exporter, export linkedin connections to csv, download linkedin connections, linkedin network export, linkedin scraper, linkedin profile scraper, linkedin data extraction, scrape linkedin profiles, linkedin connections export, export linkedin connections, first degree connections, linkedin my network export, linkedin profile api, linkedin profile scraper no cookies, linkedin scraper without login, public linkedin profile data, linkedin lead generation, recruitment data, candidate sourcing, linkedin crawler, linkedin json export, linkedin csv export, professional profile data, linkedin employment history, b2b prospecting, sales navigator alternative, reliable linkedin profile scraper, best linkedin profile scraper, linkedin scraper pay per result, cheap linkedin profile scraper, linkedin profile scraper alternative, linkedin scraper transparent billing, apify linkedin actor\n"
    },
    "buildNumber": "0.0.77",
    "imageDigest": "c5ea267411f517aa2d65f712c4c5cda90cc1a9cff25c2a186ce13bcda7c2f643",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "0.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.14962555555555557
    }
  }
}