{
  "data": {
    "id": "Z2bxKzOWLWWrfU3rQ",
    "actId": "9GIYyKLd4Qn2ddnp4",
    "userId": "2phKDM7xAafBPoq52",
    "startedAt": "2026-09-01T09:58:04.544Z",
    "finishedAt": "2026-09-01T09:58:17.742Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 13133,
      "runTimeSecs": 13.133,
      "computeUnits": 0.014592222222222222,
      "imageSizeBytes": 543952384
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"LinkedIn Profile Scraper\",\n  \"description\": \"Extract structured data from LinkedIn profile pages. Provide profile URLs or usernames.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"profiles\": {\n      \"title\": \"Profile URLs or Usernames\",\n      \"type\": \"array\",\n      \"description\": \"LinkedIn profile URLs (e.g. https://www.linkedin.com/in/williamhgates/) or just the username (e.g. williamhgates).\",\n      \"editor\": \"stringList\",\n      \"prefill\": [\n        \"https://www.linkedin.com/in/williamhgates\"\n      ]\n    },\n    \"maxResults\": {\n      \"title\": \"Max Results\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of profiles to scrape. Set to 0 for all provided. Note: LinkedIn rate-limits per exit IP (roughly 50-60 profiles per IP per 15 minutes), so very large batches will return some rows as errors. Split big lists across separate runs for the best hit rate.\",\n      \"default\": 0,\n      \"minimum\": 0,\n      \"maximum\": 10000,\n      \"editor\": \"number\"\n    },\n    \"maxConcurrency\": {\n      \"title\": \"Max Concurrency\",\n      \"type\": \"integer\",\n      \"description\": \"How many profiles to fetch in parallel. LinkedIn rate-limits per exit IP, so higher is not always faster.\",\n      \"default\": 6,\n      \"minimum\": 1,\n      \"maximum\": 10,\n      \"editor\": \"number\"\n    }\n  }\n}",
    "readme": "## LinkedIn profile scraper: profiles, education, posts and similar profiles\n\nPaste LinkedIn profile URLs or usernames. Get one clean row per person: name, location, employer, education history, follower count, recent posts and articles.\n\n**From $3 per 1,000 profiles. No login, no cookies, no browser, no proxy setup.**\n\nBlocked and not-found profiles are never charged.\n\n## Why this scraper?\n\n- 🔓 **No account, ever.** You don't hand over cookies and we don't run a login. Nothing to get your LinkedIn account restricted.\n- 🎓 **Full education history, not just the top line.** LinkedIn hides most school names from logged-out visitors but still publishes the dates. Most scrapers return one school. This one returns every entry, including the dated ones.\n- 🕸️ **20+ similar profiles on every row.** LinkedIn's own \"Other similar profiles\" block, so one seed person expands into a whole network.\n- 📰 **Recent posts and articles with reaction counts**, in the same row as the profile. No second actor, no second bill.\n- 💸 **You only pay for profiles you actually get.** Rate-limited or missing profiles come back as error rows and cost nothing.\n- ⚡ **Fast and cheap by design.** Plain HTTP on datacenter proxies. No browser to boot, no residential bandwidth to burn.\n\n## What data can you extract?\n\n| Field | Notes |\n|---|---|\n| `name` | Full name |\n| `headline` | Professional headline, as shown to logged-out visitors |\n| `location`, `countryCode` | City / region, and ISO country |\n| `photoUrl` | Full-size profile photo |\n| `profileBadge` | LinkedIn's own badge line, e.g. \"Creator, Top Voice\" |\n| `followerCount` | Exact follower number |\n| `currentCompany`, `currentCompanyUrl` | Current employer and its LinkedIn page |\n| `education[]` | School, LinkedIn school page, start and end year |\n| `awards[]`, `languages[]` | As published on the profile |\n| `websites[]` | Real destination URLs, already unwrapped from LinkedIn's redirect |\n| `recentPosts[]` | Text, URL, date, reaction count |\n| `recentArticles[]` | Headline, URL, date, reaction count, cover image |\n| `similarProfiles[]` | Usernames from \"Other similar profiles\" |\n\n## How much does the LinkedIn Profile Scraper cost?\n\nPay per profile. Two charges only: a small fee when a run starts, and one charge per profile delivered.\n\n| | Per 1,000 profiles | Run start |\n|---|---|---|\n| Free plan | $4.00 | $0.02 |\n| Starter | $3.50 | $0.01 |\n| Scale | $3.50 | $0.0075 |\n| Business and above | **$3.00** | $0.005 |\n\nApify's **$5 free monthly credit** covers roughly **1,250 profiles**. A **$29** balance on Starter covers about **8,285**.\n\nNothing else is billed. Error rows, duplicate inputs and profiles that LinkedIn refused are all free.\n\n## How to scrape LinkedIn profiles: step by step\n\n1. Click **Try for free** and open the actor.\n2. Paste profile URLs or usernames into **Profile URLs or Usernames**. Both forms work, and mixing them is fine.\n3. Optionally set **Max Results** to cap the run, or leave it at 0 for everything you pasted.\n4. Click **Start**.\n5. Download the results as JSON, CSV, Excel, or pull them from the API.\n\n## Input\n\nPaste a full URL or just the username. Duplicates are removed before anything is fetched, so the same person listed twice is only charged once.\n\n```json\n{\n  \"profiles\": [\n    \"https://www.linkedin.com/in/williamhgates\",\n    \"https://uk.linkedin.com/in/satyanadella\",\n    \"reidhoffman\"\n  ],\n  \"maxResults\": 0,\n  \"maxConcurrency\": 6\n}\n```\n\n| Field | Type | Default | What it does |\n|---|---|---|---|\n| `profiles` | array | required | Profile URLs or usernames. Country subdomains like `uk.linkedin.com` are fine. |\n| `maxResults` | integer | `0` | Stop after this many profiles. `0` means no cap. |\n| `maxConcurrency` | integer | `6` | How many profiles to fetch at once. Higher is not always faster: LinkedIn rate-limits per IP. |\n\n## Output\n\nOne row per profile. A real row from a live run:\n\n```json\n{\n  \"recordType\": \"profile\",\n  \"publicIdentifier\": \"bill-cronin-5490492\",\n  \"linkedinUrl\": \"https://www.linkedin.com/in/bill-cronin-5490492\",\n  \"name\": \"Bill Cronin\",\n  \"headline\": \"A seasoned professional with proven experience in business development, marketing…\",\n  \"location\": \"Odessa, Florida, United States\",\n  \"countryCode\": \"US\",\n  \"photoUrl\": \"https://media.licdn.com/dms/image/v2/D4E03AQGYTneXVJiSjQ/profile-displayphoto-shrink_200_200/…\",\n  \"profileBadge\": null,\n  \"followerCount\": 10812,\n  \"currentCompany\": \"Pasco Economic Development Council\",\n  \"currentCompanyUrl\": \"https://www.linkedin.com/company/pasco-economic-development-council\",\n  \"education\": [\n    {\n      \"school\": \"Harvard Kennedy School Executive Education\",\n      \"linkedinUrl\": \"https://www.linkedin.com/school/hksexeced/\",\n      \"startYear\": null,\n      \"endYear\": 2025\n    },\n    { \"school\": null, \"linkedinUrl\": null, \"startYear\": 1984, \"endYear\": 1990 },\n    { \"school\": null, \"linkedinUrl\": null, \"startYear\": 1985, \"endYear\": 1987 }\n  ],\n  \"awards\": [],\n  \"languages\": [\"Mandarin\", \"Thai\"],\n  \"websites\": [\"http://ontheroadtobangkok.blogspot.com/\"],\n  \"recentPosts\": [\n    {\n      \"text\": \"Bienvenue Monin!\",\n      \"url\": \"https://www.linkedin.com/posts/bill-cronin-5490492_monin-to-open-manufacturing-facility-in-city-activity-7482917587614511104-dusi\",\n      \"publishedAt\": \"2026-07-14T22:02:58.755Z\",\n      \"reactions\": 44\n    }\n  ],\n  \"recentArticles\": [],\n  \"similarProfiles\": [\"bobbyclark\", \"josephrrusso\", \"matthew-swift-8ba7529\", \"davidgreeley\"],\n  \"scrapedAt\": \"2026-08-28T16:57:37.839Z\"\n}\n```\n\nA profile we could not deliver comes back as an error row instead. These are free:\n\n```json\n{\n  \"recordType\": \"error\",\n  \"publicIdentifier\": \"zzz-no-such-person\",\n  \"linkedinUrl\": \"https://www.linkedin.com/in/zzz-no-such-person\",\n  \"error\": \"Could not retrieve this profile: either LinkedIn blocked the request, or no public profile exists at this URL.\",\n  \"scrapedAt\": \"2026-08-28T16:57:41.002Z\"\n}\n```\n\nFilter on `recordType` to keep the two apart.\n\n## Use cases\n\n- **Lead enrichment.** Turn a list of profile URLs into names, employers, locations and follower counts for your CRM.\n- **Recruiting research.** Map who studied where and when, and who LinkedIn considers similar to a candidate you like.\n- **Network expansion.** Feed `similarProfiles` back in as input and grow a seed list into a whole segment.\n- **Influencer and creator scouting.** Rank people by follower count and see what they actually posted, with reaction counts.\n- **Competitor talent tracking.** Watch who is publishing and how their audience responds.\n\n## Limitations\n\nWorth knowing before you buy. LinkedIn shows logged-out visitors far less than logged-in ones, and this actor never logs in.\n\n- **No job titles, skills, endorsements, certifications, emails or phone numbers.** LinkedIn does not publish these to logged-out visitors at all.\n- **Only the current employer.** Past positions and employment dates are not available publicly.\n- **The headline is truncated by LinkedIn**, not by us. Logged-out visitors get a shortened version ending in `…`.\n- **Some education entries have `school: null`.** LinkedIn hides the institution name from logged-out visitors but still publishes the dates. We keep those entries because the timeline is real data. Most scrapers drop them.\n- **Large batches return some profiles as errors.** LinkedIn rate-limits per IP, so a run of several hundred will have a share come back blocked. Those rows are free. Split very large lists across runs for the best hit rate.\n- **A missing profile and a blocked one look identical.** LinkedIn returns the same response for both, so the error message names both possibilities.\n\n## Frequently asked questions\n\n### Do I need a LinkedIn account or cookies?\n\nNo. This actor only reads pages that are visible to anyone on the open web. You never supply cookies, and no account is used, so there is nothing to get restricted.\n\n### Why is the headline cut off?\n\nThat is LinkedIn's doing. The public page shows a shortened headline with a \"see more\" button that opens a sign-in prompt rather than the rest of the text. The full version is only visible to logged-in members.\n\n### Why do some education entries have no school name?\n\nLinkedIn hides most institution names from logged-out visitors but still publishes the start and end years. We return those entries with `school: null` rather than throwing them away, so you keep the real timeline and the correct number of schools.\n\n### Why did some profiles come back as errors?\n\nLinkedIn limits how many profiles one IP can request in a short window. In a large batch some will be refused. Those rows are not charged. Running a smaller batch, or splitting a big list across several runs, raises the hit rate.\n\n### Is it legal to scrape LinkedIn?\n\nScraping public data is generally allowed in the US and most of the EU, as long as you don't collect personal data covered by GDPR or CCPA without a lawful basis. This actor only touches publicly accessible pages, but how you use the output is on you.\n\nApify's full breakdown: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/).\n\n### How much does the LinkedIn Profile Scraper cost?\n\nFrom $3 per 1,000 profiles on Business and above, $4 per 1,000 on the free plan, plus a small run-start fee. Blocked profiles, duplicates and error rows are free.\n\n### Can I integrate it with other tools?\n\nPush results into **Make, Zapier, Slack, Airbyte, GitHub, Google Sheets, Google Drive**, and more. Apify treats every actor as a webhook source, so anything that consumes webhooks or pulls from an API works.\n\nFull list: [Apify integrations](https://docs.apify.com/platform/integrations).\n\n### Can I use it with the Apify API?\n\nYes. Every run is available via the Apify REST API:\n\n```bash\ncurl -X POST \"https://api.apify.com/v2/acts/sourabhbgp~linkedin-profile-scraper/runs?token=APIFY_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"profiles\": [\"https://www.linkedin.com/in/williamhgates\"]}'\n```\n\nDocs: [Apify API reference](https://docs.apify.com/api/v2).\n\n### Can I use it through an MCP Server?\n\nYes. Apify ships an MCP server that exposes every actor as a tool, so Claude Desktop, Cursor, and any other MCP-capable client can call this scraper. Setup: [Apify MCP docs](https://docs.apify.com/platform/integrations/mcp).\n\n## Your feedback\n\nBug, missing field, or odd behavior? Drop a note in the [Issues tab](https://console.apify.com/actors/9GIYyKLd4Qn2ddnp4/issues). Reports go to a human and fixes usually ship the same week.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "linkedin-profile-scraper",
      "version": "0.1",
      "buildTag": "latest",
      "defaultMemoryMbytes": 256,
      "minMemoryMbytes": 128,
      "maxMemoryMbytes": 4096,
      "input": {
        "title": "LinkedIn Profile Scraper",
        "description": "Extract structured data from LinkedIn profile pages. Provide profile URLs or usernames.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "profiles": {
            "title": "Profile URLs or Usernames",
            "type": "array",
            "description": "LinkedIn profile URLs (e.g. https://www.linkedin.com/in/williamhgates/) or just the username (e.g. williamhgates).",
            "editor": "stringList",
            "prefill": [
              "https://www.linkedin.com/in/williamhgates"
            ]
          },
          "maxResults": {
            "title": "Max Results",
            "type": "integer",
            "description": "Maximum number of profiles to scrape. Set to 0 for all provided. Note: LinkedIn rate-limits per exit IP (roughly 50-60 profiles per IP per 15 minutes), so very large batches will return some rows as errors. Split big lists across separate runs for the best hit rate.",
            "default": 0,
            "minimum": 0,
            "maximum": 10000,
            "editor": "number"
          },
          "maxConcurrency": {
            "title": "Max Concurrency",
            "type": "integer",
            "description": "How many profiles to fetch in parallel. LinkedIn rate-limits per exit IP, so higher is not always faster.",
            "default": 6,
            "minimum": 1,
            "maximum": 10,
            "editor": "number"
          }
        }
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Output",
        "properties": {
          "overview": {
            "type": "string",
            "title": "Profiles",
            "template": "{{links.apiDefaultDatasetUrl}}/items?view=overview"
          }
        }
      },
      "dockerfile": "./Dockerfile",
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "fields": {
            "title": "LinkedIn profile",
            "type": "object",
            "properties": {
              "recordType": {
                "type": "string",
                "description": "profile or error"
              },
              "publicIdentifier": {
                "type": "string",
                "description": "LinkedIn slug (last part of /in/<slug>)"
              },
              "linkedinUrl": {
                "type": "string",
                "description": "Canonical profile URL"
              },
              "name": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Full name"
              },
              "headline": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Profile headline as shown to logged-out visitors (LinkedIn truncates it)"
              },
              "location": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Location as published on the profile"
              },
              "countryCode": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "ISO country code"
              },
              "photoUrl": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Profile photo URL"
              },
              "profileBadge": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "LinkedIn badge line, e.g. \"Creator, Top Voice\""
              },
              "followerCount": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Exact follower count"
              },
              "currentCompany": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Current employer name"
              },
              "currentCompanyUrl": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Current employer LinkedIn page"
              },
              "education": {
                "type": "array",
                "description": "Schools with start/end year where published. An entry may have school=null when LinkedIn redacted the institution name for logged-out visitors but still published the dates."
              },
              "awards": {
                "type": "array",
                "description": "Awards listed on the profile"
              },
              "languages": {
                "type": "array",
                "description": "Languages listed on the profile"
              },
              "websites": {
                "type": "array",
                "description": "Websites linked from the profile"
              },
              "recentPosts": {
                "type": "array",
                "description": "Recent posts with text, URL, date and reaction count"
              },
              "recentArticles": {
                "type": "array",
                "description": "Recent articles with headline, URL, date and reaction count"
              },
              "similarProfiles": {
                "type": "array",
                "description": "Slugs from LinkedIn's own \"Other similar profiles\" block"
              },
              "error": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Present only on error rows"
              },
              "scrapedAt": {
                "type": "string",
                "description": "ISO timestamp"
              }
            }
          },
          "views": {
            "overview": {
              "title": "Overview",
              "transformation": {
                "fields": [
                  "name",
                  "headline",
                  "currentCompany",
                  "location",
                  "countryCode",
                  "followerCount",
                  "publicIdentifier",
                  "linkedinUrl"
                ]
              },
              "display": {
                "component": "table"
              }
            }
          }
        }
      },
      "readme": "## LinkedIn profile scraper: profiles, education, posts and similar profiles\n\nPaste LinkedIn profile URLs or usernames. Get one clean row per person: name, location, employer, education history, follower count, recent posts and articles.\n\n**From $3 per 1,000 profiles. No login, no cookies, no browser, no proxy setup.**\n\nBlocked and not-found profiles are never charged.\n\n## Why this scraper?\n\n- 🔓 **No account, ever.** You don't hand over cookies and we don't run a login. Nothing to get your LinkedIn account restricted.\n- 🎓 **Full education history, not just the top line.** LinkedIn hides most school names from logged-out visitors but still publishes the dates. Most scrapers return one school. This one returns every entry, including the dated ones.\n- 🕸️ **20+ similar profiles on every row.** LinkedIn's own \"Other similar profiles\" block, so one seed person expands into a whole network.\n- 📰 **Recent posts and articles with reaction counts**, in the same row as the profile. No second actor, no second bill.\n- 💸 **You only pay for profiles you actually get.** Rate-limited or missing profiles come back as error rows and cost nothing.\n- ⚡ **Fast and cheap by design.** Plain HTTP on datacenter proxies. No browser to boot, no residential bandwidth to burn.\n\n## What data can you extract?\n\n| Field | Notes |\n|---|---|\n| `name` | Full name |\n| `headline` | Professional headline, as shown to logged-out visitors |\n| `location`, `countryCode` | City / region, and ISO country |\n| `photoUrl` | Full-size profile photo |\n| `profileBadge` | LinkedIn's own badge line, e.g. \"Creator, Top Voice\" |\n| `followerCount` | Exact follower number |\n| `currentCompany`, `currentCompanyUrl` | Current employer and its LinkedIn page |\n| `education[]` | School, LinkedIn school page, start and end year |\n| `awards[]`, `languages[]` | As published on the profile |\n| `websites[]` | Real destination URLs, already unwrapped from LinkedIn's redirect |\n| `recentPosts[]` | Text, URL, date, reaction count |\n| `recentArticles[]` | Headline, URL, date, reaction count, cover image |\n| `similarProfiles[]` | Usernames from \"Other similar profiles\" |\n\n## How much does the LinkedIn Profile Scraper cost?\n\nPay per profile. Two charges only: a small fee when a run starts, and one charge per profile delivered.\n\n| | Per 1,000 profiles | Run start |\n|---|---|---|\n| Free plan | $4.00 | $0.02 |\n| Starter | $3.50 | $0.01 |\n| Scale | $3.50 | $0.0075 |\n| Business and above | **$3.00** | $0.005 |\n\nApify's **$5 free monthly credit** covers roughly **1,250 profiles**. A **$29** balance on Starter covers about **8,285**.\n\nNothing else is billed. Error rows, duplicate inputs and profiles that LinkedIn refused are all free.\n\n## How to scrape LinkedIn profiles: step by step\n\n1. Click **Try for free** and open the actor.\n2. Paste profile URLs or usernames into **Profile URLs or Usernames**. Both forms work, and mixing them is fine.\n3. Optionally set **Max Results** to cap the run, or leave it at 0 for everything you pasted.\n4. Click **Start**.\n5. Download the results as JSON, CSV, Excel, or pull them from the API.\n\n## Input\n\nPaste a full URL or just the username. Duplicates are removed before anything is fetched, so the same person listed twice is only charged once.\n\n```json\n{\n  \"profiles\": [\n    \"https://www.linkedin.com/in/williamhgates\",\n    \"https://uk.linkedin.com/in/satyanadella\",\n    \"reidhoffman\"\n  ],\n  \"maxResults\": 0,\n  \"maxConcurrency\": 6\n}\n```\n\n| Field | Type | Default | What it does |\n|---|---|---|---|\n| `profiles` | array | required | Profile URLs or usernames. Country subdomains like `uk.linkedin.com` are fine. |\n| `maxResults` | integer | `0` | Stop after this many profiles. `0` means no cap. |\n| `maxConcurrency` | integer | `6` | How many profiles to fetch at once. Higher is not always faster: LinkedIn rate-limits per IP. |\n\n## Output\n\nOne row per profile. A real row from a live run:\n\n```json\n{\n  \"recordType\": \"profile\",\n  \"publicIdentifier\": \"bill-cronin-5490492\",\n  \"linkedinUrl\": \"https://www.linkedin.com/in/bill-cronin-5490492\",\n  \"name\": \"Bill Cronin\",\n  \"headline\": \"A seasoned professional with proven experience in business development, marketing…\",\n  \"location\": \"Odessa, Florida, United States\",\n  \"countryCode\": \"US\",\n  \"photoUrl\": \"https://media.licdn.com/dms/image/v2/D4E03AQGYTneXVJiSjQ/profile-displayphoto-shrink_200_200/…\",\n  \"profileBadge\": null,\n  \"followerCount\": 10812,\n  \"currentCompany\": \"Pasco Economic Development Council\",\n  \"currentCompanyUrl\": \"https://www.linkedin.com/company/pasco-economic-development-council\",\n  \"education\": [\n    {\n      \"school\": \"Harvard Kennedy School Executive Education\",\n      \"linkedinUrl\": \"https://www.linkedin.com/school/hksexeced/\",\n      \"startYear\": null,\n      \"endYear\": 2025\n    },\n    { \"school\": null, \"linkedinUrl\": null, \"startYear\": 1984, \"endYear\": 1990 },\n    { \"school\": null, \"linkedinUrl\": null, \"startYear\": 1985, \"endYear\": 1987 }\n  ],\n  \"awards\": [],\n  \"languages\": [\"Mandarin\", \"Thai\"],\n  \"websites\": [\"http://ontheroadtobangkok.blogspot.com/\"],\n  \"recentPosts\": [\n    {\n      \"text\": \"Bienvenue Monin!\",\n      \"url\": \"https://www.linkedin.com/posts/bill-cronin-5490492_monin-to-open-manufacturing-facility-in-city-activity-7482917587614511104-dusi\",\n      \"publishedAt\": \"2026-07-14T22:02:58.755Z\",\n      \"reactions\": 44\n    }\n  ],\n  \"recentArticles\": [],\n  \"similarProfiles\": [\"bobbyclark\", \"josephrrusso\", \"matthew-swift-8ba7529\", \"davidgreeley\"],\n  \"scrapedAt\": \"2026-08-28T16:57:37.839Z\"\n}\n```\n\nA profile we could not deliver comes back as an error row instead. These are free:\n\n```json\n{\n  \"recordType\": \"error\",\n  \"publicIdentifier\": \"zzz-no-such-person\",\n  \"linkedinUrl\": \"https://www.linkedin.com/in/zzz-no-such-person\",\n  \"error\": \"Could not retrieve this profile: either LinkedIn blocked the request, or no public profile exists at this URL.\",\n  \"scrapedAt\": \"2026-08-28T16:57:41.002Z\"\n}\n```\n\nFilter on `recordType` to keep the two apart.\n\n## Use cases\n\n- **Lead enrichment.** Turn a list of profile URLs into names, employers, locations and follower counts for your CRM.\n- **Recruiting research.** Map who studied where and when, and who LinkedIn considers similar to a candidate you like.\n- **Network expansion.** Feed `similarProfiles` back in as input and grow a seed list into a whole segment.\n- **Influencer and creator scouting.** Rank people by follower count and see what they actually posted, with reaction counts.\n- **Competitor talent tracking.** Watch who is publishing and how their audience responds.\n\n## Limitations\n\nWorth knowing before you buy. LinkedIn shows logged-out visitors far less than logged-in ones, and this actor never logs in.\n\n- **No job titles, skills, endorsements, certifications, emails or phone numbers.** LinkedIn does not publish these to logged-out visitors at all.\n- **Only the current employer.** Past positions and employment dates are not available publicly.\n- **The headline is truncated by LinkedIn**, not by us. Logged-out visitors get a shortened version ending in `…`.\n- **Some education entries have `school: null`.** LinkedIn hides the institution name from logged-out visitors but still publishes the dates. We keep those entries because the timeline is real data. Most scrapers drop them.\n- **Large batches return some profiles as errors.** LinkedIn rate-limits per IP, so a run of several hundred will have a share come back blocked. Those rows are free. Split very large lists across runs for the best hit rate.\n- **A missing profile and a blocked one look identical.** LinkedIn returns the same response for both, so the error message names both possibilities.\n\n## Frequently asked questions\n\n### Do I need a LinkedIn account or cookies?\n\nNo. This actor only reads pages that are visible to anyone on the open web. You never supply cookies, and no account is used, so there is nothing to get restricted.\n\n### Why is the headline cut off?\n\nThat is LinkedIn's doing. The public page shows a shortened headline with a \"see more\" button that opens a sign-in prompt rather than the rest of the text. The full version is only visible to logged-in members.\n\n### Why do some education entries have no school name?\n\nLinkedIn hides most institution names from logged-out visitors but still publishes the start and end years. We return those entries with `school: null` rather than throwing them away, so you keep the real timeline and the correct number of schools.\n\n### Why did some profiles come back as errors?\n\nLinkedIn limits how many profiles one IP can request in a short window. In a large batch some will be refused. Those rows are not charged. Running a smaller batch, or splitting a big list across several runs, raises the hit rate.\n\n### Is it legal to scrape LinkedIn?\n\nScraping public data is generally allowed in the US and most of the EU, as long as you don't collect personal data covered by GDPR or CCPA without a lawful basis. This actor only touches publicly accessible pages, but how you use the output is on you.\n\nApify's full breakdown: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/).\n\n### How much does the LinkedIn Profile Scraper cost?\n\nFrom $3 per 1,000 profiles on Business and above, $4 per 1,000 on the free plan, plus a small run-start fee. Blocked profiles, duplicates and error rows are free.\n\n### Can I integrate it with other tools?\n\nPush results into **Make, Zapier, Slack, Airbyte, GitHub, Google Sheets, Google Drive**, and more. Apify treats every actor as a webhook source, so anything that consumes webhooks or pulls from an API works.\n\nFull list: [Apify integrations](https://docs.apify.com/platform/integrations).\n\n### Can I use it with the Apify API?\n\nYes. Every run is available via the Apify REST API:\n\n```bash\ncurl -X POST \"https://api.apify.com/v2/acts/sourabhbgp~linkedin-profile-scraper/runs?token=APIFY_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"profiles\": [\"https://www.linkedin.com/in/williamhgates\"]}'\n```\n\nDocs: [Apify API reference](https://docs.apify.com/api/v2).\n\n### Can I use it through an MCP Server?\n\nYes. Apify ships an MCP server that exposes every actor as a tool, so Claude Desktop, Cursor, and any other MCP-capable client can call this scraper. Setup: [Apify MCP docs](https://docs.apify.com/platform/integrations/mcp).\n\n## Your feedback\n\nBug, missing field, or odd behavior? Drop a note in the [Issues tab](https://console.apify.com/actors/9GIYyKLd4Qn2ddnp4/issues). Reports go to a human and fixes usually ship the same week.\n"
    },
    "buildNumber": "0.1.14",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "0.1"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.014592222222222222
    }
  }
}