{
  "data": {
    "id": "BNWbVd47hcviT5EpR",
    "actId": "B5sXWphdFBcdceALD",
    "userId": "ntHCnhNUkzXR7nbUZ",
    "startedAt": "2026-10-06T22:22:07.629Z",
    "finishedAt": "2026-10-06T22:22:58.439Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 50706,
      "runTimeSecs": 50.706,
      "computeUnits": 0.05634,
      "imageSizeBytes": 641314304
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"LinkedIn Profile Scraper\",\n  \"description\": \"<p>Extract profile data from <a href=\\\"https://www.linkedin.com\\\" target=\\\"_blank\\\">LinkedIn</a> public profile pages. Requires residential proxy for reliable access.</p><p>Paste profile URLs or just the username slug (e.g., <code>billgates</code> or <code>https://www.linkedin.com/in/billgates/</code>).</p>\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"profileUrls\": {\n      \"title\": \"Profile URLs or Slugs\",\n      \"type\": \"array\",\n      \"description\": \"LinkedIn profile page URLs or slugs. Accepts full URLs (https://www.linkedin.com/in/billgates/) or just the slug (billgates).\",\n      \"editor\": \"stringList\",\n      \"prefill\": [\n        \"williamhgates\"\n      ],\n      \"sectionCaption\": \"📋 Profiles\",\n      \"sectionDescription\": \"Add LinkedIn profile URLs or slugs to scrape.\"\n    },\n    \"maxProfiles\": {\n      \"title\": \"Max Profiles\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of profiles to scrape. Useful to limit costs when providing a large list.\",\n      \"default\": 100,\n      \"prefill\": 3,\n      \"minimum\": 1,\n      \"maximum\": 1000,\n      \"sectionCaption\": \"⚙️ Settings\",\n      \"sectionDescription\": \"Control the volume and behavior of scraping.\"\n    }\n  },\n  \"required\": [\n    \"profileUrls\"\n  ]\n}",
    "readme": "# LinkedIn Profile Scraper\n\nScrape LinkedIn public profiles at scale — no login, no user-provided cookies, no browser. Extract structured data from any LinkedIn profile URL using fast HTTP requests and residential proxies.\n\n## What does LinkedIn Profile Scraper do?\n\nLinkedIn Profile Scraper extracts structured data from public LinkedIn profile pages. It works entirely through HTTP requests with residential proxies — no LinkedIn account, login credentials, or user-provided cookies required.\n\nFor each profile, the scraper returns:\n\n- A machine-readable `success` flag and nullable `error` reason on every row\n- Full name, headline, and location\n- About/summary section\n- Follower and connection counts\n- Profile image URL\n- Current positions with company name, title, and start date\n- Education history with institution, degree, and years\n- Personal websites exposed by the public profile metadata\n- Timestamp of when the data was scraped\n\nThe actor uses JSON-LD structured data embedded in LinkedIn's public profile pages, with stable metadata fallbacks. It processes profiles sequentially to reduce blocking and automatically retries failed requests across up to 4 fresh proxy sessions.\n\n## Use for engagement-lead enrichment\n\nAfter collecting LinkedIn profile URLs from engagement workflows, run them through this actor to add headline, location, about text, current positions, education, follower count, websites, and canonical URLs. Use those fields to score fit and personalize outreach before sending sales outreach messages.\n\n## Who is it for?\n\n🔍 **Recruiters and talent sourcers** — Build candidate pipelines by scraping profiles in bulk. Export to your ATS or spreadsheet for easy filtering by headline, location, and experience.\n\n📊 **Sales and business development teams** — Enrich your prospect lists with up-to-date LinkedIn data. Get headlines, company info, and follower counts to prioritize outreach.\n\n🧪 **Market researchers** — Analyze workforce trends, job title distributions, and career trajectories across industries at scale.\n\n🤖 **Data engineers and developers** — Feed structured LinkedIn data into your pipelines, CRMs, or machine learning models via API or webhooks.\n\n📈 **Growth hackers and marketers** — Identify influencers and thought leaders by follower count, build targeted audience segments, and track competitor teams.\n\n## Why use LinkedIn Profile Scraper?\n\n🚫 **No login required** — Unlike most LinkedIn scrapers, this one works without any LinkedIn account. No risk of account bans or credential management.\n\n⚡ **Fast HTTP-based scraping** — No headless browser overhead. Profiles are fetched via `got-scraping` with Cheerio parsing, making it significantly faster and cheaper than browser-based alternatives.\n\n🔄 **Automatic retries** — LinkedIn occasionally returns 999 status codes as an anti-bot measure. The scraper automatically makes up to 4 attempts per profile with different proxy sessions.\n\n💰 **Pay per useful result** — The profile event is charged only after a usable profile name and canonical LinkedIn URL are validated. Blocked, login, missing, and unparseable pages produce explicit `success: false` rows without a profile event charge.\n\n📦 **Clean structured output** — Every profile is returned as a flat JSON object ready for import into databases, spreadsheets, or APIs.\n\n🔗 **Flexible input** — Pass full LinkedIn URLs or just profile slugs (e.g., `williamhgates`). A leading `@` on a handle or URL slug is removed without changing the remaining identifier.\n\n## Data extraction table\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `success` | Boolean | `true` only when a usable public profile identity was extracted |\n| `error` | String or null | Failure reason for unsuccessful rows; `null` on success |\n| `name` | String or null | Full name from the profile |\n| `linkedinUrl` | String | Canonical LinkedIn profile URL |\n| `headline` | String | Professional headline |\n| `location` | String | Location as displayed on the profile |\n| `about` | String | About/summary section text |\n| `followerCount` | Number | Total follower count |\n| `connectionCount` | String | Connection count (may show \"500+\") |\n| `profileImageUrl` | String | URL to the profile photo |\n| `currentPositions` | Array | Current job positions with title, company, startDate |\n| `education` | Array | Education entries with institution, degree, startYear, endYear |\n| `languages` | Array | Compatibility field; currently empty when the public page does not expose languages |\n| `websites` | Array | Websites linked on the profile |\n| `scrapedAt` | String | ISO 8601 timestamp of when the profile was scraped |\n\n## How much does it cost to scrape LinkedIn profiles?\n\nLinkedIn Profile Scraper uses Apify's pay-per-event pricing model. A tiered run-start event is charged once, and you pay a tiered profile event only for profiles that pass the useful-profile validation.\n\n| Apify plan | Run start | Per validated profile |\n|---|---:|---:|\n| Free | $0.01 | $0.008 |\n| Bronze | $0.0095 | $0.0072 |\n| Silver | $0.0085 | $0.0064 |\n| Gold | $0.0075 | $0.0052 |\n| Platinum | $0.006 | $0.004 |\n| Diamond | $0.005 | $0.0032 |\n\n**Computed actor-charge example:** 100 validated profiles cost about **$0.81** on Free or **$0.7295** on Bronze (run-start charge + 100 profile events). Error rows do not incur the profile event.\n\nResidential proxy costs are included in these actor charges — no separate proxy fee.\n\n## How to scrape LinkedIn profiles\n\n1. 📝 **Go to the actor page** — Navigate to [LinkedIn Profile Scraper](https://apify.com/automation-lab/linkedin-profile-scraper) on Apify Store.\n2. ▶️ **Click \"Start\"** — Open the input configuration panel.\n3. 🔗 **Add profile URLs** — Paste LinkedIn profile URLs or slugs into the `profileUrls` field. One URL per line, for example: `https://www.linkedin.com/in/williamhgates/`.\n4. 🔢 **Set max profiles** — Optionally adjust `maxProfiles` to limit how many profiles to scrape (default: 100).\n5. 🚀 **Run the scraper** — Click \"Start\" and wait for results. Each profile takes a few seconds.\n6. 📥 **Download results** — Export your data as JSON, CSV, Excel, or connect it to your workflow via API or webhooks.\n\n## Input parameters\n\nOnly LinkedIn `/in/` profile URLs and profile slugs/handles are targets. Absolute company, showcase, posts, and non-LinkedIn URLs are ignored before the profile limit; they are not converted into profile slugs.\n\nRuns honor the caller's actual platform deadline. When there is not enough time for another bounded request attempt, completed results are retained and remaining profiles are not fetched. The default key-value store contains `RUN_DIAGNOSTIC` with `code: \"deadline_reached\"` and useful, error, and unprocessed counts. A partly attempted profile can return an honest uncharged error row; unprocessed profiles are not result rows. Increase the run timeout or split large batches to finish remaining work.\n\nNull, blank, nonstring, and empty `@` handle entries from API integrations are ignored before applying `maxProfiles`, so they cannot discard valid profiles in the same batch. If no usable targets remain (including an omitted or empty list), the Actor finishes with **zero dataset rows and no charges**. The default key-value store contains `INPUT_DIAGNOSTIC` with `code: \"invalid_input\"` and a corrective message. This is a caller-configuration outcome, not a scraped result; API and schedule callers should fix their upstream profile mappings. Real extraction/access errors retain the existing explicit error-row behavior.\n\n| Parameter | Type | Required | Default | Description |\n|-----------|------|----------|---------|-------------|\n| `profileUrls` | Array | Yes | — | List of LinkedIn profile URLs or slugs to scrape. Accepts full URLs like `https://www.linkedin.com/in/williamhgates/` or just the slug `williamhgates`. |\n| `maxProfiles` | Integer | No | 100 | Maximum number of profiles to process from the input list. |\n\n**Example input:**\n\n```json\n{\n    \"profileUrls\": [\n        \"https://www.linkedin.com/in/williamhgates/\",\n        \"https://www.linkedin.com/in/satyanadella\",\n        \"jeffweiner08\"\n    ],\n    \"maxProfiles\": 50\n}\n```\n\n## Output example\n\nEach scraped profile produces a JSON object with the following structure:\n\n```json\n{\n    \"success\": true,\n    \"error\": null,\n    \"name\": \"Bill Gates\",\n    \"linkedinUrl\": \"https://www.linkedin.com/in/williamhgates/\",\n    \"headline\": \"Chair, Gates Foundation and Founder, Breakthrough Energy\",\n    \"location\": \"Seattle, Washington, United States\",\n    \"about\": \"Chair of the Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft.\",\n    \"followerCount\": 40063481,\n    \"connectionCount\": \"8\",\n    \"profileImageUrl\": \"https://media.licdn.com/dms/image/...\",\n    \"currentPositions\": [\n        {\n            \"title\": \"Co-chair\",\n            \"company\": \"Gates Foundation\",\n            \"startDate\": \"2000\"\n        },\n        {\n            \"title\": \"Founder\",\n            \"company\": \"Breakthrough Energy\",\n            \"startDate\": \"2015\"\n        }\n    ],\n    \"education\": [\n        {\n            \"institution\": \"Harvard University\",\n            \"degree\": null,\n            \"startYear\": 1973,\n            \"endYear\": 1975\n        }\n    ],\n    \"languages\": [],\n    \"websites\": [],\n    \"scrapedAt\": \"2026-03-21T23:03:09.634Z\"\n}\n```\n\nResults are stored in the default dataset and can be exported in JSON, CSV, XML, Excel, or accessed via the Apify API.\n\n## Tips and best practices\n\n💡 **Use full URLs when possible** — While the scraper accepts bare slugs, full URLs reduce ambiguity and ensure correct profile resolution.\n\n💡 **Batch your requests** — Running one actor call with 500 profiles is cheaper than 500 individual runs, because you pay the plan-specific start fee only once.\n\n💡 **Expect some failures** — LinkedIn's anti-bot system occasionally blocks requests with a 999 status code. The scraper retries automatically, but some profiles may still fail. Plan for a 5-10% failure rate on large batches.\n\n💡 **Deduplicate your input** — Remove duplicate URLs before running to avoid paying for the same profile twice.\n\n💡 **Schedule regular runs** — Use Apify's built-in scheduler to keep your LinkedIn data fresh. Weekly or monthly scrapes work well for most use cases.\n\n💡 **Filter and retry failures** — Filter dataset rows with `success: false`, inspect their `error` value, and re-run only those URLs. These rows do not incur a `profile-scraped` event.\n\n## Integrations\n\nLinkedIn Profile Scraper connects with your existing tools through Apify's integration ecosystem:\n\n📊 **Google Sheets** — Automatically push scraped profiles to a Google Sheet. Great for recruiters maintaining candidate trackers.\n\n🗄️ **Webhooks** — Trigger your backend API whenever a run completes. Process new profile data in real time.\n\n💾 **Amazon S3 / Google Cloud Storage** — Export datasets directly to cloud storage for data lake ingestion.\n\n📧 **Zapier / Make** — Connect to 5,000+ apps. For example, scrape a profile and automatically create a HubSpot contact.\n\n🔄 **Slack notifications** — Get notified in Slack when a scraping batch completes with result counts.\n\n🗃️ **Apify Dataset API** — Programmatically fetch results in JSON, CSV, or Excel format from any language or platform.\n\n## API usage\n\nCall LinkedIn Profile Scraper programmatically using the Apify API. Here are examples in popular languages.\n\n### Node.js\n\n```javascript\nimport { ApifyClient } from 'apify-client';\n\nconst client = new ApifyClient({ token: 'YOUR_API_TOKEN' });\n\nconst run = await client.actor('automation-lab/linkedin-profile-scraper').call({\n    profileUrls: [\n        'https://www.linkedin.com/in/williamhgates/',\n        'https://www.linkedin.com/in/satyanadella',\n    ],\n    maxProfiles: 100,\n});\n\nconst { items } = await client.dataset(run.defaultDatasetId).listItems();\nitems.forEach((profile) => {\n    console.log(`${profile.name} — ${profile.headline}`);\n});\n```\n\n### Python\n\n```python\nfrom apify_client import ApifyClient\n\nclient = ApifyClient(\"YOUR_API_TOKEN\")\n\nrun = client.actor(\"automation-lab/linkedin-profile-scraper\").call(run_input={\n    \"profileUrls\": [\n        \"https://www.linkedin.com/in/williamhgates/\",\n        \"https://www.linkedin.com/in/satyanadella\",\n    ],\n    \"maxProfiles\": 100,\n})\n\ndataset = client.dataset(run[\"defaultDatasetId\"]).list_items().items\nfor profile in dataset:\n    print(f\"{profile['name']} — {profile['headline']}\")\n```\n\n### cURL\n\n```bash\n# Start the actor run\ncurl -X POST \"https://api.apify.com/v2/acts/automation-lab~linkedin-profile-scraper/runs?token=YOUR_API_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"profileUrls\": [\"https://www.linkedin.com/in/williamhgates/\"],\n    \"maxProfiles\": 10\n  }'\n\n# Fetch results (replace RUN_ID with the actual run ID from the response)\ncurl \"https://api.apify.com/v2/datasets/DATASET_ID/items?token=YOUR_API_TOKEN&format=json\"\n```\n\n## Use with Claude AI (MCP)\n\nThis actor is available as a tool in Claude AI through the Model Context Protocol (MCP). Add it to Claude Desktop, Cursor, Windsurf, or any MCP-compatible client.\n\n### Setup for Claude Code\n\n```bash\nclaude mcp add --transport http apify \"https://mcp.apify.com?tools=automation-lab/linkedin-profile-scraper\"\n```\n\n### Setup for Claude Desktop, Cursor, or VS Code\n\nAdd this to your MCP config file:\n\n```json\n{\n    \"mcpServers\": {\n        \"apify\": {\n            \"url\": \"https://mcp.apify.com?tools=automation-lab/linkedin-profile-scraper\"\n        }\n    }\n}\n```\n\n### Example prompts\n\n- \"Scrape the LinkedIn profile for Bill Gates and give me a summary of his current roles and background.\"\n- \"Get LinkedIn data for these 10 profile URLs and create a comparison table of their headlines and locations.\"\n- \"Pull LinkedIn profiles for the leadership team at OpenAI and tell me about their education backgrounds.\"\n\nLearn more in the [Apify MCP documentation](https://docs.apify.com/platform/integrations/mcp).\n\n## Data handling, AI, and support\n\nThis Actor does not use AI models or send inputs/results to an AI provider. It requests only the public LinkedIn profile URLs supplied by the user and stores results in the run's Apify dataset; it has no external result database or Actor-side cache. Dataset and log retention follow the user's Apify account storage settings, and users can delete runs and datasets with Apify's storage controls. Do not submit credentials, private profile data, or sensitive personal data as input.\n\nLinkedIn is a third-party source and may change or block its public pages. This Actor is independently operated and is not affiliated with, endorsed by, or sponsored by LinkedIn. For Actor support, use the issue/support channel on the Actor's Apify Store page and include the run ID plus a sanitized example URL.\n\n## Legality\n\nFailed operations send sanitized diagnostic input, exceptions, and Actor/build/run IDs to our private GlitchTip service for repair. Secret fields and URL query strings are removed; reports are retained for 30 days.\n\nScraping publicly available data is generally considered legal based on the 2022 US Ninth Circuit ruling in *hiQ Labs v. LinkedIn*, which confirmed that scraping public profiles does not violate the Computer Fraud and Abuse Act (CFAA).\n\nThis actor only accesses publicly visible LinkedIn profile pages — the same data any visitor can see without logging in. It does not bypass any authentication, use stolen credentials, or access private data.\n\nHowever, scraping may still violate LinkedIn's Terms of Service. Users are responsible for ensuring their use of scraped data complies with applicable laws including GDPR, CCPA, and other data protection regulations.\n\nFor more details, see Apify's guide on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).\n\n## FAQ — Frequently asked questions\n\n**Q: Do I need a LinkedIn account to use this scraper?**\n\nNo. LinkedIn Profile Scraper works entirely without login credentials. It accesses public profile pages through residential proxies, so no LinkedIn account is needed.\n\n**Q: Why did some profiles return no data?**\n\nLinkedIn's anti-bot system sometimes returns a 999 status code, a login page, or a challenge page. The scraper makes up to 4 attempts with different proxy sessions. If it still cannot validate a usable profile identity, it returns `success: false` with an `error` reason and does not charge the profile event. Try re-running only those failed URLs.\n\n**Q: Can I scrape private profiles or profiles behind a login wall?**\n\nNo. This scraper only extracts data from publicly visible profiles. If a profile requires signing in to view, it cannot be scraped by this actor.\n\n**Q: How fast is the scraping?**\n\nEach profile takes approximately 2-5 seconds to scrape, including retries. Profiles are processed sequentially to avoid triggering LinkedIn's rate limits. A batch of 100 profiles typically completes in 5-10 minutes.\n\n**Q: What format can I export the data in?**\n\nResults can be exported as JSON, CSV, XML, Excel (XLSX), or accessed directly through the Apify API. You can also push data to Google Sheets, webhooks, or cloud storage.\n\n**Q: Why does `connectionCount` show as a string?**\n\nLinkedIn displays connection counts differently depending on the profile. Some show exact numbers, others show \"500+\". The field is kept as a string to preserve this original formatting.\n\n## Related scrapers\n\nIf you find LinkedIn Profile Scraper useful, check out these related actors from automation-lab:\n\n🏢 [LinkedIn Company Scraper](https://apify.com/automation-lab/linkedin-company-scraper) — Scrape company pages for description, employee count, industry, and specialties.\n\n💼 [LinkedIn Jobs Scraper](https://apify.com/automation-lab/linkedin-jobs-scraper) — Search and extract LinkedIn job listings with title, company, location, and description.\n\n🔍 [LinkedIn Jobs Enrichment](https://apify.com/automation-lab/linkedin-jobs-enrichment) — Enrich LinkedIn job postings with additional details and structured data.\n\n📸 [Instagram Scraper](https://apify.com/automation-lab/instagram-scraper) — Extract posts, profiles, and hashtag data from Instagram.\n\n🐦 [Twitter Scraper](https://apify.com/automation-lab/twitter-scraper) — Scrape tweets, user profiles, and search results from Twitter/X.\n\n💙 [Bluesky Scraper](https://apify.com/automation-lab/bluesky-scraper) — Extract posts and profiles from Bluesky social network.\n\n🎵 [TikTok Scraper](https://apify.com/automation-lab/tiktok-scraper) — Scrape TikTok videos, user profiles, and hashtag content.\n",
    "changelog": "# Changelog\n\n## 2026-10-05\n\n_Reliability_\n\n- Ignore unsupported company, showcase, posts, and external URLs without losing usable profiles or consuming the profile limit.\n- Preserve completed results and report unprocessed work when the caller's run deadline leaves insufficient time for another request attempt.\n\n## 2026-10-03\n\n_Reliability_\n\n- Resolve social-style @ handles and @-prefixed profile URLs to the same LinkedIn profile slug, avoiding unnecessary blocked requests. Empty handles are ignored without consuming the profile limit.\n\n## 2026-10-02\n\n_Reliability_\n\n- Ignore null or blank profile entries from API integrations without losing valid batch results. Runs with no usable targets now return an uncharged empty dataset and a clear input diagnostic.\n\n## 2026-09-16\n\n_Reliability_\n\n- Added clear `success` and `error` values to every result and stopped charging the profile event when LinkedIn returns an unusable login, challenge, missing, or unparseable page.\n\n## 2026-07-04\n\n_Reliability_\n\n- Improved long LinkedIn profile scraping runs so they finish gracefully before the platform timeout while preserving completed profile results.\n\n## 2026-03-21\n\n_Features_\n\n- Launched LinkedIn Profile Scraper for extracting structured public profile details such as name, headline, location, education, work experience, skills, follower count, and profile image without requiring a LinkedIn login.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "linkedin-profile-scraper",
      "title": "LinkedIn Profile Scraper",
      "description": "Scrape LinkedIn profile pages — extract name, headline, location, education, work experience, follower count, profile image, and more. Pure HTTP with residential proxy, no login needed.",
      "version": "0.1",
      "meta": {
        "templateId": "ts-start"
      },
      "input": {
        "title": "LinkedIn Profile Scraper",
        "description": "<p>Extract profile data from <a href=\"https://www.linkedin.com\" target=\"_blank\">LinkedIn</a> public profile pages. Requires residential proxy for reliable access.</p><p>Paste profile URLs or just the username slug (e.g., <code>billgates</code> or <code>https://www.linkedin.com/in/billgates/</code>).</p>",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "profileUrls": {
            "title": "Profile URLs or Slugs",
            "type": "array",
            "description": "LinkedIn profile page URLs or slugs. Accepts full URLs (https://www.linkedin.com/in/billgates/) or just the slug (billgates).",
            "editor": "stringList",
            "prefill": [
              "williamhgates"
            ],
            "sectionCaption": "📋 Profiles",
            "sectionDescription": "Add LinkedIn profile URLs or slugs to scrape."
          },
          "maxProfiles": {
            "title": "Max Profiles",
            "type": "integer",
            "description": "Maximum number of profiles to scrape. Useful to limit costs when providing a large list.",
            "default": 100,
            "prefill": 3,
            "minimum": 1,
            "maximum": 1000,
            "sectionCaption": "⚙️ Settings",
            "sectionDescription": "Control the volume and behavior of scraping."
          }
        },
        "required": [
          "profileUrls"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "LinkedIn profile results",
        "description": "Dataset containing successful public LinkedIn profiles and explicit error rows.",
        "properties": {
          "overview": {
            "type": "string",
            "title": "Results",
            "description": "Profile rows with success status, error reason, and extracted public fields.",
            "template": "{{links.apiDefaultDatasetUrl}}/items?view=overview"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "fields": {
            "$schema": "http://json-schema.org/draft-07/schema#",
            "title": "LinkedIn Profile Scraper output schema",
            "type": "object",
            "properties": {
              "success": {
                "type": "boolean",
                "description": "Whether a usable public profile identity was extracted",
                "nullable": true,
                "example": true
              },
              "error": {
                "type": "string",
                "description": "Failure reason when success is false; null for successful profiles",
                "nullable": true,
                "example": "No usable public profile identity found."
              },
              "name": {
                "type": "string",
                "description": "Full name",
                "nullable": true,
                "example": "Example Person"
              },
              "linkedinUrl": {
                "type": "string",
                "description": "Canonical LinkedIn profile URL",
                "nullable": true,
                "example": "https://www.linkedin.com/in/example-person/"
              },
              "headline": {
                "type": "string",
                "description": "Profile headline",
                "nullable": true,
                "example": "Engineering Leader"
              },
              "location": {
                "type": "string",
                "description": "Location",
                "nullable": true,
                "example": "Example City"
              },
              "about": {
                "type": "string",
                "description": "About or summary text",
                "nullable": true,
                "example": "Experienced technology leader."
              },
              "followerCount": {
                "type": "integer",
                "description": "Number of followers",
                "nullable": true,
                "example": 12500
              },
              "connectionCount": {
                "type": "string",
                "description": "Connection count as displayed by LinkedIn",
                "nullable": true,
                "example": "500+"
              },
              "profileImageUrl": {
                "type": "string",
                "description": "Profile photo URL",
                "nullable": true,
                "example": "https://media.licdn.com/dms/image/example/profile-displayphoto-shrink_200_200/0/example"
              },
              "backgroundImageUrl": {
                "type": "string",
                "description": "Background banner URL when available",
                "nullable": true,
                "example": "https://media.licdn.com/dms/image/example/profile-backgroundimage/0/example"
              },
              "currentPositions": {
                "type": "array",
                "description": "Current work positions",
                "nullable": true,
                "items": {
                  "type": "object",
                  "properties": {
                    "title": {
                      "type": "string",
                      "description": "Position title",
                      "nullable": true,
                      "example": "Engineering Director"
                    },
                    "company": {
                      "type": "string",
                      "description": "Company name",
                      "nullable": true,
                      "example": "Example Company"
                    },
                    "startDate": {
                      "type": "string",
                      "description": "Position start date when available",
                      "nullable": true,
                      "example": "2022"
                    }
                  },
                  "required": [],
                  "additionalProperties": true,
                  "nullable": true
                },
                "example": [
                  {
                    "title": "Engineering Director",
                    "company": "Example Company",
                    "startDate": "2022"
                  }
                ]
              },
              "education": {
                "type": "array",
                "description": "Education history",
                "nullable": true,
                "items": {
                  "type": "object",
                  "properties": {
                    "institution": {
                      "type": "string",
                      "description": "Institution name",
                      "nullable": true,
                      "example": "Example University"
                    },
                    "degree": {
                      "type": "string",
                      "description": "Degree description",
                      "nullable": true,
                      "example": "Bachelor of Science"
                    },
                    "startYear": {
                      "type": "integer",
                      "description": "Start year",
                      "nullable": true,
                      "example": 2014
                    },
                    "endYear": {
                      "type": "integer",
                      "description": "End year",
                      "nullable": true,
                      "example": 2018
                    }
                  },
                  "required": [],
                  "additionalProperties": true,
                  "nullable": true
                },
                "example": [
                  {
                    "institution": "Example University",
                    "degree": "Bachelor of Science",
                    "startYear": 2014,
                    "endYear": 2018
                  }
                ]
              },
              "languages": {
                "type": "array",
                "description": "Languages when exposed by the public page",
                "nullable": true,
                "items": {
                  "type": "string"
                },
                "example": [
                  "English"
                ]
              },
              "websites": {
                "type": "array",
                "description": "Personal websites exposed by the public profile",
                "nullable": true,
                "items": {
                  "type": "string"
                },
                "example": [
                  "https://example.com"
                ]
              },
              "scrapedAt": {
                "type": "string",
                "description": "Scrape timestamp in ISO 8601 format",
                "nullable": true,
                "example": "2025-01-15T12:00:00.000Z"
              }
            },
            "required": [],
            "additionalProperties": true
          },
          "views": {
            "overview": {
              "title": "Overview",
              "description": "Profile status and the most useful public profile fields",
              "transformation": {
                "fields": [
                  "success",
                  "error",
                  "name",
                  "linkedinUrl",
                  "headline",
                  "location",
                  "followerCount",
                  "currentPositions",
                  "education",
                  "profileImageUrl",
                  "scrapedAt"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "success": {
                    "label": "Success",
                    "format": "boolean"
                  },
                  "error": {
                    "label": "Error",
                    "format": "text"
                  },
                  "name": {
                    "label": "Name",
                    "format": "text"
                  },
                  "linkedinUrl": {
                    "label": "LinkedIn URL",
                    "format": "link"
                  },
                  "headline": {
                    "label": "Headline",
                    "format": "text"
                  },
                  "location": {
                    "label": "Location",
                    "format": "text"
                  },
                  "followerCount": {
                    "label": "Followers",
                    "format": "number"
                  },
                  "currentPositions": {
                    "label": "Current Positions",
                    "format": "array"
                  },
                  "education": {
                    "label": "Education",
                    "format": "array"
                  },
                  "profileImageUrl": {
                    "label": "Photo",
                    "format": "link"
                  },
                  "scrapedAt": {
                    "label": "Scraped At",
                    "format": "date"
                  }
                }
              }
            }
          }
        }
      },
      "dockerfile": "../Dockerfile",
      "defaultRunOptions": {
        "timeoutSecs": 300,
        "memoryMbytes": 256,
        "build": "latest"
      },
      "pricingPerEvent": {
        "actorChargeEvents": {
          "start": {
            "eventTitle": "Run started",
            "eventDescription": "One-time charge when the scraper starts.",
            "eventPriceUsd": 0.01,
            "isOneTimeEvent": true
          },
          "profile-scraped": {
            "eventTitle": "Profile scraped",
            "eventDescription": "Charged per LinkedIn profile extracted.",
            "eventTieredPricingUsd": {
              "FREE": {
                "tieredEventPriceUsd": 0.008
              },
              "BRONZE": {
                "tieredEventPriceUsd": 0.0072
              },
              "SILVER": {
                "tieredEventPriceUsd": 0.0064
              },
              "GOLD": {
                "tieredEventPriceUsd": 0.0052
              },
              "PLATINUM": {
                "tieredEventPriceUsd": 0.004
              },
              "DIAMOND": {
                "tieredEventPriceUsd": 0.0032
              }
            }
          }
        }
      },
      "actorChargeEvents": {
        "start": {
          "eventTitle": "Run started",
          "eventDescription": "One-time charge when the scraper starts.",
          "eventTieredPricingUsd": {
            "FREE": {
              "tieredEventPriceUsd": 0.01
            },
            "BRONZE": {
              "tieredEventPriceUsd": 0.0095
            },
            "SILVER": {
              "tieredEventPriceUsd": 0.0085
            },
            "GOLD": {
              "tieredEventPriceUsd": 0.0075
            },
            "PLATINUM": {
              "tieredEventPriceUsd": 0.006
            },
            "DIAMOND": {
              "tieredEventPriceUsd": 0.005
            }
          },
          "isOneTimeEvent": true
        },
        "profile-scraped": {
          "eventTitle": "Profile scraped",
          "eventDescription": "Charged per LinkedIn profile extracted.",
          "eventTieredPricingUsd": {
            "FREE": {
              "tieredEventPriceUsd": 0.008
            },
            "BRONZE": {
              "tieredEventPriceUsd": 0.0072
            },
            "SILVER": {
              "tieredEventPriceUsd": 0.0064
            },
            "GOLD": {
              "tieredEventPriceUsd": 0.0052
            },
            "PLATINUM": {
              "tieredEventPriceUsd": 0.004
            },
            "DIAMOND": {
              "tieredEventPriceUsd": 0.0032
            }
          },
          "isPrimaryEvent": true
        }
      },
      "changelog": "# Changelog\n\n## 2026-10-05\n\n_Reliability_\n\n- Ignore unsupported company, showcase, posts, and external URLs without losing usable profiles or consuming the profile limit.\n- Preserve completed results and report unprocessed work when the caller's run deadline leaves insufficient time for another request attempt.\n\n## 2026-10-03\n\n_Reliability_\n\n- Resolve social-style @ handles and @-prefixed profile URLs to the same LinkedIn profile slug, avoiding unnecessary blocked requests. Empty handles are ignored without consuming the profile limit.\n\n## 2026-10-02\n\n_Reliability_\n\n- Ignore null or blank profile entries from API integrations without losing valid batch results. Runs with no usable targets now return an uncharged empty dataset and a clear input diagnostic.\n\n## 2026-09-16\n\n_Reliability_\n\n- Added clear `success` and `error` values to every result and stopped charging the profile event when LinkedIn returns an unusable login, challenge, missing, or unparseable page.\n\n## 2026-07-04\n\n_Reliability_\n\n- Improved long LinkedIn profile scraping runs so they finish gracefully before the platform timeout while preserving completed profile results.\n\n## 2026-03-21\n\n_Features_\n\n- Launched LinkedIn Profile Scraper for extracting structured public profile details such as name, headline, location, education, work experience, skills, follower count, and profile image without requiring a LinkedIn login.\n",
      "readme": "# LinkedIn Profile Scraper\n\nScrape LinkedIn public profiles at scale — no login, no user-provided cookies, no browser. Extract structured data from any LinkedIn profile URL using fast HTTP requests and residential proxies.\n\n## What does LinkedIn Profile Scraper do?\n\nLinkedIn Profile Scraper extracts structured data from public LinkedIn profile pages. It works entirely through HTTP requests with residential proxies — no LinkedIn account, login credentials, or user-provided cookies required.\n\nFor each profile, the scraper returns:\n\n- A machine-readable `success` flag and nullable `error` reason on every row\n- Full name, headline, and location\n- About/summary section\n- Follower and connection counts\n- Profile image URL\n- Current positions with company name, title, and start date\n- Education history with institution, degree, and years\n- Personal websites exposed by the public profile metadata\n- Timestamp of when the data was scraped\n\nThe actor uses JSON-LD structured data embedded in LinkedIn's public profile pages, with stable metadata fallbacks. It processes profiles sequentially to reduce blocking and automatically retries failed requests across up to 4 fresh proxy sessions.\n\n## Use for engagement-lead enrichment\n\nAfter collecting LinkedIn profile URLs from engagement workflows, run them through this actor to add headline, location, about text, current positions, education, follower count, websites, and canonical URLs. Use those fields to score fit and personalize outreach before sending sales outreach messages.\n\n## Who is it for?\n\n🔍 **Recruiters and talent sourcers** — Build candidate pipelines by scraping profiles in bulk. Export to your ATS or spreadsheet for easy filtering by headline, location, and experience.\n\n📊 **Sales and business development teams** — Enrich your prospect lists with up-to-date LinkedIn data. Get headlines, company info, and follower counts to prioritize outreach.\n\n🧪 **Market researchers** — Analyze workforce trends, job title distributions, and career trajectories across industries at scale.\n\n🤖 **Data engineers and developers** — Feed structured LinkedIn data into your pipelines, CRMs, or machine learning models via API or webhooks.\n\n📈 **Growth hackers and marketers** — Identify influencers and thought leaders by follower count, build targeted audience segments, and track competitor teams.\n\n## Why use LinkedIn Profile Scraper?\n\n🚫 **No login required** — Unlike most LinkedIn scrapers, this one works without any LinkedIn account. No risk of account bans or credential management.\n\n⚡ **Fast HTTP-based scraping** — No headless browser overhead. Profiles are fetched via `got-scraping` with Cheerio parsing, making it significantly faster and cheaper than browser-based alternatives.\n\n🔄 **Automatic retries** — LinkedIn occasionally returns 999 status codes as an anti-bot measure. The scraper automatically makes up to 4 attempts per profile with different proxy sessions.\n\n💰 **Pay per useful result** — The profile event is charged only after a usable profile name and canonical LinkedIn URL are validated. Blocked, login, missing, and unparseable pages produce explicit `success: false` rows without a profile event charge.\n\n📦 **Clean structured output** — Every profile is returned as a flat JSON object ready for import into databases, spreadsheets, or APIs.\n\n🔗 **Flexible input** — Pass full LinkedIn URLs or just profile slugs (e.g., `williamhgates`). A leading `@` on a handle or URL slug is removed without changing the remaining identifier.\n\n## Data extraction table\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `success` | Boolean | `true` only when a usable public profile identity was extracted |\n| `error` | String or null | Failure reason for unsuccessful rows; `null` on success |\n| `name` | String or null | Full name from the profile |\n| `linkedinUrl` | String | Canonical LinkedIn profile URL |\n| `headline` | String | Professional headline |\n| `location` | String | Location as displayed on the profile |\n| `about` | String | About/summary section text |\n| `followerCount` | Number | Total follower count |\n| `connectionCount` | String | Connection count (may show \"500+\") |\n| `profileImageUrl` | String | URL to the profile photo |\n| `currentPositions` | Array | Current job positions with title, company, startDate |\n| `education` | Array | Education entries with institution, degree, startYear, endYear |\n| `languages` | Array | Compatibility field; currently empty when the public page does not expose languages |\n| `websites` | Array | Websites linked on the profile |\n| `scrapedAt` | String | ISO 8601 timestamp of when the profile was scraped |\n\n## How much does it cost to scrape LinkedIn profiles?\n\nLinkedIn Profile Scraper uses Apify's pay-per-event pricing model. A tiered run-start event is charged once, and you pay a tiered profile event only for profiles that pass the useful-profile validation.\n\n| Apify plan | Run start | Per validated profile |\n|---|---:|---:|\n| Free | $0.01 | $0.008 |\n| Bronze | $0.0095 | $0.0072 |\n| Silver | $0.0085 | $0.0064 |\n| Gold | $0.0075 | $0.0052 |\n| Platinum | $0.006 | $0.004 |\n| Diamond | $0.005 | $0.0032 |\n\n**Computed actor-charge example:** 100 validated profiles cost about **$0.81** on Free or **$0.7295** on Bronze (run-start charge + 100 profile events). Error rows do not incur the profile event.\n\nResidential proxy costs are included in these actor charges — no separate proxy fee.\n\n## How to scrape LinkedIn profiles\n\n1. 📝 **Go to the actor page** — Navigate to [LinkedIn Profile Scraper](https://apify.com/automation-lab/linkedin-profile-scraper) on Apify Store.\n2. ▶️ **Click \"Start\"** — Open the input configuration panel.\n3. 🔗 **Add profile URLs** — Paste LinkedIn profile URLs or slugs into the `profileUrls` field. One URL per line, for example: `https://www.linkedin.com/in/williamhgates/`.\n4. 🔢 **Set max profiles** — Optionally adjust `maxProfiles` to limit how many profiles to scrape (default: 100).\n5. 🚀 **Run the scraper** — Click \"Start\" and wait for results. Each profile takes a few seconds.\n6. 📥 **Download results** — Export your data as JSON, CSV, Excel, or connect it to your workflow via API or webhooks.\n\n## Input parameters\n\nOnly LinkedIn `/in/` profile URLs and profile slugs/handles are targets. Absolute company, showcase, posts, and non-LinkedIn URLs are ignored before the profile limit; they are not converted into profile slugs.\n\nRuns honor the caller's actual platform deadline. When there is not enough time for another bounded request attempt, completed results are retained and remaining profiles are not fetched. The default key-value store contains `RUN_DIAGNOSTIC` with `code: \"deadline_reached\"` and useful, error, and unprocessed counts. A partly attempted profile can return an honest uncharged error row; unprocessed profiles are not result rows. Increase the run timeout or split large batches to finish remaining work.\n\nNull, blank, nonstring, and empty `@` handle entries from API integrations are ignored before applying `maxProfiles`, so they cannot discard valid profiles in the same batch. If no usable targets remain (including an omitted or empty list), the Actor finishes with **zero dataset rows and no charges**. The default key-value store contains `INPUT_DIAGNOSTIC` with `code: \"invalid_input\"` and a corrective message. This is a caller-configuration outcome, not a scraped result; API and schedule callers should fix their upstream profile mappings. Real extraction/access errors retain the existing explicit error-row behavior.\n\n| Parameter | Type | Required | Default | Description |\n|-----------|------|----------|---------|-------------|\n| `profileUrls` | Array | Yes | — | List of LinkedIn profile URLs or slugs to scrape. Accepts full URLs like `https://www.linkedin.com/in/williamhgates/` or just the slug `williamhgates`. |\n| `maxProfiles` | Integer | No | 100 | Maximum number of profiles to process from the input list. |\n\n**Example input:**\n\n```json\n{\n    \"profileUrls\": [\n        \"https://www.linkedin.com/in/williamhgates/\",\n        \"https://www.linkedin.com/in/satyanadella\",\n        \"jeffweiner08\"\n    ],\n    \"maxProfiles\": 50\n}\n```\n\n## Output example\n\nEach scraped profile produces a JSON object with the following structure:\n\n```json\n{\n    \"success\": true,\n    \"error\": null,\n    \"name\": \"Bill Gates\",\n    \"linkedinUrl\": \"https://www.linkedin.com/in/williamhgates/\",\n    \"headline\": \"Chair, Gates Foundation and Founder, Breakthrough Energy\",\n    \"location\": \"Seattle, Washington, United States\",\n    \"about\": \"Chair of the Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft.\",\n    \"followerCount\": 40063481,\n    \"connectionCount\": \"8\",\n    \"profileImageUrl\": \"https://media.licdn.com/dms/image/...\",\n    \"currentPositions\": [\n        {\n            \"title\": \"Co-chair\",\n            \"company\": \"Gates Foundation\",\n            \"startDate\": \"2000\"\n        },\n        {\n            \"title\": \"Founder\",\n            \"company\": \"Breakthrough Energy\",\n            \"startDate\": \"2015\"\n        }\n    ],\n    \"education\": [\n        {\n            \"institution\": \"Harvard University\",\n            \"degree\": null,\n            \"startYear\": 1973,\n            \"endYear\": 1975\n        }\n    ],\n    \"languages\": [],\n    \"websites\": [],\n    \"scrapedAt\": \"2026-03-21T23:03:09.634Z\"\n}\n```\n\nResults are stored in the default dataset and can be exported in JSON, CSV, XML, Excel, or accessed via the Apify API.\n\n## Tips and best practices\n\n💡 **Use full URLs when possible** — While the scraper accepts bare slugs, full URLs reduce ambiguity and ensure correct profile resolution.\n\n💡 **Batch your requests** — Running one actor call with 500 profiles is cheaper than 500 individual runs, because you pay the plan-specific start fee only once.\n\n💡 **Expect some failures** — LinkedIn's anti-bot system occasionally blocks requests with a 999 status code. The scraper retries automatically, but some profiles may still fail. Plan for a 5-10% failure rate on large batches.\n\n💡 **Deduplicate your input** — Remove duplicate URLs before running to avoid paying for the same profile twice.\n\n💡 **Schedule regular runs** — Use Apify's built-in scheduler to keep your LinkedIn data fresh. Weekly or monthly scrapes work well for most use cases.\n\n💡 **Filter and retry failures** — Filter dataset rows with `success: false`, inspect their `error` value, and re-run only those URLs. These rows do not incur a `profile-scraped` event.\n\n## Integrations\n\nLinkedIn Profile Scraper connects with your existing tools through Apify's integration ecosystem:\n\n📊 **Google Sheets** — Automatically push scraped profiles to a Google Sheet. Great for recruiters maintaining candidate trackers.\n\n🗄️ **Webhooks** — Trigger your backend API whenever a run completes. Process new profile data in real time.\n\n💾 **Amazon S3 / Google Cloud Storage** — Export datasets directly to cloud storage for data lake ingestion.\n\n📧 **Zapier / Make** — Connect to 5,000+ apps. For example, scrape a profile and automatically create a HubSpot contact.\n\n🔄 **Slack notifications** — Get notified in Slack when a scraping batch completes with result counts.\n\n🗃️ **Apify Dataset API** — Programmatically fetch results in JSON, CSV, or Excel format from any language or platform.\n\n## API usage\n\nCall LinkedIn Profile Scraper programmatically using the Apify API. Here are examples in popular languages.\n\n### Node.js\n\n```javascript\nimport { ApifyClient } from 'apify-client';\n\nconst client = new ApifyClient({ token: 'YOUR_API_TOKEN' });\n\nconst run = await client.actor('automation-lab/linkedin-profile-scraper').call({\n    profileUrls: [\n        'https://www.linkedin.com/in/williamhgates/',\n        'https://www.linkedin.com/in/satyanadella',\n    ],\n    maxProfiles: 100,\n});\n\nconst { items } = await client.dataset(run.defaultDatasetId).listItems();\nitems.forEach((profile) => {\n    console.log(`${profile.name} — ${profile.headline}`);\n});\n```\n\n### Python\n\n```python\nfrom apify_client import ApifyClient\n\nclient = ApifyClient(\"YOUR_API_TOKEN\")\n\nrun = client.actor(\"automation-lab/linkedin-profile-scraper\").call(run_input={\n    \"profileUrls\": [\n        \"https://www.linkedin.com/in/williamhgates/\",\n        \"https://www.linkedin.com/in/satyanadella\",\n    ],\n    \"maxProfiles\": 100,\n})\n\ndataset = client.dataset(run[\"defaultDatasetId\"]).list_items().items\nfor profile in dataset:\n    print(f\"{profile['name']} — {profile['headline']}\")\n```\n\n### cURL\n\n```bash\n# Start the actor run\ncurl -X POST \"https://api.apify.com/v2/acts/automation-lab~linkedin-profile-scraper/runs?token=YOUR_API_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"profileUrls\": [\"https://www.linkedin.com/in/williamhgates/\"],\n    \"maxProfiles\": 10\n  }'\n\n# Fetch results (replace RUN_ID with the actual run ID from the response)\ncurl \"https://api.apify.com/v2/datasets/DATASET_ID/items?token=YOUR_API_TOKEN&format=json\"\n```\n\n## Use with Claude AI (MCP)\n\nThis actor is available as a tool in Claude AI through the Model Context Protocol (MCP). Add it to Claude Desktop, Cursor, Windsurf, or any MCP-compatible client.\n\n### Setup for Claude Code\n\n```bash\nclaude mcp add --transport http apify \"https://mcp.apify.com?tools=automation-lab/linkedin-profile-scraper\"\n```\n\n### Setup for Claude Desktop, Cursor, or VS Code\n\nAdd this to your MCP config file:\n\n```json\n{\n    \"mcpServers\": {\n        \"apify\": {\n            \"url\": \"https://mcp.apify.com?tools=automation-lab/linkedin-profile-scraper\"\n        }\n    }\n}\n```\n\n### Example prompts\n\n- \"Scrape the LinkedIn profile for Bill Gates and give me a summary of his current roles and background.\"\n- \"Get LinkedIn data for these 10 profile URLs and create a comparison table of their headlines and locations.\"\n- \"Pull LinkedIn profiles for the leadership team at OpenAI and tell me about their education backgrounds.\"\n\nLearn more in the [Apify MCP documentation](https://docs.apify.com/platform/integrations/mcp).\n\n## Data handling, AI, and support\n\nThis Actor does not use AI models or send inputs/results to an AI provider. It requests only the public LinkedIn profile URLs supplied by the user and stores results in the run's Apify dataset; it has no external result database or Actor-side cache. Dataset and log retention follow the user's Apify account storage settings, and users can delete runs and datasets with Apify's storage controls. Do not submit credentials, private profile data, or sensitive personal data as input.\n\nLinkedIn is a third-party source and may change or block its public pages. This Actor is independently operated and is not affiliated with, endorsed by, or sponsored by LinkedIn. For Actor support, use the issue/support channel on the Actor's Apify Store page and include the run ID plus a sanitized example URL.\n\n## Legality\n\nFailed operations send sanitized diagnostic input, exceptions, and Actor/build/run IDs to our private GlitchTip service for repair. Secret fields and URL query strings are removed; reports are retained for 30 days.\n\nScraping publicly available data is generally considered legal based on the 2022 US Ninth Circuit ruling in *hiQ Labs v. LinkedIn*, which confirmed that scraping public profiles does not violate the Computer Fraud and Abuse Act (CFAA).\n\nThis actor only accesses publicly visible LinkedIn profile pages — the same data any visitor can see without logging in. It does not bypass any authentication, use stolen credentials, or access private data.\n\nHowever, scraping may still violate LinkedIn's Terms of Service. Users are responsible for ensuring their use of scraped data complies with applicable laws including GDPR, CCPA, and other data protection regulations.\n\nFor more details, see Apify's guide on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).\n\n## FAQ — Frequently asked questions\n\n**Q: Do I need a LinkedIn account to use this scraper?**\n\nNo. LinkedIn Profile Scraper works entirely without login credentials. It accesses public profile pages through residential proxies, so no LinkedIn account is needed.\n\n**Q: Why did some profiles return no data?**\n\nLinkedIn's anti-bot system sometimes returns a 999 status code, a login page, or a challenge page. The scraper makes up to 4 attempts with different proxy sessions. If it still cannot validate a usable profile identity, it returns `success: false` with an `error` reason and does not charge the profile event. Try re-running only those failed URLs.\n\n**Q: Can I scrape private profiles or profiles behind a login wall?**\n\nNo. This scraper only extracts data from publicly visible profiles. If a profile requires signing in to view, it cannot be scraped by this actor.\n\n**Q: How fast is the scraping?**\n\nEach profile takes approximately 2-5 seconds to scrape, including retries. Profiles are processed sequentially to avoid triggering LinkedIn's rate limits. A batch of 100 profiles typically completes in 5-10 minutes.\n\n**Q: What format can I export the data in?**\n\nResults can be exported as JSON, CSV, XML, Excel (XLSX), or accessed directly through the Apify API. You can also push data to Google Sheets, webhooks, or cloud storage.\n\n**Q: Why does `connectionCount` show as a string?**\n\nLinkedIn displays connection counts differently depending on the profile. Some show exact numbers, others show \"500+\". The field is kept as a string to preserve this original formatting.\n\n## Related scrapers\n\nIf you find LinkedIn Profile Scraper useful, check out these related actors from automation-lab:\n\n🏢 [LinkedIn Company Scraper](https://apify.com/automation-lab/linkedin-company-scraper) — Scrape company pages for description, employee count, industry, and specialties.\n\n💼 [LinkedIn Jobs Scraper](https://apify.com/automation-lab/linkedin-jobs-scraper) — Search and extract LinkedIn job listings with title, company, location, and description.\n\n🔍 [LinkedIn Jobs Enrichment](https://apify.com/automation-lab/linkedin-jobs-enrichment) — Enrich LinkedIn job postings with additional details and structured data.\n\n📸 [Instagram Scraper](https://apify.com/automation-lab/instagram-scraper) — Extract posts, profiles, and hashtag data from Instagram.\n\n🐦 [Twitter Scraper](https://apify.com/automation-lab/twitter-scraper) — Scrape tweets, user profiles, and search results from Twitter/X.\n\n💙 [Bluesky Scraper](https://apify.com/automation-lab/bluesky-scraper) — Extract posts and profiles from Bluesky social network.\n\n🎵 [TikTok Scraper](https://apify.com/automation-lab/tiktok-scraper) — Scrape TikTok videos, user profiles, and hashtag content.\n"
    },
    "buildNumber": "0.1.32",
    "imageDigest": "738e74e02c4950fd9dbd84df1f6a8166d68eb714b86b0d4e64344bd37b6ba4d5",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "0.1"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.05634
    }
  }
}