{
  "data": {
    "id": "paOI65jNJgosA1vvl",
    "actId": "gn0TXEMFruwZEFpOt",
    "userId": "qNHv1aNFJdi7qCpWe",
    "startedAt": "2026-10-16T14:12:37.607Z",
    "finishedAt": "2026-10-16T14:13:07.950Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "API"
    },
    "stats": {
      "durationMillis": 30263,
      "runTimeSecs": 30.263,
      "computeUnits": 0.033625555555555554,
      "imageSizeBytes": 546882048
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "tag": "integrity-20261016",
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"LinkedIn Profile Scraper Input\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"profileUrls\": {\n      \"title\": \"🔗 LinkedIn Profile URLs\",\n      \"type\": \"array\",\n      \"description\": \"Paste LinkedIn profile URLs to scrape specific people. Accepts full URLs (https://linkedin.com/in/williamhgates), short slugs (/in/williamhgates), or bare usernames (williamhgates). Leave empty and use 'Search query' instead if you want to search by job title or industry.\\n\\n[AI agents] Use this field when given explicit profile URLs or usernames. Do NOT use when the user describes a niche — use searchQuery instead.\",\n      \"editor\": \"stringList\",\n      \"prefill\": [\n        \"https://www.linkedin.com/in/williamhgates\"\n      ],\n      \"sectionCaption\": \"What to scrape — choose URLs OR a search query (not both)\",\n      \"sectionDescription\": \"Provide specific LinkedIn profile URLs, OR describe the type of people you want via a search query. Both fields together will prioritize URLs.\"\n    },\n    \"publicIdentifiers\": {\n      \"title\": \"🪪 LinkedIn Slugs / Public Identifiers\",\n      \"type\": \"array\",\n      \"description\": \"Alternatively, paste just the username/slug part from the LinkedIn URL — e.g. 'williamhgates' instead of the full URL. Each entry is automatically converted to a full profile URL. This is the easiest way to paste a list from a spreadsheet.\\n\\n[AI agents] Accepts bare usernames or slug strings. Merged with profileUrls before scraping.\",\n      \"editor\": \"stringList\",\n      \"prefill\": []\n    },\n    \"searchQuery\": {\n      \"title\": \"🔍 Search query (people search)\",\n      \"type\": \"string\",\n      \"description\": \"Describe the type of people you want — LinkedIn will search for matching profiles. Examples: 'CTO fintech startup London', 'Python engineers Berlin', 'VP Sales SaaS New York'. Leave empty if you're providing specific URLs above.\\n\\n[AI agents] Use this field when the user describes a job title, industry, or niche instead of providing specific URLs. Do NOT use when given explicit URLs — use profileUrls for that.\",\n      \"editor\": \"textfield\",\n      \"prefill\": \"\"\n    },\n    \"includeEmail\": {\n      \"title\": \"📧 Include email enrichment (+$0.005/profile)\",\n      \"type\": \"boolean\",\n      \"description\": \"Also extract the email address when it's publicly visible on the profile. Costs $0.01/profile total instead of $0.005. Best for outreach campaigns and CRM import.\\n\\n[AI agents] Enable when the user asks for emails, contact info, or lead enrichment.\",\n      \"default\": false,\n      \"editor\": \"checkbox\",\n      \"sectionCaption\": \"Options\",\n      \"sectionDescription\": \"Control how many profiles to scrape and whether to include emails.\"\n    },\n    \"maxResults\": {\n      \"title\": \"📊 Maximum results\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of profiles to scrape. Lower = faster and cheaper for testing. Higher = full bulk export. Max 1,000 per run.\",\n      \"default\": 50,\n      \"minimum\": 1,\n      \"maximum\": 1000,\n      \"editor\": \"number\"\n    },\n    \"proxyConfiguration\": {\n      \"title\": \"Proxy configuration\",\n      \"type\": \"object\",\n      \"description\": \"Proxy settings. Leave as default — this actor calls our high-availability API directly and does not require proxy configuration.\",\n      \"editor\": \"proxy\",\n      \"sectionCaption\": \"Advanced\",\n      \"sectionDescription\": \"Leave as default for best results.\"\n    }\n  },\n  \"required\": []\n}",
    "readme": "## What is LinkedIn Profile Scraper & Email Finder 📧 ✅ No Login Required?\n\nThis Apify Actor accepts LinkedIn profile URLs, short slugs, bare public identifiers, or a people search query. It returns one dataset record per profile with public professional fields such as full name, headline, location, summary, current company, experience, education, skills, certifications, languages, and optional email and phone fields when email enrichment is enabled. The outcome is structured profile data that is ready for lead generation, CRM import, analysis, and AI-agent workflows. It runs on Apify and is usable through Apify MCP.\n\n## Best fit and connected workflows\n\nThis Actor fits workflows where you already know the people you want to inspect, or where you want LinkedIn to surface matching profiles from a search query.\n\nTypical routing patterns:\n\n- Use `profileUrls` when you already have exact LinkedIn profile links.\n- Use `publicIdentifiers` when you have slugs or usernames from a spreadsheet.\n- Use `searchQuery` when the input is a role, industry, location, or niche description.\n- Enable `includeEmail` when the workflow needs contact enrichment for outreach, CRM enrichment, or lead lists.\n- Start with LinkedIn Company Search Scraper when the workflow begins with company discovery, then pass the verified public profile links or identifiers into this Actor for person-level enrichment.\n\n## Practical scenario\n\nA recruiter has a shortlist of candidate profile URLs for three engineers and wants a clean summary for review.\n\nThey start with:\n- a set of LinkedIn URLs,\n- `maxResults` set to three,\n- `includeEmail` turned on because the hiring team wants contact details when visible.\n\nThe Actor returns:\n- `full_name` for each candidate,\n- `headline` for current positioning,\n- `current_company_name` for employer context,\n- `experience` and `education` for background review,\n- `skills` for matching,\n- `email` when publicly visible,\n- `_status` so the recruiter can separate scraped profiles from records that were not returned in full.\n\nThe recruiter then uses the returned fields to decide which candidates deserve a manual review and which profile to send to the hiring manager next.\n\n## Input fields\n\n| Field | Type | Purpose |\n|---|---|---|\n| `profileUrls` | array of strings | Full LinkedIn profile URLs, short `/in/` paths, or bare usernames. Use for specific people. |\n| `publicIdentifiers` | array of strings | Slugs or usernames such as `williamhgates`. Merged with `profileUrls` before scraping. |\n| `searchQuery` | string | People search query such as a role, industry, or location description. |\n| `includeEmail` | boolean | Adds email enrichment when publicly visible. |\n| `maxResults` | integer | Maximum number of profiles to scrape, up to 1,000 per run. |\n| `proxyConfiguration` | object | Proxy settings. The Actor calls its high-availability API directly and uses the default configuration. |\n\n### Input example\n\n```json\n{\n  \"profileUrls\": [\n    \"https://www.linkedin.com/in/williamhgates/\"\n  ],\n  \"includeEmail\": true,\n  \"maxResults\": 1\n}\n```\n\n## Output fields\n\n| Field | Type | Purpose |\n|---|---|---|\n| `_status` | string | Scrape status such as `scraped` or `not_found`. |\n| `full_name` | string or null | Person's displayed full name. |\n| `headline` | string or null | LinkedIn professional headline. |\n| `location` | string or null | Location as shown on the profile. |\n| `summary` | string or null | About section text. |\n| `profile_url` | string | Canonical LinkedIn profile URL. |\n| `profile_picture_url` | string or null | Public profile photo URL. |\n| `connections_count` | integer or null | Parsed connections count when visible. |\n| `current_company_name` | string or null | Current employer from the latest experience entry. |\n| `current_company_url` | string or null | LinkedIn company URL for the current employer when visible. |\n| `experience` | array | Reverse-chronological work history entries. |\n| `education` | array | Education entries with school, degree, field, and years. |\n| `skills` | array | Skills listed on the profile, up to 50. |\n| `certifications` | array | Professional certifications. |\n| `languages` | array | Languages listed on the profile. |\n| `email` | string or null | Email address when `includeEmail` is enabled and publicly visible. |\n| `phone` | string or null | Phone number when `includeEmail` is enabled and publicly listed. |\n| `source_url` | string | The LinkedIn URL that was scraped. |\n| `scraped_at` | string | ISO 8601 timestamp of extraction. |\n\n### Output example\n\n```json\n{\n  \"_status\": \"scraped\",\n  \"full_name\": \"Bill Gates\",\n  \"headline\": \"Co-chair, Bill & Melinda Gates Foundation\",\n  \"location\": \"Seattle, Washington, United States\",\n  \"profile_url\": \"https://www.linkedin.com/in/williamhgates/\",\n  \"current_company_name\": \"Gates Foundation\",\n  \"current_company_url\": \"https://www.linkedin.com/company/bill-melinda-gates-foundation/\",\n  \"skills\": [\"Leadership\", \"Strategic Planning\"],\n  \"email\": \"contact@billgates.com\",\n  \"source_url\": \"https://www.linkedin.com/in/williamhgates/\",\n  \"scraped_at\": \"2026-03-30T14:30:00.000Z\"\n}\n```\n\n## How it works\n\nThis Actor accepts either direct profile references or a people search query. It normalizes public identifiers into LinkedIn profile URLs, applies the selected result limit, and writes one dataset item per profile. The dataset schema includes an `_status` field so downstream tools can filter records before processing. When `includeEmail` is enabled, the output may also include email and phone fields if they are publicly visible on the profile.\n\nThe Actor is built for public LinkedIn profile extraction and is configured for Apify MCP and API usage. The live contract also shows environment variable support for the routing options listed in the input schema.\n\n## Pricing\n\n### Startup billing and empty runs\n\nThe `apify-actor-start` event costs **$0.00005 per startup unit**. Apify charges one startup unit per GB of allocated memory, with a minimum of one unit, so a 2 GB run incurs two units. This startup charge still applies when input is invalid, no results are found, or an upstream request fails. Statements about free, unbilled, or skipped results refer only to the corresponding result event; they do not waive the startup charge. Apify platform usage is included in the event prices and is not passed through as an additional customer charge. Check the live [Pricing tab](https://apify.com/khadinakbar/linkedin-profile-email-scraper/pricing) for current events, tiers, and rates. Result limits cap result events, not the entire run cost.\n\n\nThis Actor uses Pay per event on the Apify platform. Charges include the startup event and per-profile events, with Apify platform usage included; email enrichment uses its corresponding event.\n\nThe live Pricing tab in Apify shows the current billing details for:\n- profile scraping events,\n- profile-with-email events,\n- Apify platform usage.\n\nFor a simple event-count example: if a execution processes one hundred profiles, the bill reflects one hundred charged profile events, with Apify platform usage included from the execution configuration. Check the live Pricing tab for current rates before running.\n\n## Use with AI agents (MCP)\n\nThis Actor is available on Apify and can be used through Apify MCP for AI-agent workflows. It is designed for structured profile extraction with a stable schema that agents can read, filter, and pass to other tools.\n\n**Actor identity:** `khadinakbar/linkedin-profile-email-scraper`\n\nTool description: use this tool to scrape public LinkedIn profile data from profile URLs, slugs, public identifiers, or a people search query, and optionally enrich results with publicly visible email information.\n\n> Find these LinkedIn profiles by URL, return a dataset with full name, headline, company, skills, and email when visible, then summarize the people who look relevant for outreach.\n\nOutput interpretation:\n- Use `_status` first to separate fully scraped records from records that were not returned in full.\n- Use `profile_url` and `source_url` as provenance fields.\n- Use `scraped_at` to understand when the profile was extracted.\n- Use `email` and `phone` only when `includeEmail` is enabled and the public profile exposes those fields.\n\nScope and pagination guidance:\n- `maxResults` controls the number of profiles requested in a run, up to 1,000.\n- `profileUrls` and `publicIdentifiers` are the most precise inputs for agent workflows.\n- `searchQuery` is the right input when the request describes a role, industry, or niche rather than exact profile links.\n- Costs depend on the event type selected in the run and Apify platform usage; review the live Pricing tab for current billing information.\n\n## API example\n\n```javascript\nimport { ApifyClient } from 'apify-client';\n\nconst client = new ApifyClient({\n  token: process.env.APIFY_TOKEN,\n});\n\nconst run = await client.actor('khadinakbar/linkedin-profile-email-scraper').call({\n  profileUrls: ['https://www.linkedin.com/in/williamhgates/'],\n  includeEmail: true,\n  maxResults: 1,\n});\n\nconst items = await client.dataset(run.defaultDatasetId).listItems();\nconsole.log(items.items);\n```\n\n## Best results and outcome guidance\n\nUse the most specific input available:\n- exact URLs for known profiles,\n- slugs when copying from spreadsheets,\n- search queries when prospecting by role or niche.\n\nKeep `profileUrls` and `searchQuery` aligned with the actual task. If the work starts from a company list, a company-discovery Actor can help identify candidate profiles before passing them into this Actor for person-level enrichment. If the work centers on outreach, enable `includeEmail` only when contact enrichment is needed for that run.\n\n## Continue the workflow\n\n- Then use [LinkedIn Profile Posts Scraper — Posts by Person URL](https://apify.com/khadinakbar/linkedin-profile-posts-scraper) to extend LinkedIn Profile Scraper & Email Finder 📧 ✅ No Login Required research with a complementary enrichment contract.\n- Then use [LinkedIn Profile Search Scraper](https://apify.com/khadinakbar/linkedin-profile-search-scraper) to extend LinkedIn Profile Scraper & Email Finder 📧 ✅ No Login Required research with a complementary discovery contract.\n\n## Design note\n\nI found that the output contract includes both `profile_url` and `source_url` as required fields, which makes provenance easy to carry into downstream automation.\n\n## FAQ\n\n**When should I use `profileUrls` instead of `searchQuery`?**  \nUse `profileUrls` when you already have specific people. Use `searchQuery` when the request is framed as a role, industry, location, or niche.\n\n**How does `publicIdentifiers` help workflows?**  \nIt lets you paste LinkedIn slugs or usernames directly from spreadsheets, and the Actor converts them into full profile URLs before scraping.\n\n**What is the role of `_status` in the dataset?**  \nIt tells downstream systems whether the profile was scraped in full or returned as `not_found`, so agents can filter records before processing.\n\n**How does this Actor connect to company discovery workflows?**  \nStart with LinkedIn Company Search Scraper when the workflow begins with companies, then pass verified public profile links or identifiers into this Actor for profile enrichment.\n\n**What changes when `includeEmail` is enabled?**  \nThe Actor can include email and phone fields when those details are publicly visible on the profile, and the live contract marks those fields as optional outputs.\n\n## Responsible use\n\nUse this Actor on publicly accessible profile information and respect applicable laws, platform terms, and internal data-handling rules. Review the live Pricing tab before running, especially when using email enrichment or larger `maxResults` values. When integrating with AI agents, treat the returned fields as structured public profile data and apply your own review and governance before outreach or import.\n",
    "changelog": "\n\nv1.4 (2026-06-11) — All-fail soft-success: when every input URL fails at BOTH ScrapeCreators and SociaVault (vendor outage / rate-limit), the run now emits ONE schema-valid diagnostic row + terminal WARNING status and exits SUCCEEDED instead of finishing with a silently empty dataset. Routed pushDiagnosticResult through safePushData and guaranteed non-null required string fields (N/A sentinel). Per-URL warn-and-skip unchanged.\n\nv1.3 (2026-06-11) — Correct vendor field mapping: rewired ScrapeCreators + SociaVault response parsing to the real JSON shape (experience/education from `name` + nested `member` dates, connections from `followers`, string location). Added `source` field, best-effort regex email extraction from about/experience/recent posts, stripNulls + safePushData wrapper, and warn-and-skip on dual-provider failure so one bad URL never fails the run.\n\nv1.2 (2026-06-11) — Provider reliability hardening: replaced HarvestAPI with managed ScrapeCreators first, SociaVault fallback for LinkedIn profile fetches. Missing provider keys and upstream provider failures now produce structured diagnostic rows and SUMMARY data without failing the actor run.\n\nv1.2 (2026-06-10) — Success-rate hardening: missing HARVEST_API_KEY now returns a warning dataset item and SUMMARY with SUCCEEDED status instead of failing the actor run. Simplified schema prefill to one profile URL.\n\nv1.1 (2026-05-22) — Soft-fail user-input validation: convert Actor.fail on missing/invalid input to Actor.exit with WARNING status. Prevents user-input errors from counting as actor failures and dragging down 30-day success rate.",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "linkedin-profile-email-scraper",
      "title": "LinkedIn Profile Scraper & Email Finder 📧 ✅ No Login Required",
      "description": "Find and extract LinkedIn profiles with emails — no login, no cookies needed. Input URLs, slugs, or public identifiers. Returns name, headline, experience, education, skills, email, and contact data. MCP/AI-agent optimized with consistent output schema.",
      "version": "1.4",
      "buildTag": "latest",
      "input": {
        "title": "LinkedIn Profile Scraper Input",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "profileUrls": {
            "title": "🔗 LinkedIn Profile URLs",
            "type": "array",
            "description": "Paste LinkedIn profile URLs to scrape specific people. Accepts full URLs (https://linkedin.com/in/williamhgates), short slugs (/in/williamhgates), or bare usernames (williamhgates). Leave empty and use 'Search query' instead if you want to search by job title or industry.\n\n[AI agents] Use this field when given explicit profile URLs or usernames. Do NOT use when the user describes a niche — use searchQuery instead.",
            "editor": "stringList",
            "prefill": [
              "https://www.linkedin.com/in/williamhgates"
            ],
            "sectionCaption": "What to scrape — choose URLs OR a search query (not both)",
            "sectionDescription": "Provide specific LinkedIn profile URLs, OR describe the type of people you want via a search query. Both fields together will prioritize URLs."
          },
          "publicIdentifiers": {
            "title": "🪪 LinkedIn Slugs / Public Identifiers",
            "type": "array",
            "description": "Alternatively, paste just the username/slug part from the LinkedIn URL — e.g. 'williamhgates' instead of the full URL. Each entry is automatically converted to a full profile URL. This is the easiest way to paste a list from a spreadsheet.\n\n[AI agents] Accepts bare usernames or slug strings. Merged with profileUrls before scraping.",
            "editor": "stringList",
            "prefill": []
          },
          "searchQuery": {
            "title": "🔍 Search query (people search)",
            "type": "string",
            "description": "Describe the type of people you want — LinkedIn will search for matching profiles. Examples: 'CTO fintech startup London', 'Python engineers Berlin', 'VP Sales SaaS New York'. Leave empty if you're providing specific URLs above.\n\n[AI agents] Use this field when the user describes a job title, industry, or niche instead of providing specific URLs. Do NOT use when given explicit URLs — use profileUrls for that.",
            "editor": "textfield",
            "prefill": ""
          },
          "includeEmail": {
            "title": "📧 Include email enrichment (+$0.005/profile)",
            "type": "boolean",
            "description": "Also extract the email address when it's publicly visible on the profile. Costs $0.01/profile total instead of $0.005. Best for outreach campaigns and CRM import.\n\n[AI agents] Enable when the user asks for emails, contact info, or lead enrichment.",
            "default": false,
            "editor": "checkbox",
            "sectionCaption": "Options",
            "sectionDescription": "Control how many profiles to scrape and whether to include emails."
          },
          "maxResults": {
            "title": "📊 Maximum results",
            "type": "integer",
            "description": "Maximum number of profiles to scrape. Lower = faster and cheaper for testing. Higher = full bulk export. Max 1,000 per run.",
            "default": 50,
            "minimum": 1,
            "maximum": 1000,
            "editor": "number"
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxy settings. Leave as default — this actor calls our high-availability API directly and does not require proxy configuration.",
            "editor": "proxy",
            "sectionCaption": "Advanced",
            "sectionDescription": "Leave as default for best results."
          }
        },
        "required": []
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "fields": {
            "$schema": "http://json-schema.org/draft-07/schema#",
            "type": "object",
            "properties": {
              "_status": {
                "type": "string",
                "title": "Scrape status",
                "description": "Indicates the outcome of the scrape attempt. 'scraped' means a full profile was successfully extracted. 'not_found' means the profile was unreachable — private, deleted, blocked, or rate-limited. LLMs and automation tools should filter on this field before processing.",
                "example": "scraped"
              },
              "full_name": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Full name",
                "description": "The person's full name as displayed on their LinkedIn profile. Null when _status is 'not_found'.",
                "example": "Bill Gates"
              },
              "headline": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Professional headline",
                "description": "The short professional tagline shown below the person's name on LinkedIn. Typically their current role or professional summary.",
                "example": "Co-chair, Bill & Melinda Gates Foundation"
              },
              "location": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Location",
                "description": "City, state, and country as listed on the LinkedIn profile.",
                "example": "Seattle, Washington, United States"
              },
              "summary": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "About / Summary",
                "description": "The 'About' section text from the LinkedIn profile. Contains the person's professional summary, career goals, and personal statement.",
                "example": "Driven by the belief that every life has equal value..."
              },
              "profile_url": {
                "type": "string",
                "title": "LinkedIn profile URL",
                "description": "Canonical LinkedIn profile URL in the format https://www.linkedin.com/in/username/.",
                "example": "https://www.linkedin.com/in/williamhgates/"
              },
              "profile_picture_url": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Profile picture URL",
                "description": "Direct URL to the person's LinkedIn profile photo. Null if no photo is set or not publicly visible.",
                "example": "https://media.licdn.com/dms/image/C4E03AQH..."
              },
              "connections_count": {
                "type": [
                  "integer",
                  "null"
                ],
                "title": "Connections count",
                "description": "Number of LinkedIn connections. LinkedIn shows '500+' for profiles over 500 — this field returns the parsed number. Null if not visible.",
                "example": 500
              },
              "current_company_name": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Current company name",
                "description": "Name of the person's current employer, extracted from the most recent experience entry. Null if no experience listed.",
                "example": "Gates Foundation"
              },
              "current_company_url": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Current company LinkedIn URL",
                "description": "LinkedIn URL of the current employer's company page. Null if not available on the public page.",
                "example": "https://www.linkedin.com/company/bill-melinda-gates-foundation/"
              },
              "experience": {
                "type": "array",
                "title": "Work experience",
                "description": "Array of work experience entries in reverse-chronological order. Each entry contains: title (job title), company (employer name), duration (date range string), description (role description).",
                "example": [
                  {
                    "title": "Co-chair",
                    "company": "Bill & Melinda Gates Foundation",
                    "duration": "2000 - Present",
                    "description": "Co-chair and trustee of the Gates Foundation..."
                  }
                ]
              },
              "education": {
                "type": "array",
                "title": "Education history",
                "description": "Array of education entries. Each entry contains: school (institution name), degree (degree type), field (field of study), years (date range).",
                "example": [
                  {
                    "school": "Harvard University",
                    "degree": "Bachelor of Arts",
                    "field": "Computer Science",
                    "years": "1973 - 1975"
                  }
                ]
              },
              "skills": {
                "type": "array",
                "title": "Skills",
                "description": "Array of professional skills listed on the profile. Up to 50 skills are extracted. Useful for candidate matching and segmentation.",
                "example": [
                  "Leadership",
                  "Philanthropy",
                  "Software Development",
                  "Strategic Planning"
                ]
              },
              "certifications": {
                "type": "array",
                "title": "Certifications",
                "description": "Array of professional certifications. Each entry contains: name (certification title), issuer (issuing organization), date (issued date).",
                "example": [
                  {
                    "name": "Project Management Professional (PMP)",
                    "issuer": "Project Management Institute",
                    "date": "2020"
                  }
                ]
              },
              "languages": {
                "type": "array",
                "title": "Languages",
                "description": "Array of languages spoken as listed on the LinkedIn profile.",
                "example": [
                  "English",
                  "Spanish",
                  "French"
                ]
              },
              "email": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Email address",
                "description": "Discovered email address for this person. Only present when includeEmail input is set to true. Null if no email could be found on the public profile. Sourced from publicly visible contact information.",
                "example": "contact@billgates.com"
              },
              "phone": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Phone number",
                "description": "Phone number if visible on the public LinkedIn profile. Only present when includeEmail input is set to true. Null if not publicly listed.",
                "example": "+1-555-000-0000"
              },
              "source_url": {
                "type": "string",
                "title": "Source URL",
                "description": "The LinkedIn URL that was scraped to produce this record.",
                "example": "https://www.linkedin.com/in/williamhgates/"
              },
              "scraped_at": {
                "type": "string",
                "title": "Scraped at",
                "description": "ISO 8601 timestamp of when this profile record was extracted.",
                "example": "2026-03-30T14:30:00.000Z"
              }
            },
            "required": [
              "_status",
              "profile_url",
              "source_url",
              "scraped_at"
            ]
          },
          "views": {
            "overview": {
              "title": "Lead Overview",
              "transformation": {
                "fields": [
                  "_status",
                  "full_name",
                  "headline",
                  "location",
                  "current_company_name",
                  "email",
                  "profile_url",
                  "scraped_at"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "profile_url": {
                    "label": "LinkedIn",
                    "format": "link"
                  }
                }
              }
            },
            "full": {
              "title": "Full Profile",
              "transformation": {
                "fields": [
                  "full_name",
                  "headline",
                  "location",
                  "summary",
                  "profile_url",
                  "connections_count",
                  "current_company_name",
                  "email",
                  "phone",
                  "skills",
                  "experience",
                  "education",
                  "certifications",
                  "languages",
                  "scraped_at"
                ]
              },
              "display": {
                "component": "table",
                "properties": {}
              }
            }
          }
        },
        "keyValueStore": {
          "actorKeyValueStoreSchemaVersion": 1,
          "title": "LinkedIn Profile Scraper & Email Finder 📧 ✅ No Login Required KV Store",
          "collections": {
            "OUTPUT": {
              "title": "Run summary",
              "description": "Machine-readable run summary and final output metadata.",
              "keyPrefix": "OUTPUT"
            },
            "RUN_SUMMARY": {
              "title": "Run summary alias",
              "description": "Alias for tools that expect a RUN_SUMMARY record.",
              "keyPrefix": "RUN_SUMMARY"
            }
          }
        }
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "LinkedIn Profile Data with Emails",
        "description": "Structured LinkedIn profile records ready for lead generation and CRM import. Each result contains: full_name (string), headline (string or null), location (string or null), summary (string or null), profile_url (string), profile_picture_url (string or null), connections_count (integer or null), current_company_name (string or null), experience (array of {title, company, duration, description}), education (array of {school, degree, field, years}), skills (array of strings), certifications (array), languages (array), email (string or null, only when includeEmail is true), phone (string or null, only when includeEmail is true), source_url (string), scraped_at (ISO datetime string).",
        "properties": {
          "results": {
            "type": "string",
            "title": "LinkedIn Profile Records",
            "description": "Dataset of LinkedIn profiles with semantic field names for AI agent consumption and CRM import.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "environmentVariables": {
        "SCRAPECREATORS_API_KEY": "@SCRAPECREATORS_API_KEY",
        "SOCIAVAULT_API_KEY": "@SOCIAVAULT_API_KEY",
        "SOCIALVAULT_API_KEY": "@SOCIALVAULT_API_KEY"
      },
      "categories": [
        "LEAD_GENERATION",
        "SOCIAL_MEDIA",
        "MCP_SERVERS"
      ],
      "readme": "## What is LinkedIn Profile Scraper & Email Finder 📧 ✅ No Login Required?\n\nThis Apify Actor accepts LinkedIn profile URLs, short slugs, bare public identifiers, or a people search query. It returns one dataset record per profile with public professional fields such as full name, headline, location, summary, current company, experience, education, skills, certifications, languages, and optional email and phone fields when email enrichment is enabled. The outcome is structured profile data that is ready for lead generation, CRM import, analysis, and AI-agent workflows. It runs on Apify and is usable through Apify MCP.\n\n## Best fit and connected workflows\n\nThis Actor fits workflows where you already know the people you want to inspect, or where you want LinkedIn to surface matching profiles from a search query.\n\nTypical routing patterns:\n\n- Use `profileUrls` when you already have exact LinkedIn profile links.\n- Use `publicIdentifiers` when you have slugs or usernames from a spreadsheet.\n- Use `searchQuery` when the input is a role, industry, location, or niche description.\n- Enable `includeEmail` when the workflow needs contact enrichment for outreach, CRM enrichment, or lead lists.\n- Start with LinkedIn Company Search Scraper when the workflow begins with company discovery, then pass the verified public profile links or identifiers into this Actor for person-level enrichment.\n\n## Practical scenario\n\nA recruiter has a shortlist of candidate profile URLs for three engineers and wants a clean summary for review.\n\nThey start with:\n- a set of LinkedIn URLs,\n- `maxResults` set to three,\n- `includeEmail` turned on because the hiring team wants contact details when visible.\n\nThe Actor returns:\n- `full_name` for each candidate,\n- `headline` for current positioning,\n- `current_company_name` for employer context,\n- `experience` and `education` for background review,\n- `skills` for matching,\n- `email` when publicly visible,\n- `_status` so the recruiter can separate scraped profiles from records that were not returned in full.\n\nThe recruiter then uses the returned fields to decide which candidates deserve a manual review and which profile to send to the hiring manager next.\n\n## Input fields\n\n| Field | Type | Purpose |\n|---|---|---|\n| `profileUrls` | array of strings | Full LinkedIn profile URLs, short `/in/` paths, or bare usernames. Use for specific people. |\n| `publicIdentifiers` | array of strings | Slugs or usernames such as `williamhgates`. Merged with `profileUrls` before scraping. |\n| `searchQuery` | string | People search query such as a role, industry, or location description. |\n| `includeEmail` | boolean | Adds email enrichment when publicly visible. |\n| `maxResults` | integer | Maximum number of profiles to scrape, up to 1,000 per run. |\n| `proxyConfiguration` | object | Proxy settings. The Actor calls its high-availability API directly and uses the default configuration. |\n\n### Input example\n\n```json\n{\n  \"profileUrls\": [\n    \"https://www.linkedin.com/in/williamhgates/\"\n  ],\n  \"includeEmail\": true,\n  \"maxResults\": 1\n}\n```\n\n## Output fields\n\n| Field | Type | Purpose |\n|---|---|---|\n| `_status` | string | Scrape status such as `scraped` or `not_found`. |\n| `full_name` | string or null | Person's displayed full name. |\n| `headline` | string or null | LinkedIn professional headline. |\n| `location` | string or null | Location as shown on the profile. |\n| `summary` | string or null | About section text. |\n| `profile_url` | string | Canonical LinkedIn profile URL. |\n| `profile_picture_url` | string or null | Public profile photo URL. |\n| `connections_count` | integer or null | Parsed connections count when visible. |\n| `current_company_name` | string or null | Current employer from the latest experience entry. |\n| `current_company_url` | string or null | LinkedIn company URL for the current employer when visible. |\n| `experience` | array | Reverse-chronological work history entries. |\n| `education` | array | Education entries with school, degree, field, and years. |\n| `skills` | array | Skills listed on the profile, up to 50. |\n| `certifications` | array | Professional certifications. |\n| `languages` | array | Languages listed on the profile. |\n| `email` | string or null | Email address when `includeEmail` is enabled and publicly visible. |\n| `phone` | string or null | Phone number when `includeEmail` is enabled and publicly listed. |\n| `source_url` | string | The LinkedIn URL that was scraped. |\n| `scraped_at` | string | ISO 8601 timestamp of extraction. |\n\n### Output example\n\n```json\n{\n  \"_status\": \"scraped\",\n  \"full_name\": \"Bill Gates\",\n  \"headline\": \"Co-chair, Bill & Melinda Gates Foundation\",\n  \"location\": \"Seattle, Washington, United States\",\n  \"profile_url\": \"https://www.linkedin.com/in/williamhgates/\",\n  \"current_company_name\": \"Gates Foundation\",\n  \"current_company_url\": \"https://www.linkedin.com/company/bill-melinda-gates-foundation/\",\n  \"skills\": [\"Leadership\", \"Strategic Planning\"],\n  \"email\": \"contact@billgates.com\",\n  \"source_url\": \"https://www.linkedin.com/in/williamhgates/\",\n  \"scraped_at\": \"2026-03-30T14:30:00.000Z\"\n}\n```\n\n## How it works\n\nThis Actor accepts either direct profile references or a people search query. It normalizes public identifiers into LinkedIn profile URLs, applies the selected result limit, and writes one dataset item per profile. The dataset schema includes an `_status` field so downstream tools can filter records before processing. When `includeEmail` is enabled, the output may also include email and phone fields if they are publicly visible on the profile.\n\nThe Actor is built for public LinkedIn profile extraction and is configured for Apify MCP and API usage. The live contract also shows environment variable support for the routing options listed in the input schema.\n\n## Pricing\n\n### Startup billing and empty runs\n\nThe `apify-actor-start` event costs **$0.00005 per startup unit**. Apify charges one startup unit per GB of allocated memory, with a minimum of one unit, so a 2 GB run incurs two units. This startup charge still applies when input is invalid, no results are found, or an upstream request fails. Statements about free, unbilled, or skipped results refer only to the corresponding result event; they do not waive the startup charge. Apify platform usage is included in the event prices and is not passed through as an additional customer charge. Check the live [Pricing tab](https://apify.com/khadinakbar/linkedin-profile-email-scraper/pricing) for current events, tiers, and rates. Result limits cap result events, not the entire run cost.\n\n\nThis Actor uses Pay per event on the Apify platform. Charges include the startup event and per-profile events, with Apify platform usage included; email enrichment uses its corresponding event.\n\nThe live Pricing tab in Apify shows the current billing details for:\n- profile scraping events,\n- profile-with-email events,\n- Apify platform usage.\n\nFor a simple event-count example: if a execution processes one hundred profiles, the bill reflects one hundred charged profile events, with Apify platform usage included from the execution configuration. Check the live Pricing tab for current rates before running.\n\n## Use with AI agents (MCP)\n\nThis Actor is available on Apify and can be used through Apify MCP for AI-agent workflows. It is designed for structured profile extraction with a stable schema that agents can read, filter, and pass to other tools.\n\n**Actor identity:** `khadinakbar/linkedin-profile-email-scraper`\n\nTool description: use this tool to scrape public LinkedIn profile data from profile URLs, slugs, public identifiers, or a people search query, and optionally enrich results with publicly visible email information.\n\n> Find these LinkedIn profiles by URL, return a dataset with full name, headline, company, skills, and email when visible, then summarize the people who look relevant for outreach.\n\nOutput interpretation:\n- Use `_status` first to separate fully scraped records from records that were not returned in full.\n- Use `profile_url` and `source_url` as provenance fields.\n- Use `scraped_at` to understand when the profile was extracted.\n- Use `email` and `phone` only when `includeEmail` is enabled and the public profile exposes those fields.\n\nScope and pagination guidance:\n- `maxResults` controls the number of profiles requested in a run, up to 1,000.\n- `profileUrls` and `publicIdentifiers` are the most precise inputs for agent workflows.\n- `searchQuery` is the right input when the request describes a role, industry, or niche rather than exact profile links.\n- Costs depend on the event type selected in the run and Apify platform usage; review the live Pricing tab for current billing information.\n\n## API example\n\n```javascript\nimport { ApifyClient } from 'apify-client';\n\nconst client = new ApifyClient({\n  token: process.env.APIFY_TOKEN,\n});\n\nconst run = await client.actor('khadinakbar/linkedin-profile-email-scraper').call({\n  profileUrls: ['https://www.linkedin.com/in/williamhgates/'],\n  includeEmail: true,\n  maxResults: 1,\n});\n\nconst items = await client.dataset(run.defaultDatasetId).listItems();\nconsole.log(items.items);\n```\n\n## Best results and outcome guidance\n\nUse the most specific input available:\n- exact URLs for known profiles,\n- slugs when copying from spreadsheets,\n- search queries when prospecting by role or niche.\n\nKeep `profileUrls` and `searchQuery` aligned with the actual task. If the work starts from a company list, a company-discovery Actor can help identify candidate profiles before passing them into this Actor for person-level enrichment. If the work centers on outreach, enable `includeEmail` only when contact enrichment is needed for that run.\n\n## Continue the workflow\n\n- Then use [LinkedIn Profile Posts Scraper — Posts by Person URL](https://apify.com/khadinakbar/linkedin-profile-posts-scraper) to extend LinkedIn Profile Scraper & Email Finder 📧 ✅ No Login Required research with a complementary enrichment contract.\n- Then use [LinkedIn Profile Search Scraper](https://apify.com/khadinakbar/linkedin-profile-search-scraper) to extend LinkedIn Profile Scraper & Email Finder 📧 ✅ No Login Required research with a complementary discovery contract.\n\n## Design note\n\nI found that the output contract includes both `profile_url` and `source_url` as required fields, which makes provenance easy to carry into downstream automation.\n\n## FAQ\n\n**When should I use `profileUrls` instead of `searchQuery`?**  \nUse `profileUrls` when you already have specific people. Use `searchQuery` when the request is framed as a role, industry, location, or niche.\n\n**How does `publicIdentifiers` help workflows?**  \nIt lets you paste LinkedIn slugs or usernames directly from spreadsheets, and the Actor converts them into full profile URLs before scraping.\n\n**What is the role of `_status` in the dataset?**  \nIt tells downstream systems whether the profile was scraped in full or returned as `not_found`, so agents can filter records before processing.\n\n**How does this Actor connect to company discovery workflows?**  \nStart with LinkedIn Company Search Scraper when the workflow begins with companies, then pass verified public profile links or identifiers into this Actor for profile enrichment.\n\n**What changes when `includeEmail` is enabled?**  \nThe Actor can include email and phone fields when those details are publicly visible on the profile, and the live contract marks those fields as optional outputs.\n\n## Responsible use\n\nUse this Actor on publicly accessible profile information and respect applicable laws, platform terms, and internal data-handling rules. Review the live Pricing tab before running, especially when using email enrichment or larger `maxResults` values. When integrating with AI agents, treat the returned fields as structured public profile data and apply your own review and governance before outreach or import.\n",
      "changelog": "\n\nv1.4 (2026-06-11) — All-fail soft-success: when every input URL fails at BOTH ScrapeCreators and SociaVault (vendor outage / rate-limit), the run now emits ONE schema-valid diagnostic row + terminal WARNING status and exits SUCCEEDED instead of finishing with a silently empty dataset. Routed pushDiagnosticResult through safePushData and guaranteed non-null required string fields (N/A sentinel). Per-URL warn-and-skip unchanged.\n\nv1.3 (2026-06-11) — Correct vendor field mapping: rewired ScrapeCreators + SociaVault response parsing to the real JSON shape (experience/education from `name` + nested `member` dates, connections from `followers`, string location). Added `source` field, best-effort regex email extraction from about/experience/recent posts, stripNulls + safePushData wrapper, and warn-and-skip on dual-provider failure so one bad URL never fails the run.\n\nv1.2 (2026-06-11) — Provider reliability hardening: replaced HarvestAPI with managed ScrapeCreators first, SociaVault fallback for LinkedIn profile fetches. Missing provider keys and upstream provider failures now produce structured diagnostic rows and SUMMARY data without failing the actor run.\n\nv1.2 (2026-06-10) — Success-rate hardening: missing HARVEST_API_KEY now returns a warning dataset item and SUMMARY with SUCCEEDED status instead of failing the actor run. Simplified schema prefill to one profile URL.\n\nv1.1 (2026-05-22) — Soft-fail user-input validation: convert Actor.fail on missing/invalid input to Actor.exit with WARNING status. Prevents user-input errors from counting as actor failures and dragging down 30-day success rate.",
      "chargedEvents": "./pay_per_event.json"
    },
    "buildNumber": "1.4.7",
    "imageDigest": "ccd2e1a8c5dc7e04d21cd06363cdcdc7a9c6791f918614b2062507d4548bbfc4",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.4"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.033625555555555554
    }
  }
}