{
  "data": {
    "id": "7MsUsmYvt3q0syB1i",
    "actId": "YSuvFPBwCHRHBvPzY",
    "userId": "TUYZnHf3wEDcqqsoh",
    "startedAt": "2026-10-02T21:08:14.806Z",
    "finishedAt": "2026-10-02T21:08:28.472Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "API"
    },
    "stats": {
      "durationMillis": 13591,
      "runTimeSecs": 13.591,
      "computeUnits": 0.01510111111111111,
      "imageSizeBytes": 309633536
    },
    "options": {
      "useCache": false,
      "betaPackages": false,
      "tag": "latest",
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"LinkedIn Profile Scraper\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"searches\": {\n      \"title\": \"People searches\",\n      \"type\": \"array\",\n      \"description\": \"One phrase per line, written the way you would describe the person: \\\"ecommerce manager netherlands\\\". Each becomes a search of the public profile index.\",\n      \"editor\": \"stringList\",\n      \"prefill\": [\n        \"ecommerce manager netherlands\"\n      ],\n      \"example\": [\n        \"head of procurement retail germany\"\n      ]\n    },\n    \"profileUrls\": {\n      \"title\": \"Profile URLs\",\n      \"type\": \"array\",\n      \"description\": \"Profiles you already have. A full link or a bare slug both work. Combine with searches or use on their own.\",\n      \"editor\": \"stringList\",\n      \"prefill\": [],\n      \"example\": [\n        \"https://www.linkedin.com/in/williamhgates\",\n        \"satyanadella\"\n      ]\n    },\n    \"maxProfiles\": {\n      \"title\": \"Maximum profiles\",\n      \"type\": \"integer\",\n      \"description\": \"Stop after this many. Also the cost ceiling for the run.\",\n      \"editor\": \"number\",\n      \"minimum\": 1,\n      \"maximum\": 1000,\n      \"default\": 50\n    },\n    \"searchPages\": {\n      \"title\": \"Search pages per phrase\",\n      \"type\": \"integer\",\n      \"description\": \"How deep to go in the index per search phrase. Each page adds roughly seven to eleven profiles.\",\n      \"editor\": \"number\",\n      \"minimum\": 1,\n      \"maximum\": 10,\n      \"default\": 3\n    },\n    \"country\": {\n      \"title\": \"Country\",\n      \"type\": \"string\",\n      \"description\": \"Two-letter country code. Steers both the search index and where the profile is read from, and LinkedIn serves the profile in that country's language.\",\n      \"editor\": \"textfield\",\n      \"default\": \"nl\",\n      \"example\": \"us\"\n    },\n    \"language\": {\n      \"title\": \"Search language\",\n      \"type\": \"string\",\n      \"description\": \"Two-letter language code for the search.\",\n      \"editor\": \"textfield\",\n      \"default\": \"en\",\n      \"example\": \"nl\"\n    },\n    \"concurrency\": {\n      \"title\": \"Parallel profiles\",\n      \"type\": \"integer\",\n      \"description\": \"How many profiles to read at once.\",\n      \"editor\": \"number\",\n      \"minimum\": 1,\n      \"maximum\": 8,\n      \"default\": 3\n    },\n    \"attempts\": {\n      \"title\": \"Attempts per profile\",\n      \"type\": \"integer\",\n      \"description\": \"How often to retry a refused profile with a different agent and a fresh exit before giving up on it.\",\n      \"editor\": \"number\",\n      \"minimum\": 1,\n      \"maximum\": 20,\n      \"default\": 5\n    }\n  },\n  \"required\": []\n}",
    "readme": "# LinkedIn Profile Scraper: people search without cookies or login\n\nThis LinkedIn profile scraper reads public profiles. Describe the people you are looking for,\nlike `ecommerce manager netherlands`, or paste profile URLs you already have, and\nget one row per person: name, role, current employer, location, follower and\nconnection counts, About text and education. Use it to scrape LinkedIn profiles\nfor lead lists, recruiting research or to refresh a CRM.\n\nNo LinkedIn account, no session cookie, nothing copied from your browser. Your\nown profile is never at risk because it is never used.\n\n## What you get\n\n| Field | What it holds |\n|---|---|\n| `name`, `first_name`, `last_name` | The person's name as shown on the profile |\n| `headline` | Their role, for profiles found through a search |\n| `current_company` | Current employer, from the profile page |\n| `location` | City, region and country as they wrote it |\n| `followers`, `connections` | Counts as displayed, such as `500+` |\n| `about` | The About text |\n| `education` | Schools, with degree and years where shown |\n| `positions` | Past and current employers with location |\n| `photo_url`, `profile_url`, `slug` | Picture and canonical link |\n| `search`, `search_title`, `search_snippet` | The phrase that found this person and what the index showed |\n| `fetched`, `error` | Whether the profile page was read, and why not if it was not |\n\nEvery row is public profile data: what anyone sees when they open a LinkedIn\nprofile without signing in. There are no email addresses or phone numbers in the\noutput, and private or restricted profiles stay private.\n\n## The one thing LinkedIn does not show\n\n**Job titles per position are not available.** LinkedIn sends that field empty\nto visitors who are not signed in, on every position of every profile we tested,\nand it withholds the dates too. So `positions` tells you where someone worked,\nnot what they were called there.\n\nThat is why `headline` matters. The search index kept the person's role, the\nlive page carries the employer, and the row has both. One search returned \"Edo\nVoets - E-Commerce Manager\" while the live page for the same person says \"Moët\nHennessy Nederland BV\". Neither half is complete on its own.\n\nEach row also carries `titles_available`, normally `false`. If LinkedIn ever\nstarts serving titles, that flag turns true and the column fills itself.\n\n## Input\n\n| Field | Type | Default | What it does |\n|---|---|---|---|\n| `searches` | list | empty; form prefill: `ecommerce manager netherlands` | One phrase per line, each a people search in the public profile index |\n| `profileUrls` | list | empty | Profiles you already have, as full links or bare slugs. Combine with searches or use alone |\n| `maxProfiles` | integer | 50 | Stop after this many profiles (1 to 1.000). Also the cost ceiling |\n| `searchPages` | integer | 3 | How deep to go per phrase (1 to 10). Each page adds roughly seven to eleven profiles |\n| `country` | string | `nl` | Two-letter code. Picks the search market and the language LinkedIn serves the profile in |\n| `language` | string | `en` | Two-letter language code for the search |\n| `concurrency` | integer | 3 | Profiles read at once (1 to 8) |\n| `attempts` | integer | 5 | Retries for a profile that refuses before it is marked `blocked` |\n\nGive at least one search phrase or one profile URL. The form prefills a search phrase; API runs without either field return `bad_input`.\n\n## Output example\n\n```json\n{\n  \"profile_url\": \"https://www.linkedin.com/in/williamhgates\",\n  \"slug\": \"williamhgates\",\n  \"handle\": \"williamhgates\",\n  \"name\": \"Bill Gates\",\n  \"first_name\": \"Bill\",\n  \"last_name\": \"Gates\",\n  \"current_company\": \"Gates Foundation\",\n  \"location\": \"Seattle, Washington, United States\",\n  \"followers\": \"41M\",\n  \"connections\": \"8\",\n  \"followers_count\": 41000000,\n  \"connections_count\": 8,\n  \"about\": \"Chair of the Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft…\",\n  \"positions\": [\n    {\n      \"title\": null,\n      \"company\": \"Gates Foundation\",\n      \"location\": null,\n      \"dates\": null,\n      \"is_current\": true\n    }\n  ],\n  \"position_count\": 1,\n  \"education\": [\n    {\n      \"school\": \"Harvard University\",\n      \"degree\": null,\n      \"dates\": \"1973 - 1975\"\n    }\n  ],\n  \"photo_url\": \"https://media.licdn.com/dms/image/v2/D5603AQF-RYZP55jmXA/profile-displayphoto-shrink_200_200/B56ZRi8g.aGsAY-/0/1736826818802?e=2147483647&v=beta&t=bKWfN6UwwtiCqFWsG7rBELbd48qJOAMLdxhBzzkJV0k\",\n  \"titles_available\": false,\n  \"search\": null,\n  \"headline\": null,\n  \"search_title\": null,\n  \"search_snippet\": null,\n  \"fetched\": true,\n  \"error\": null,\n  \"duration_seconds\": 3.07,\n  \"position\": 1,\n  \"source\": \"linkedin-profile-scraper\",\n  \"platform\": \"linkedin\",\n  \"fetched_at\": \"2026-10-02T18:43:58.546Z\"\n}\n```\n\nThis is an actual profile row retrieved on 2 October 2026 with the profile URL input.\nFields from the search index appear when using people searches.\n\nThe original `followers` and `connections` fields remain displayed strings. Numeric equivalents are available as `followers_count` and `connections_count`; a displayed `500+` becomes the lower bound 500. `handle` is the decoded public profile slug, and `fetched_at` records when the row was read.\n\n## How to search LinkedIn profiles well\n\nWrite the phrase the way the person would describe themselves, because that is\nwhat the index matched on. `head of procurement retail germany` works;\n`decision maker in supply chain` does not, because nobody writes that on their\nprofile. Add the country or city to the phrase and set `country` to match.\n\nA Dutch profile read with `country: nl` comes back with Dutch labels. Set the\ncountry of the people you are after, not your own.\n\n## Use cases\n\n**Lead lists for B2B sales.** Search `ecommerce manager netherlands` or\n`head of marketing fashion germany`, and you get names, current employers and\nroles in one table, ready to match against your CRM. Because the employer comes\nfrom the live page and the role from the index, you can check a lead is still\nat the company before you write to them.\n\n**Recruiting and talent mapping.** Run a phrase per role and region, keep\n`location`, `education` and `positions`, and you have a map of who does a job in\na market and where they came from, without a Recruiter seat.\n\n**Enriching a list you already have.** Paste the profile URLs from your CRM or a\nspreadsheet into `profileUrls`. Each comes back with current employer, location,\nfollower count and About text, so stale records show up as a changed\n`current_company`.\n\n**Creator and executive research.** Follower counts and About texts for a list\nof named people, for influencer shortlists or for a briefing before a meeting.\n\n## How this LinkedIn profile scraper compares\n\n| | This actor | harvestapi/linkedin-profile-scraper | harvestapi/linkedin-profile-search |\n|---|---|---|---|\n| Per profile | **$0,004** | $0,004 | $0,004 (Free plan) |\n| Search pages | **not billed** | search is a separate actor | $0,10 per page (Free plan) |\n| Run start | $0,003 | none | none |\n| Emails | no | $0,01 per profile with email | $0,01 per profile with email |\n| Cookies or login needed | no | no | no |\n\nPrices from the Apify Store on 2 October 2026. Where they are ahead: they\nhave far more users and reviews, and they sell email lookup, which this actor\ndoes not. Where this one fits: people search where you pay per profile read and\nnothing for the search pages.\n\n## Pricing\n\nPay per event. `profile` costs $0,004 for each profile actually read, $4,00 per\n1.000, and `run_start` costs $0,003 once per run. **Profiles that could not be\nread are not billed**: they still appear as rows with `fetched: false` and what\nthe index knew. You only pay for results you receive, with no per-compute-unit\ncharges.\n\nOn the Apify Free plan a run returns at most 10 profiles, at the same prices.\nOn a paid Apify plan `maxProfiles` applies in full, up to 1.000 per run.\n\n## Limits and gotchas\n\n- **No job titles or dates per position.** See above; `headline` is the role.\n- **`headline` only comes with search.** A profile passed as a URL has no index\n  entry attached, so its row has the employer but no headline.\n- **Access can change without warning.** If a run that worked last week returns\n  `blocked` for every profile, LinkedIn changed something; it is not your\n  phrase. Compare `profilesRead` with `profilesFound` in the run summary.\n- **Raise `attempts` if some profiles come back `blocked`.**\n- **Private and restricted profiles are not read**, by design.\n- **Search depth is bounded by the index**: roughly seven to eleven profiles per\n  page, up to ten pages per phrase.\n\n| Error code | Meaning |\n|---|---|\n| `blocked` | The profile could not be read after every attempt |\n| `search_failed` | The index could not be searched for that phrase |\n| `no_results` | Nothing matched and no URLs were given |\n| `bad_input` | Neither a search phrase nor a URL was given |\n\n## FAQ\n\n**Can I scrape LinkedIn profiles without cookies?**\nYes. This actor needs no LinkedIn account and no session cookie, so there is no\naccount of yours to get restricted.\n\n**Can I search LinkedIn people by job title and country?**\nYes, as a phrase: `ecommerce manager netherlands`. Each phrase runs against the\npublic profile index and returns the matching profiles.\n\n**Does this LinkedIn scraper return email addresses?**\nNo. It returns public profile data only.\n\n**Why are job titles missing from the positions?**\nLinkedIn does not send them to visitors who are not signed in. The role you get\nis the `headline` from the search index.\n\n**Is this a LinkedIn profile API?**\nIt works as one. Start a run through the Apify API with your phrases or profile\nURLs and read the rows from the dataset as JSON or CSV. It does not use the\nofficial LinkedIn API, which needs a partner agreement and does not offer people\nsearch to outsiders.\n\n**How many profiles can one run return?**\nUp to `maxProfiles`, at most 1.000. A search phrase yields roughly seven to eleven\nprofiles per page and up to ten pages, so use several phrases for larger lists.\n\n**Is there a free LinkedIn scraper option?**\nYou can try this one with the monthly credit that comes with an Apify Free plan\naccount. Free-plan runs return up to 10 profiles each, so you can check the\noutput on your own phrases before you upgrade. Search pages and unread profiles\ncost nothing on any plan.\n\n**Can I pass a list of LinkedIn profile URLs?**\nYes, in `profileUrls`, as full links or bare slugs, with or without searches in\nthe same run.\n\n## Related Actors\n\n- [LinkedIn Jobs Scraper](https://apify.com/s-r/linkedin-jobs-scraper): job postings by keyword and location\n- [LinkedIn Ads Library](https://apify.com/s-r/linkedin-ads-library): what a company is advertising on LinkedIn\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "linkedin-profile-scraper",
      "title": "LinkedIn Profile Scraper - People Search, No Login",
      "description": "LinkedIn scraper for public profiles. Search people by role and country, or paste profile URLs, and get name, role, current employer, location, follower and connection counts, About text and education. No login, no cookies. Pay only for profiles read.",
      "version": "0.1",
      "buildTag": "latest",
      "input": {
        "title": "LinkedIn Profile Scraper",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "searches": {
            "title": "People searches",
            "type": "array",
            "description": "One phrase per line, written the way you would describe the person: \"ecommerce manager netherlands\". Each becomes a search of the public profile index.",
            "editor": "stringList",
            "prefill": [
              "ecommerce manager netherlands"
            ],
            "example": [
              "head of procurement retail germany"
            ]
          },
          "profileUrls": {
            "title": "Profile URLs",
            "type": "array",
            "description": "Profiles you already have. A full link or a bare slug both work. Combine with searches or use on their own.",
            "editor": "stringList",
            "prefill": [],
            "example": [
              "https://www.linkedin.com/in/williamhgates",
              "satyanadella"
            ]
          },
          "maxProfiles": {
            "title": "Maximum profiles",
            "type": "integer",
            "description": "Stop after this many. Also the cost ceiling for the run.",
            "editor": "number",
            "minimum": 1,
            "maximum": 1000,
            "default": 50
          },
          "searchPages": {
            "title": "Search pages per phrase",
            "type": "integer",
            "description": "How deep to go in the index per search phrase. Each page adds roughly seven to eleven profiles.",
            "editor": "number",
            "minimum": 1,
            "maximum": 10,
            "default": 3
          },
          "country": {
            "title": "Country",
            "type": "string",
            "description": "Two-letter country code. Steers both the search index and where the profile is read from, and LinkedIn serves the profile in that country's language.",
            "editor": "textfield",
            "default": "nl",
            "example": "us"
          },
          "language": {
            "title": "Search language",
            "type": "string",
            "description": "Two-letter language code for the search.",
            "editor": "textfield",
            "default": "en",
            "example": "nl"
          },
          "concurrency": {
            "title": "Parallel profiles",
            "type": "integer",
            "description": "How many profiles to read at once.",
            "editor": "number",
            "minimum": 1,
            "maximum": 8,
            "default": 3
          },
          "attempts": {
            "title": "Attempts per profile",
            "type": "integer",
            "description": "How often to retry a refused profile with a different agent and a fresh exit before giving up on it.",
            "editor": "number",
            "minimum": 1,
            "maximum": 20,
            "default": 5
          }
        },
        "required": []
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Profiles",
        "description": "Results land in the default dataset; summary and errors in the default key-value store.",
        "properties": {
          "profiles": {
            "type": "string",
            "title": "Profiles",
            "description": "One row per person.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          },
          "summary": {
            "type": "string",
            "title": "Run summary",
            "description": "How many were found and read, and how many carried a headline, an About text and an education history.",
            "template": "{{links.apiDefaultKeyValueStoreUrl}}/records/summary"
          },
          "errors": {
            "type": "string",
            "title": "Errors",
            "description": "Profiles that could not be read.",
            "template": "{{links.apiDefaultKeyValueStoreUrl}}/records/errors"
          }
        }
      },
      "dockerfile": "./Dockerfile",
      "minMemoryMbytes": 512,
      "maxMemoryMbytes": 2048,
      "defaultRunOptions": {
        "build": "latest",
        "memoryMbytes": 1024,
        "timeoutSecs": 3600
      },
      "categories": [
        "BUSINESS",
        "OTHER"
      ],
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "title": "LinkedIn profiles",
          "description": "One item per person.",
          "fields": {
            "type": "object",
            "properties": {
              "name": {
                "description": "Full name as shown on the profile"
              },
              "first_name": {
                "description": "First name"
              },
              "last_name": {
                "description": "Last name"
              },
              "headline": {
                "description": "Their role, taken from the search index. The profile page itself does not carry one for anonymous visitors"
              },
              "current_company": {
                "description": "Current employer, from the profile's own page title"
              },
              "location": {
                "description": "City, region and country as they wrote it"
              },
              "followers": {
                "description": "Follower count as displayed"
              },
              "connections": {
                "description": "Connection count as displayed"
              },
              "about": {
                "description": "The About text"
              },
              "positions": {
                "description": "Positions shown to anonymous visitors: company and location. Titles and dates are withheld by LinkedIn"
              },
              "position_count": {
                "description": "How many positions carried anything"
              },
              "titles_available": {
                "description": "Whether any position came with a job title. Normally false"
              },
              "education": {
                "description": "Schools with degree and years where shown"
              },
              "photo_url": {
                "description": "Profile picture"
              },
              "profile_url": {
                "description": "Canonical profile link"
              },
              "slug": {
                "description": "The profile's own id in the URL"
              },
              "search": {
                "description": "The phrase that found this person"
              },
              "search_title": {
                "description": "The index's title for the profile"
              },
              "search_snippet": {
                "description": "The index's snippet"
              },
              "fetched": {
                "description": "Whether the profile page itself was read"
              },
              "error": {
                "description": "Why a profile could not be read"
              },
              "duration_seconds": {
                "description": "How long this profile took"
              },
              "position": {
                "description": "Position in the run"
              }
            }
          },
          "views": {
            "overview": {
              "title": "Overview",
              "transformation": {
                "fields": [
                  "name",
                  "headline",
                  "current_company",
                  "location",
                  "followers",
                  "connections",
                  "profile_url",
                  "fetched"
                ]
              },
              "display": {
                "component": "table"
              }
            }
          }
        }
      },
      "environmentVariables": {
        "EDGE_ENDPOINT": "https://sr-linkedin-profile-scraper.b-cdn.net",
        "INPUT_FIELDS": "[\"searches\",\"profileUrls\",\"maxProfiles\",\"searchPages\",\"country\",\"language\",\"concurrency\",\"attempts\",\"cursor\"]",
        "COMPATIBILITY": "{\"error_details_field\":\"errors\",\"errors\":[{\"code\":\"invalid_input\",\"as\":\"bad_input\"},{\"code\":\"not_found\",\"as\":\"no_results\"},{\"code\":\"upstream_blocked\",\"as\":\"search_failed\"}]}",
        "CHARGE_MAP": "{\"run_start\":\"run\",\"profile\":\"billing.profile\"}",
        "FREE_TIER": "{\"cap\":10,\"volume_keys\":[\"maxProfiles\"]}",
        "PAGINATION": "{\"volume_key\":\"maxProfiles\",\"default_limit\":50,\"max_limit\":1000,\"cursor_input\":\"cursor\",\"cursor_output\":\"next_cursor\",\"identity_key\":\"position\",\"allow_empty_pages\":true,\"run_budget_seconds\":3600,\"billing_counts\":{\"profile\":{\"field\":\"fetched\",\"minimum\":1}},\"summary_merge\":{\"searches\":\"last\",\"profilesFound\":\"sum\",\"profilesRead\":\"sum\",\"withHeadline\":\"sum\",\"withAbout\":\"sum\",\"withEducation\":\"sum\",\"withPositionTitles\":\"sum\",\"fetchedInSeconds\":\"sum\"},\"transient_warnings\":[\"Continue with next_cursor to collect the remaining profiles.\"]}"
      },
      "readme": "# LinkedIn Profile Scraper: people search without cookies or login\n\nThis LinkedIn profile scraper reads public profiles. Describe the people you are looking for,\nlike `ecommerce manager netherlands`, or paste profile URLs you already have, and\nget one row per person: name, role, current employer, location, follower and\nconnection counts, About text and education. Use it to scrape LinkedIn profiles\nfor lead lists, recruiting research or to refresh a CRM.\n\nNo LinkedIn account, no session cookie, nothing copied from your browser. Your\nown profile is never at risk because it is never used.\n\n## What you get\n\n| Field | What it holds |\n|---|---|\n| `name`, `first_name`, `last_name` | The person's name as shown on the profile |\n| `headline` | Their role, for profiles found through a search |\n| `current_company` | Current employer, from the profile page |\n| `location` | City, region and country as they wrote it |\n| `followers`, `connections` | Counts as displayed, such as `500+` |\n| `about` | The About text |\n| `education` | Schools, with degree and years where shown |\n| `positions` | Past and current employers with location |\n| `photo_url`, `profile_url`, `slug` | Picture and canonical link |\n| `search`, `search_title`, `search_snippet` | The phrase that found this person and what the index showed |\n| `fetched`, `error` | Whether the profile page was read, and why not if it was not |\n\nEvery row is public profile data: what anyone sees when they open a LinkedIn\nprofile without signing in. There are no email addresses or phone numbers in the\noutput, and private or restricted profiles stay private.\n\n## The one thing LinkedIn does not show\n\n**Job titles per position are not available.** LinkedIn sends that field empty\nto visitors who are not signed in, on every position of every profile we tested,\nand it withholds the dates too. So `positions` tells you where someone worked,\nnot what they were called there.\n\nThat is why `headline` matters. The search index kept the person's role, the\nlive page carries the employer, and the row has both. One search returned \"Edo\nVoets - E-Commerce Manager\" while the live page for the same person says \"Moët\nHennessy Nederland BV\". Neither half is complete on its own.\n\nEach row also carries `titles_available`, normally `false`. If LinkedIn ever\nstarts serving titles, that flag turns true and the column fills itself.\n\n## Input\n\n| Field | Type | Default | What it does |\n|---|---|---|---|\n| `searches` | list | empty; form prefill: `ecommerce manager netherlands` | One phrase per line, each a people search in the public profile index |\n| `profileUrls` | list | empty | Profiles you already have, as full links or bare slugs. Combine with searches or use alone |\n| `maxProfiles` | integer | 50 | Stop after this many profiles (1 to 1.000). Also the cost ceiling |\n| `searchPages` | integer | 3 | How deep to go per phrase (1 to 10). Each page adds roughly seven to eleven profiles |\n| `country` | string | `nl` | Two-letter code. Picks the search market and the language LinkedIn serves the profile in |\n| `language` | string | `en` | Two-letter language code for the search |\n| `concurrency` | integer | 3 | Profiles read at once (1 to 8) |\n| `attempts` | integer | 5 | Retries for a profile that refuses before it is marked `blocked` |\n\nGive at least one search phrase or one profile URL. The form prefills a search phrase; API runs without either field return `bad_input`.\n\n## Output example\n\n```json\n{\n  \"profile_url\": \"https://www.linkedin.com/in/williamhgates\",\n  \"slug\": \"williamhgates\",\n  \"handle\": \"williamhgates\",\n  \"name\": \"Bill Gates\",\n  \"first_name\": \"Bill\",\n  \"last_name\": \"Gates\",\n  \"current_company\": \"Gates Foundation\",\n  \"location\": \"Seattle, Washington, United States\",\n  \"followers\": \"41M\",\n  \"connections\": \"8\",\n  \"followers_count\": 41000000,\n  \"connections_count\": 8,\n  \"about\": \"Chair of the Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft…\",\n  \"positions\": [\n    {\n      \"title\": null,\n      \"company\": \"Gates Foundation\",\n      \"location\": null,\n      \"dates\": null,\n      \"is_current\": true\n    }\n  ],\n  \"position_count\": 1,\n  \"education\": [\n    {\n      \"school\": \"Harvard University\",\n      \"degree\": null,\n      \"dates\": \"1973 - 1975\"\n    }\n  ],\n  \"photo_url\": \"https://media.licdn.com/dms/image/v2/D5603AQF-RYZP55jmXA/profile-displayphoto-shrink_200_200/B56ZRi8g.aGsAY-/0/1736826818802?e=2147483647&v=beta&t=bKWfN6UwwtiCqFWsG7rBELbd48qJOAMLdxhBzzkJV0k\",\n  \"titles_available\": false,\n  \"search\": null,\n  \"headline\": null,\n  \"search_title\": null,\n  \"search_snippet\": null,\n  \"fetched\": true,\n  \"error\": null,\n  \"duration_seconds\": 3.07,\n  \"position\": 1,\n  \"source\": \"linkedin-profile-scraper\",\n  \"platform\": \"linkedin\",\n  \"fetched_at\": \"2026-10-02T18:43:58.546Z\"\n}\n```\n\nThis is an actual profile row retrieved on 2 October 2026 with the profile URL input.\nFields from the search index appear when using people searches.\n\nThe original `followers` and `connections` fields remain displayed strings. Numeric equivalents are available as `followers_count` and `connections_count`; a displayed `500+` becomes the lower bound 500. `handle` is the decoded public profile slug, and `fetched_at` records when the row was read.\n\n## How to search LinkedIn profiles well\n\nWrite the phrase the way the person would describe themselves, because that is\nwhat the index matched on. `head of procurement retail germany` works;\n`decision maker in supply chain` does not, because nobody writes that on their\nprofile. Add the country or city to the phrase and set `country` to match.\n\nA Dutch profile read with `country: nl` comes back with Dutch labels. Set the\ncountry of the people you are after, not your own.\n\n## Use cases\n\n**Lead lists for B2B sales.** Search `ecommerce manager netherlands` or\n`head of marketing fashion germany`, and you get names, current employers and\nroles in one table, ready to match against your CRM. Because the employer comes\nfrom the live page and the role from the index, you can check a lead is still\nat the company before you write to them.\n\n**Recruiting and talent mapping.** Run a phrase per role and region, keep\n`location`, `education` and `positions`, and you have a map of who does a job in\na market and where they came from, without a Recruiter seat.\n\n**Enriching a list you already have.** Paste the profile URLs from your CRM or a\nspreadsheet into `profileUrls`. Each comes back with current employer, location,\nfollower count and About text, so stale records show up as a changed\n`current_company`.\n\n**Creator and executive research.** Follower counts and About texts for a list\nof named people, for influencer shortlists or for a briefing before a meeting.\n\n## How this LinkedIn profile scraper compares\n\n| | This actor | harvestapi/linkedin-profile-scraper | harvestapi/linkedin-profile-search |\n|---|---|---|---|\n| Per profile | **$0,004** | $0,004 | $0,004 (Free plan) |\n| Search pages | **not billed** | search is a separate actor | $0,10 per page (Free plan) |\n| Run start | $0,003 | none | none |\n| Emails | no | $0,01 per profile with email | $0,01 per profile with email |\n| Cookies or login needed | no | no | no |\n\nPrices from the Apify Store on 2 October 2026. Where they are ahead: they\nhave far more users and reviews, and they sell email lookup, which this actor\ndoes not. Where this one fits: people search where you pay per profile read and\nnothing for the search pages.\n\n## Pricing\n\nPay per event. `profile` costs $0,004 for each profile actually read, $4,00 per\n1.000, and `run_start` costs $0,003 once per run. **Profiles that could not be\nread are not billed**: they still appear as rows with `fetched: false` and what\nthe index knew. You only pay for results you receive, with no per-compute-unit\ncharges.\n\nOn the Apify Free plan a run returns at most 10 profiles, at the same prices.\nOn a paid Apify plan `maxProfiles` applies in full, up to 1.000 per run.\n\n## Limits and gotchas\n\n- **No job titles or dates per position.** See above; `headline` is the role.\n- **`headline` only comes with search.** A profile passed as a URL has no index\n  entry attached, so its row has the employer but no headline.\n- **Access can change without warning.** If a run that worked last week returns\n  `blocked` for every profile, LinkedIn changed something; it is not your\n  phrase. Compare `profilesRead` with `profilesFound` in the run summary.\n- **Raise `attempts` if some profiles come back `blocked`.**\n- **Private and restricted profiles are not read**, by design.\n- **Search depth is bounded by the index**: roughly seven to eleven profiles per\n  page, up to ten pages per phrase.\n\n| Error code | Meaning |\n|---|---|\n| `blocked` | The profile could not be read after every attempt |\n| `search_failed` | The index could not be searched for that phrase |\n| `no_results` | Nothing matched and no URLs were given |\n| `bad_input` | Neither a search phrase nor a URL was given |\n\n## FAQ\n\n**Can I scrape LinkedIn profiles without cookies?**\nYes. This actor needs no LinkedIn account and no session cookie, so there is no\naccount of yours to get restricted.\n\n**Can I search LinkedIn people by job title and country?**\nYes, as a phrase: `ecommerce manager netherlands`. Each phrase runs against the\npublic profile index and returns the matching profiles.\n\n**Does this LinkedIn scraper return email addresses?**\nNo. It returns public profile data only.\n\n**Why are job titles missing from the positions?**\nLinkedIn does not send them to visitors who are not signed in. The role you get\nis the `headline` from the search index.\n\n**Is this a LinkedIn profile API?**\nIt works as one. Start a run through the Apify API with your phrases or profile\nURLs and read the rows from the dataset as JSON or CSV. It does not use the\nofficial LinkedIn API, which needs a partner agreement and does not offer people\nsearch to outsiders.\n\n**How many profiles can one run return?**\nUp to `maxProfiles`, at most 1.000. A search phrase yields roughly seven to eleven\nprofiles per page and up to ten pages, so use several phrases for larger lists.\n\n**Is there a free LinkedIn scraper option?**\nYou can try this one with the monthly credit that comes with an Apify Free plan\naccount. Free-plan runs return up to 10 profiles each, so you can check the\noutput on your own phrases before you upgrade. Search pages and unread profiles\ncost nothing on any plan.\n\n**Can I pass a list of LinkedIn profile URLs?**\nYes, in `profileUrls`, as full links or bare slugs, with or without searches in\nthe same run.\n\n## Related Actors\n\n- [LinkedIn Jobs Scraper](https://apify.com/s-r/linkedin-jobs-scraper): job postings by keyword and location\n- [LinkedIn Ads Library](https://apify.com/s-r/linkedin-ads-library): what a company is advertising on LinkedIn\n"
    },
    "buildNumber": "0.2.6",
    "imageDigest": "ca6badd357e0930209c6fd7dd7cc4b0e21b865f60aac29ab0b83ba7c299a81a0",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "0.2"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.01510111111111111
    }
  }
}