{
  "data": {
    "id": "nLBqa5c89m1s4OEZU",
    "actId": "ZULHnAPmjl95HRtmf",
    "userId": "Cv2vTFhmZ5EPfTT5S",
    "startedAt": "2026-10-16T05:09:15.836Z",
    "finishedAt": "2026-10-16T05:09:27.701Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 11766,
      "runTimeSecs": 11.766,
      "computeUnits": 0.013073333333333333,
      "imageSizeBytes": 588981248
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"LinkedIn Profile Scraper\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"profileUrls\": {\n      \"title\": \"Profile URLs or identifiers\",\n      \"type\": \"array\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"minItems\": 1,\n      \"maxItems\": 1000,\n      \"description\": \"Public profile URLs on LinkedIn country hosts, or bare public identifiers. Duplicates are removed. Invalid entries return a free reason row.\",\n      \"prefill\": [\n        \"williamhgates\"\n      ]\n    },\n    \"maxConcurrency\": {\n      \"title\": \"Maximum concurrency\",\n      \"type\": \"integer\",\n      \"default\": 5,\n      \"minimum\": 1,\n      \"maximum\": 20,\n      \"description\": \"Maximum simultaneous profile fetches.\"\n    },\n    \"findEmail\": {\n      \"title\": \"Find work email\",\n      \"type\": \"boolean\",\n      \"default\": false,\n      \"editor\": \"hidden\",\n      \"description\": \"Resolve the current company domain and check a work email. Only verified addresses incur the profile-email event.\"\n    },\n    \"proxyConfiguration\": {\n      \"title\": \"Residential proxy\",\n      \"type\": \"object\",\n      \"editor\": \"proxy\",\n      \"description\": \"Apify RESIDENTIAL is required. Direct, custom and datacenter proxies are refused.\",\n      \"default\": {\n        \"useApifyProxy\": true,\n        \"apifyProxyGroups\": [\n          \"RESIDENTIAL\"\n        ],\n        \"apifyProxyCountry\": \"US\"\n      }\n    }\n  },\n  \"required\": [\n    \"profileUrls\"\n  ]\n}",
    "readme": "# LinkedIn Profile Scraper: public profiles by URL, no login, no cookies\n\n[![Run on Apify](https://apify.com/actor-badge?actor=agnes.developer.queen/linkedin-profile-scraper)](https://apify.com/agnes.developer.queen/linkedin-profile-scraper)\n\nThis LinkedIn profile scraper takes a list of profile URLs or public identifiers and returns what each public profile shows a logged out visitor: name, headline, location, current and past companies, education, followers and more. It never logs in and requires no account cookies. You pay $0.003 per readable profile, which is $3 per 1,000. Private, missing and failed profiles are free.\n\nLimits: up to 1,000 profile URLs per run, and a residential proxy is required. It does not return emails, phone numbers, connections or anything behind the login wall, and it is not a full work history tool.\n\nMeasured on Apify on October 7, 2026, with 50 profile URLs that were already known to be public: 49 of 50 came back readable and were charged, and the one network failure was free. Network errors now get one retry, like blocked requests. On the 49 profiles: name, location and photo 49, followers 46, headline and current company 40, past companies 34, education 28, about 22, languages 18. LinkedIn shows full job titles and dates to logged out visitors on only a few profiles (2 of 49 here). These are measured results, not a promise of coverage.\n\n## What you get\n\nOne row per unique profile, plus a free reason row for each invalid input item. Equivalent URLs are deduplicated. Missing source values are `null`.\n\n| Field | What it holds |\n| --- | --- |\n| `input` | First supplied value for the profile, or the rejected item |\n| `profileUrl`, `publicIdentifier` | Normalized profile URL and public identifier |\n| `status` | `ok`, `not_public`, `not_found`, `invalid_input` or `failed` |\n| `fullName`, `firstName`, `lastName` | Public name; first and last names use published components where available, otherwise a split of the full name |\n| `headline` | Published page headline, with listed role titles as fallback |\n| `location` | Published profile location |\n| `about` | Public About text, with the source description as fallback |\n| `profilePictureUrl` | Public profile picture URL |\n| `currentCompany`, `currentCompanyLinkedinUrl` | First current employer listed in the source and its LinkedIn company URL |\n| `experience` | LinkedIn shows logged out visitors full job titles and dates on only some profiles, while past companies come from the page's structured data. |\n| `pastCompanies` | Past employers in page order with `company`, `linkedinUrl`, `startDate`, `endDate` and plain text `description` capped at 500 characters; dates retain their source values |\n| `followers` | Integer follower count from the page's structured data |\n| `education` | Entries with `schoolName`, `degree`, `dates` and `url` |\n| `skills` | Skills listed in the public view, when available |\n| `languages` | Language names from the page's structured data |\n| `awards` | Award names from the page's structured data |\n| `organizations` | Membership organization names from the page's structured data |\n| `websites` | Website URLs from the page's structured data, excluding LinkedIn URLs |\n| `charged`, `reason` | Whether the row uses a paid event and an explanation for free rows |\n| `scrapedAt` | Collection timestamp in UTC |\n\nA readable profile can have missing sections. Private fields, connections, private contact details and content behind login are not collected. `RUN_SUMMARY` and `DIAGNOSTICS` report outcomes, request counts, response bytes, retries and the stop reason outside the profile dataset.\n\n## Try it in 30 seconds\n\n1. Open this actor's Input tab in Apify Console.\n2. Paste public LinkedIn profile URLs or identifiers.\n3. Leave the residential proxy default selected and click Start.\n4. Download the dataset as JSON, CSV or Excel.\n\n```json\n{\n  \"profileUrls\": [\n    \"https://www.linkedin.com/in/williamhgates\",\n    \"satyanadella\"\n  ],\n  \"maxConcurrency\": 5\n}\n```\n\n## Example output\n\nSelected fields from the Bill Gates fixture captured on October 7, 2026. This example shows a paid profile row. A delivered row includes all standard fields, including missing values.\n\n```json\n{\n  \"input\": \"williamhgates\",\n  \"profileUrl\": \"https://www.linkedin.com/in/williamhgates\",\n  \"publicIdentifier\": \"williamhgates\",\n  \"status\": \"ok\",\n  \"fullName\": \"Bill Gates\",\n  \"firstName\": \"Bill\",\n  \"lastName\": \"Gates\",\n  \"headline\": \"Chair, Gates Foundation and Founder, Breakthrough Energy\",\n  \"location\": \"Seattle, Washington, United States\",\n  \"currentCompany\": \"Gates Foundation\",\n  \"currentCompanyLinkedinUrl\": \"https://www.linkedin.com/company/gates-foundation\",\n  \"education\": [\n    {\n      \"schoolName\": \"Harvard University\",\n      \"degree\": null,\n      \"dates\": \"1973 - 1975\",\n      \"url\": \"https://www.linkedin.com/school/harvard-university/\"\n    },\n    {\n      \"schoolName\": \"Lakeside School\",\n      \"degree\": null,\n      \"dates\": null,\n      \"url\": \"https://www.linkedin.com/school/lakeside-school/\"\n    }\n  ],\n  \"charged\": true,\n  \"reason\": null\n}\n```\n\n## Pricing\n\n| Event | When it applies | Price |\n| --- | --- | --- |\n| `profile` | Each delivered row with status `ok` | $0.003 |\n| `apify-actor-start` | Platform start event, one per GB of run memory, minimum one | $0.00005 |\n\n1,000 readable profiles cost 1,000 x $0.003 = $3.00, plus $0.00005 for the run start at the default 512 MB of memory. Every Apify account gets $5 of free platform credit each month, about 1,660 profiles at this price. Profile rows with status `not_public`, `not_found`, `invalid_input` or `failed` are free and have `charged: false`. Duplicate profiles are neither delivered nor charged twice within a run.\n\nThe actor checks the remaining spending limit before every dataset write. If the next row is unaffordable, it stops with reason `budget`. A dataset write precedes its charge. An uncertain write or charge stops the run for review; it is never retried automatically by the actor. On an uncertain charge, the last row's `charged` flag describes the intended charge and must be reconciled with the run's event log.\n\n## Input\n\n| Field | Type | Default | What it does |\n| --- | --- | --- | --- |\n| `profileUrls` | array of strings | required | From 1 to 1,000 URLs or public identifiers. Country hosts, trailing slash, query and fragment are accepted. |\n| `maxConcurrency` | integer | 5 | From 1 to 20 simultaneous profile fetches. |\n| `proxyConfiguration` | object | Apify RESIDENTIAL, US | Residential proxy is required. Direct, custom and datacenter proxies are refused. |\n\nURLs normalize to `https://www.linkedin.com/in/<identifier>` without a trailing slash. Bare identifiers cannot contain dots. Member identifiers beginning with `ACo` retain their case. An invalid item produces a free reason row while the remaining inputs continue. Input array limits and invalid run settings fail validation before collection begins.\n\n## Use cases\n\n- Lead list hygiene: check where each contact works now, and what their headline says, before a campaign goes out.\n- Recruiting: refresh public professional information for a list of candidates.\n- CRM maintenance: update public company and role information for known profile URLs.\n- Research: compare published career histories and education.\n- Data cleanup: normalize profile URLs and identify profiles unavailable to public visitors.\n\n## Integrations\n\nActor: `agnes.developer.queen/linkedin-profile-scraper`.\n\nAPI:\n\n```bash\ncurl -X POST \"https://api.apify.com/v2/acts/agnes.developer.queen~linkedin-profile-scraper/run-sync-get-dataset-items\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"profileUrls\":[\"williamhgates\"]}'\n```\n\nPython:\n\n```python\nimport os\nfrom apify_client import ApifyClient\n\nclient = ApifyClient(os.environ[\"APIFY_TOKEN\"])\nrun = client.actor(\"agnes.developer.queen/linkedin-profile-scraper\").call(\n    run_input={\"profileUrls\": [\"williamhgates\"]}\n)\nfor profile in client.dataset(run[\"defaultDatasetId\"]).iterate_items():\n    print(profile[\"fullName\"], profile[\"status\"])\n```\n\nNode.js:\n\n```js\nimport { ApifyClient } from 'apify-client';\nconst client = new ApifyClient({ token: process.env.APIFY_TOKEN });\nconst run = await client.actor('agnes.developer.queen/linkedin-profile-scraper').call({\n    profileUrls: ['williamhgates'],\n});\nconst { items } = await client.dataset(run.defaultDatasetId).listItems();\nconsole.log(items);\n```\n\nIn n8n, use the Apify integration or an HTTP Request node with the API example. In Make, run the actor through the Apify app and fetch its dataset items. In Zapier, trigger the next step when an Apify run succeeds. Map the stable fields to a spreadsheet, ATS or CRM.\n\nAI assistants and MCP clients can call the Actor as a tool through the Apify MCP server:\n\nhttps://mcp.apify.com/?tools=agnes.developer.queen/linkedin-profile-scraper\n\n## FAQ\n\n### How much does it cost to scrape 1,000 LinkedIn profiles?\n\n$3.00 for 1,000 readable profiles, plus $0.00005 per run at the default memory. Private, missing, invalid and failed profiles are free.\n\n### Does it require a LinkedIn login?\n\nNo. The actor never logs in and does not accept account cookies. It reads public profiles only.\n\n### Will every URL return a profile?\n\nNo. A login wall or a blocked response can produce `not_public`. A missing page produces `not_found`. Transport and unexpected response failures produce `failed`. Each is free and includes a reason.\n\n### Why are experience, skills or education missing?\n\nThe public page may omit those sections. The actor returns only visible source information and leaves unavailable values null. It does not infer a full career history.\n\n### Does it return emails or phone numbers?\n\nNo. It returns the public profile only. Contact details are not collected, and the `email`, `emailStatus` and `emailPattern` columns stay null.\n\n### Why did the run stop early?\n\nThe spending limit or run deadline can stop collection. The actor reserves 30 seconds before the deadline to finish and save records. An uncertain dataset write or charge also stops delivery. See `RUN_SUMMARY` and `DIAGNOSTICS`. A restarted run skips completed deliveries and continues with the remaining inputs. An unresolved pending delivery stops the run for review before collection resumes. Summary outcome counts describe the current process.\n\n### Is this legal to use?\n\nThe actor collects public profiles only, accesses no private data and never logs in. Follow LinkedIn's terms and the privacy law that applies to your use. Public availability does not remove your obligations when collecting, storing or using personal information.\n\n## Related actors\n\n- [LinkedIn People Search Scraper](https://apify.com/agnes.developer.queen/linkedin-people-search-scraper) finds public profiles by job title, company and location.\n- [LinkedIn Company Scraper](https://apify.com/agnes.developer.queen/linkedin-company-scraper) returns company facts from a URL, slug or name.\n- [LinkedIn New Hires Finder](https://apify.com/agnes.developer.queen/linkedin-new-hires-finder) lists decision makers who joined a company recently.\n\n## Support\n\nInclude your input, run ID, `RUN_SUMMARY` and `DIAGNOSTICS` when reporting a problem through the actor's Issues tab. Do not include API tokens or proxy credentials.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "linkedin-profile-scraper",
      "title": "LinkedIn Profile Scraper: Public Profiles by URL, No Login",
      "description": "LinkedIn profile scraper with no login or cookies. Paste profile URLs and get name, headline, location, current and past companies, education and followers. $3 per 1,000 profiles, private ones free.",
      "version": "0.1",
      "buildTag": "latest",
      "input": {
        "title": "LinkedIn Profile Scraper",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "profileUrls": {
            "title": "Profile URLs or identifiers",
            "type": "array",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "maxItems": 1000,
            "description": "Public profile URLs on LinkedIn country hosts, or bare public identifiers. Duplicates are removed. Invalid entries return a free reason row.",
            "prefill": [
              "williamhgates"
            ]
          },
          "maxConcurrency": {
            "title": "Maximum concurrency",
            "type": "integer",
            "default": 5,
            "minimum": 1,
            "maximum": 20,
            "description": "Maximum simultaneous profile fetches."
          },
          "findEmail": {
            "title": "Find work email",
            "type": "boolean",
            "default": false,
            "editor": "hidden",
            "description": "Resolve the current company domain and check a work email. Only verified addresses incur the profile-email event."
          },
          "proxyConfiguration": {
            "title": "Residential proxy",
            "type": "object",
            "editor": "proxy",
            "description": "Apify RESIDENTIAL is required. Direct, custom and datacenter proxies are refused.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "US"
            }
          }
        },
        "required": [
          "profileUrls"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Public profile results",
        "properties": {
          "dataset": {
            "type": "string",
            "title": "Profiles",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          },
          "summary": {
            "type": "string",
            "title": "Run summary",
            "template": "{{links.apiDefaultKeyValueStoreUrl}}/records/RUN_SUMMARY"
          },
          "diagnostics": {
            "type": "string",
            "title": "Diagnostics",
            "template": "{{links.apiDefaultKeyValueStoreUrl}}/records/DIAGNOSTICS"
          }
        }
      },
      "dockerfile": "../Dockerfile",
      "defaultRunOptions": {
        "memoryMbytes": 512,
        "timeoutSecs": 3600
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "title": "Public profiles",
          "fields": {
            "type": "object",
            "properties": {
              "input": {},
              "profileUrl": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "publicIdentifier": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "status": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "fullName": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "firstName": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "lastName": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "headline": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "location": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "about": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "profilePictureUrl": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "currentCompany": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "currentCompanyLinkedinUrl": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "email": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "emailStatus": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "emailPattern": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "reason": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "scrapedAt": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "charged": {
                "type": "boolean"
              },
              "experience": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "object",
                  "properties": {
                    "title": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "company": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "location": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "dateRange": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "duration": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  }
                }
              },
              "education": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "object",
                  "properties": {
                    "schoolName": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "degree": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "dates": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "url": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  }
                }
              },
              "skills": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                }
              },
              "pastCompanies": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "object",
                  "properties": {
                    "company": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "linkedinUrl": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "startDate": {
                      "type": [
                        "string",
                        "number",
                        "null"
                      ]
                    },
                    "endDate": {
                      "type": [
                        "string",
                        "number",
                        "null"
                      ]
                    },
                    "description": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "maxLength": 500
                    }
                  }
                }
              },
              "followers": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "languages": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                }
              },
              "awards": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                }
              },
              "organizations": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                }
              },
              "websites": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                }
              }
            }
          },
          "views": {
            "overview": {
              "title": "Profiles",
              "transformation": {
                "fields": [
                  "fullName",
                  "headline",
                  "location",
                  "currentCompany",
                  "pastCompanies",
                  "followers",
                  "status"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "fullName": {
                    "label": "Name",
                    "format": "text"
                  },
                  "headline": {
                    "label": "Headline",
                    "format": "text"
                  },
                  "location": {
                    "label": "Location",
                    "format": "text"
                  },
                  "currentCompany": {
                    "label": "Company",
                    "format": "text"
                  },
                  "status": {
                    "label": "Status",
                    "format": "text"
                  },
                  "pastCompanies": {
                    "label": "Past companies",
                    "format": "array"
                  },
                  "followers": {
                    "label": "Followers",
                    "format": "number"
                  }
                }
              }
            }
          }
        }
      },
      "readme": "# LinkedIn Profile Scraper: public profiles by URL, no login, no cookies\n\n[![Run on Apify](https://apify.com/actor-badge?actor=agnes.developer.queen/linkedin-profile-scraper)](https://apify.com/agnes.developer.queen/linkedin-profile-scraper)\n\nThis LinkedIn profile scraper takes a list of profile URLs or public identifiers and returns what each public profile shows a logged out visitor: name, headline, location, current and past companies, education, followers and more. It never logs in and requires no account cookies. You pay $0.003 per readable profile, which is $3 per 1,000. Private, missing and failed profiles are free.\n\nLimits: up to 1,000 profile URLs per run, and a residential proxy is required. It does not return emails, phone numbers, connections or anything behind the login wall, and it is not a full work history tool.\n\nMeasured on Apify on October 7, 2026, with 50 profile URLs that were already known to be public: 49 of 50 came back readable and were charged, and the one network failure was free. Network errors now get one retry, like blocked requests. On the 49 profiles: name, location and photo 49, followers 46, headline and current company 40, past companies 34, education 28, about 22, languages 18. LinkedIn shows full job titles and dates to logged out visitors on only a few profiles (2 of 49 here). These are measured results, not a promise of coverage.\n\n## What you get\n\nOne row per unique profile, plus a free reason row for each invalid input item. Equivalent URLs are deduplicated. Missing source values are `null`.\n\n| Field | What it holds |\n| --- | --- |\n| `input` | First supplied value for the profile, or the rejected item |\n| `profileUrl`, `publicIdentifier` | Normalized profile URL and public identifier |\n| `status` | `ok`, `not_public`, `not_found`, `invalid_input` or `failed` |\n| `fullName`, `firstName`, `lastName` | Public name; first and last names use published components where available, otherwise a split of the full name |\n| `headline` | Published page headline, with listed role titles as fallback |\n| `location` | Published profile location |\n| `about` | Public About text, with the source description as fallback |\n| `profilePictureUrl` | Public profile picture URL |\n| `currentCompany`, `currentCompanyLinkedinUrl` | First current employer listed in the source and its LinkedIn company URL |\n| `experience` | LinkedIn shows logged out visitors full job titles and dates on only some profiles, while past companies come from the page's structured data. |\n| `pastCompanies` | Past employers in page order with `company`, `linkedinUrl`, `startDate`, `endDate` and plain text `description` capped at 500 characters; dates retain their source values |\n| `followers` | Integer follower count from the page's structured data |\n| `education` | Entries with `schoolName`, `degree`, `dates` and `url` |\n| `skills` | Skills listed in the public view, when available |\n| `languages` | Language names from the page's structured data |\n| `awards` | Award names from the page's structured data |\n| `organizations` | Membership organization names from the page's structured data |\n| `websites` | Website URLs from the page's structured data, excluding LinkedIn URLs |\n| `charged`, `reason` | Whether the row uses a paid event and an explanation for free rows |\n| `scrapedAt` | Collection timestamp in UTC |\n\nA readable profile can have missing sections. Private fields, connections, private contact details and content behind login are not collected. `RUN_SUMMARY` and `DIAGNOSTICS` report outcomes, request counts, response bytes, retries and the stop reason outside the profile dataset.\n\n## Try it in 30 seconds\n\n1. Open this actor's Input tab in Apify Console.\n2. Paste public LinkedIn profile URLs or identifiers.\n3. Leave the residential proxy default selected and click Start.\n4. Download the dataset as JSON, CSV or Excel.\n\n```json\n{\n  \"profileUrls\": [\n    \"https://www.linkedin.com/in/williamhgates\",\n    \"satyanadella\"\n  ],\n  \"maxConcurrency\": 5\n}\n```\n\n## Example output\n\nSelected fields from the Bill Gates fixture captured on October 7, 2026. This example shows a paid profile row. A delivered row includes all standard fields, including missing values.\n\n```json\n{\n  \"input\": \"williamhgates\",\n  \"profileUrl\": \"https://www.linkedin.com/in/williamhgates\",\n  \"publicIdentifier\": \"williamhgates\",\n  \"status\": \"ok\",\n  \"fullName\": \"Bill Gates\",\n  \"firstName\": \"Bill\",\n  \"lastName\": \"Gates\",\n  \"headline\": \"Chair, Gates Foundation and Founder, Breakthrough Energy\",\n  \"location\": \"Seattle, Washington, United States\",\n  \"currentCompany\": \"Gates Foundation\",\n  \"currentCompanyLinkedinUrl\": \"https://www.linkedin.com/company/gates-foundation\",\n  \"education\": [\n    {\n      \"schoolName\": \"Harvard University\",\n      \"degree\": null,\n      \"dates\": \"1973 - 1975\",\n      \"url\": \"https://www.linkedin.com/school/harvard-university/\"\n    },\n    {\n      \"schoolName\": \"Lakeside School\",\n      \"degree\": null,\n      \"dates\": null,\n      \"url\": \"https://www.linkedin.com/school/lakeside-school/\"\n    }\n  ],\n  \"charged\": true,\n  \"reason\": null\n}\n```\n\n## Pricing\n\n| Event | When it applies | Price |\n| --- | --- | --- |\n| `profile` | Each delivered row with status `ok` | $0.003 |\n| `apify-actor-start` | Platform start event, one per GB of run memory, minimum one | $0.00005 |\n\n1,000 readable profiles cost 1,000 x $0.003 = $3.00, plus $0.00005 for the run start at the default 512 MB of memory. Every Apify account gets $5 of free platform credit each month, about 1,660 profiles at this price. Profile rows with status `not_public`, `not_found`, `invalid_input` or `failed` are free and have `charged: false`. Duplicate profiles are neither delivered nor charged twice within a run.\n\nThe actor checks the remaining spending limit before every dataset write. If the next row is unaffordable, it stops with reason `budget`. A dataset write precedes its charge. An uncertain write or charge stops the run for review; it is never retried automatically by the actor. On an uncertain charge, the last row's `charged` flag describes the intended charge and must be reconciled with the run's event log.\n\n## Input\n\n| Field | Type | Default | What it does |\n| --- | --- | --- | --- |\n| `profileUrls` | array of strings | required | From 1 to 1,000 URLs or public identifiers. Country hosts, trailing slash, query and fragment are accepted. |\n| `maxConcurrency` | integer | 5 | From 1 to 20 simultaneous profile fetches. |\n| `proxyConfiguration` | object | Apify RESIDENTIAL, US | Residential proxy is required. Direct, custom and datacenter proxies are refused. |\n\nURLs normalize to `https://www.linkedin.com/in/<identifier>` without a trailing slash. Bare identifiers cannot contain dots. Member identifiers beginning with `ACo` retain their case. An invalid item produces a free reason row while the remaining inputs continue. Input array limits and invalid run settings fail validation before collection begins.\n\n## Use cases\n\n- Lead list hygiene: check where each contact works now, and what their headline says, before a campaign goes out.\n- Recruiting: refresh public professional information for a list of candidates.\n- CRM maintenance: update public company and role information for known profile URLs.\n- Research: compare published career histories and education.\n- Data cleanup: normalize profile URLs and identify profiles unavailable to public visitors.\n\n## Integrations\n\nActor: `agnes.developer.queen/linkedin-profile-scraper`.\n\nAPI:\n\n```bash\ncurl -X POST \"https://api.apify.com/v2/acts/agnes.developer.queen~linkedin-profile-scraper/run-sync-get-dataset-items\" \\\n  -H \"Authorization: Bearer $APIFY_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"profileUrls\":[\"williamhgates\"]}'\n```\n\nPython:\n\n```python\nimport os\nfrom apify_client import ApifyClient\n\nclient = ApifyClient(os.environ[\"APIFY_TOKEN\"])\nrun = client.actor(\"agnes.developer.queen/linkedin-profile-scraper\").call(\n    run_input={\"profileUrls\": [\"williamhgates\"]}\n)\nfor profile in client.dataset(run[\"defaultDatasetId\"]).iterate_items():\n    print(profile[\"fullName\"], profile[\"status\"])\n```\n\nNode.js:\n\n```js\nimport { ApifyClient } from 'apify-client';\nconst client = new ApifyClient({ token: process.env.APIFY_TOKEN });\nconst run = await client.actor('agnes.developer.queen/linkedin-profile-scraper').call({\n    profileUrls: ['williamhgates'],\n});\nconst { items } = await client.dataset(run.defaultDatasetId).listItems();\nconsole.log(items);\n```\n\nIn n8n, use the Apify integration or an HTTP Request node with the API example. In Make, run the actor through the Apify app and fetch its dataset items. In Zapier, trigger the next step when an Apify run succeeds. Map the stable fields to a spreadsheet, ATS or CRM.\n\nAI assistants and MCP clients can call the Actor as a tool through the Apify MCP server:\n\nhttps://mcp.apify.com/?tools=agnes.developer.queen/linkedin-profile-scraper\n\n## FAQ\n\n### How much does it cost to scrape 1,000 LinkedIn profiles?\n\n$3.00 for 1,000 readable profiles, plus $0.00005 per run at the default memory. Private, missing, invalid and failed profiles are free.\n\n### Does it require a LinkedIn login?\n\nNo. The actor never logs in and does not accept account cookies. It reads public profiles only.\n\n### Will every URL return a profile?\n\nNo. A login wall or a blocked response can produce `not_public`. A missing page produces `not_found`. Transport and unexpected response failures produce `failed`. Each is free and includes a reason.\n\n### Why are experience, skills or education missing?\n\nThe public page may omit those sections. The actor returns only visible source information and leaves unavailable values null. It does not infer a full career history.\n\n### Does it return emails or phone numbers?\n\nNo. It returns the public profile only. Contact details are not collected, and the `email`, `emailStatus` and `emailPattern` columns stay null.\n\n### Why did the run stop early?\n\nThe spending limit or run deadline can stop collection. The actor reserves 30 seconds before the deadline to finish and save records. An uncertain dataset write or charge also stops delivery. See `RUN_SUMMARY` and `DIAGNOSTICS`. A restarted run skips completed deliveries and continues with the remaining inputs. An unresolved pending delivery stops the run for review before collection resumes. Summary outcome counts describe the current process.\n\n### Is this legal to use?\n\nThe actor collects public profiles only, accesses no private data and never logs in. Follow LinkedIn's terms and the privacy law that applies to your use. Public availability does not remove your obligations when collecting, storing or using personal information.\n\n## Related actors\n\n- [LinkedIn People Search Scraper](https://apify.com/agnes.developer.queen/linkedin-people-search-scraper) finds public profiles by job title, company and location.\n- [LinkedIn Company Scraper](https://apify.com/agnes.developer.queen/linkedin-company-scraper) returns company facts from a URL, slug or name.\n- [LinkedIn New Hires Finder](https://apify.com/agnes.developer.queen/linkedin-new-hires-finder) lists decision makers who joined a company recently.\n\n## Support\n\nInclude your input, run ID, `RUN_SUMMARY` and `DIAGNOSTICS` when reporting a problem through the actor's Issues tab. Do not include API tokens or proxy credentials.\n"
    },
    "buildNumber": "0.1.5",
    "imageDigest": "b141a0c3d609d7fa6fa4ea0b8fd53710b2e0855a0addfacd6a9f18429886c47e",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "0.1"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.013073333333333333
    }
  }
}