{
  "data": {
    "id": "mQ3BQKLq4d9Cetv6Z",
    "actId": "vC8hsCNxgy47AQxDr",
    "userId": "FxhfOJ69tPoyLO54Z",
    "startedAt": "2026-09-23T10:58:23.973Z",
    "finishedAt": "2026-09-23T10:58:58.504Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "API"
    },
    "stats": {
      "durationMillis": 34399,
      "runTimeSecs": 34.399,
      "computeUnits": 0.03822111111111111,
      "imageSizeBytes": 513532928
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "tag": "quality-staging",
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"LinkedIn Profile Scraper & Email Finder — Input\",\n  \"description\": \"Scrape public LinkedIn profiles and optionally find work emails.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"profiles\": {\n      \"title\": \"LinkedIn profiles\",\n      \"type\": \"array\",\n      \"description\": \"Profile URLs or slugs, e.g. ‘williamhgates’ or ‘https://www.linkedin.com/in/williamhgates’. One per line. Up to 200 per run.\",\n      \"editor\": \"stringList\",\n      \"prefill\": [\n        \"williamhgates\",\n        \"https://www.linkedin.com/in/satyanadella\"\n      ],\n      \"minItems\": 1,\n      \"maxItems\": 200\n    },\n    \"includeEmail\": {\n      \"title\": \"Find work emails\",\n      \"type\": \"boolean\",\n      \"description\": \"Find each person's work email at the company domain below: common address formats are checked against the company's mail server, and an email is returned only when that exact mailbox is confirmed. Charged only when an email is found.\",\n      \"editor\": \"checkbox\",\n      \"default\": true\n    },\n    \"companyDomain\": {\n      \"title\": \"Company domain (for email finding)\",\n      \"type\": \"string\",\n      \"description\": \"The company's own domain to find emails at, e.g. ‘microsoft.com’ (not a public provider such as gmail.com). Applied to all profiles in this run. Leave blank to skip email finding.\",\n      \"editor\": \"textfield\"\n    }\n  }\n}",
    "readme": "# LinkedIn Profile Scraper & Email Finder — No Login Required\n\n**Scrape public LinkedIn profiles in bulk — name, headline, location, about, current company, photo, work history and education — and optionally find a confirmed work email at a company domain you supply. No login, no cookies, no account at risk.**\n\n## What does LinkedIn Profile Scraper do?\n\nPaste LinkedIn profile URLs or slugs and the Actor reads each profile's public page — the version LinkedIn shows to logged-out visitors — and turns it into a structured record. If you also give it a company domain, it builds the usual work-address formats from the person's name (`first.last@`, `first@`, `flast@` …) and checks them against the company's mail server, returning an address only when that exact mailbox is confirmed.\n\nIt only reads what a profile publicly shows. Profiles that LinkedIn hides behind a login wall come back with an `error` and are not charged.\n\n## What you get per profile\n\n| Field | Description |\n|---|---|\n| `profile_url` | Canonical `linkedin.com/in/…` URL |\n| `name` | Full name |\n| `headline` | The profile's public job titles, joined |\n| `location` | Location as shown on the profile |\n| `about` | The public \"About\" summary |\n| `current_company` | The first current employer listed |\n| `image` | Profile photo URL |\n| `experience` | Roles: `company`, `title`, `start_date`, `end_date`, `url`. Current roles carry their title; past roles LinkedIn shows publicly usually list the company and dates only |\n| `education` | Schools: `school`, `degree`, `start_date`, `end_date`, `url` (degree is often not public) |\n| `social_links` | Other websites the profile links to, when it lists any |\n| `email` / `email_score` | A work email at your company domain whose mailbox was confirmed, and its 0–100 deliverability score. `null` when no mailbox could be confirmed |\n| `error` | Present only when a profile could not be read (e.g. login wall); such rows are not charged |\n\nDates are as precise as LinkedIn shows them: a year (`2018`) or year and month (`2014-02`).\n\n## Use cases\n\n- **Recruiting** — enrich candidate lists with current role, work history and education.\n- **Sales prospecting** — turn a list of decision-maker profiles into records with work emails.\n- **Lead enrichment** — convert profile URLs into CRM-ready rows.\n- **Market research** — compare roles, tenure and career paths across a team or industry.\n- **AI agents** — structured profile data for outreach pipelines and MCP tools.\n\n## How to use\n\n1. Paste **LinkedIn profiles** — full URLs or just the slug (`satyanadella`), up to 200 per run.\n2. To look up emails, enter the **Company domain** the people work at (e.g. `microsoft.com`). It is applied to every profile in the run, so group profiles by company.\n3. Leave **Find work emails** on, or turn it off to scrape profiles only.\n4. Click **Start**, then export JSON, CSV or Excel, or pull the dataset via the Apify API.\n\n### Example input\n\n```json\n{\n  \"profiles\": [\"satyanadella\", \"https://www.linkedin.com/in/williamhgates\"],\n  \"includeEmail\": true,\n  \"companyDomain\": \"microsoft.com\"\n}\n```\n\n### Input configuration\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `profiles` | array of strings | — (required) | Profile URLs or slugs, 1–200 per run. Duplicates are removed. |\n| `includeEmail` | boolean | `true` | Look up a work email for each profile. Only runs when `companyDomain` is set. |\n| `companyDomain` | string | — | The company's own domain to find emails at, e.g. `microsoft.com` (public providers such as `gmail.com` are rejected). Leave blank to skip email finding. |\n\n### Example output\n\nA real row for a public profile:\n\n```json\n{\n  \"profile_url\": \"https://www.linkedin.com/in/satyanadella\",\n  \"name\": \"Satya Nadella\",\n  \"headline\": \"Chairman and CEO, Member Board Of Trustees\",\n  \"location\": \"Redmond, Washington, United States\",\n  \"about\": \"As chairman and CEO of Microsoft, I define my mission and that of my company as empowering every person and every organization on the planet to achieve more.\",\n  \"current_company\": \"Microsoft\",\n  \"image\": \"https://media.licdn.com/dms/image/v2/C5603AQHHUuOSlRVA1w/profile-displayphoto-shrink_200_200/...\",\n  \"social_links\": [],\n  \"experience\": [\n    { \"company\": \"Microsoft\", \"title\": \"Chairman and CEO\", \"start_date\": \"2014-02\", \"end_date\": null, \"url\": \"https://www.linkedin.com/company/microsoft\" },\n    { \"company\": \"University of Chicago\", \"title\": \"Member Board Of Trustees\", \"start_date\": \"2018\", \"end_date\": null, \"url\": \"https://www.linkedin.com/school/uchicago/\" },\n    { \"company\": \"Starbucks\", \"title\": null, \"start_date\": \"2017\", \"end_date\": \"2024\", \"url\": \"https://www.linkedin.com/company/starbucks\" }\n  ],\n  \"education\": [\n    { \"school\": \"The University of Chicago Booth School of Business\", \"degree\": null, \"start_date\": \"1994\", \"end_date\": \"1996\", \"url\": \"https://www.linkedin.com/school/universityofchicagoboothschoolofbusiness/\" }\n  ],\n  \"email\": null,\n  \"email_score\": null\n}\n```\n\n`email` and `email_score` are filled only when a work email's mailbox is confirmed at your company domain; otherwise they are `null` and you are not charged for an email.\n\n## How much does it cost to scrape LinkedIn profiles?\n\nPay per event. No subscription.\n\n| Event | Price | When it is charged |\n|---|---|---|\n| Actor start | $0.001 | Once per run in which at least one profile could be read |\n| Profile result | **$0.02** | Per profile scraped successfully (rows with an `error` are free) |\n| Email found | $0.06 | Only when a work email's mailbox is confirmed |\n\n- 100 profiles, no email lookup: $0.001 + 100 × $0.02 = **$2.001**.\n- 100 profiles with email lookup, 40 emails found: $2.001 + 40 × $0.06 = **$4.401**.\n\nIf no profile can be read at all, the run ends as failed and nothing is charged.\n\n## FAQ\n\n**Do I need to log in or provide cookies?** No. The Actor only reads the public version of each profile, so there is no LinkedIn account involved and nothing to get banned.\n\n**Why is a profile returned with an `error`?** LinkedIn sometimes shows a login wall instead of the public profile. Those rows carry an `error`, have no data and are not charged — re-running them later often works.\n\n**Why are some past roles missing a title, or education missing a degree?** LinkedIn's public profile view only exposes part of the data. The Actor returns everything that view contains and leaves the rest `null` rather than guessing.\n\n**How are emails found?** From the person's first and last name plus the company domain you provide. Up to six common address formats (`first.last@`, `first@`, `flast@`, `firstlast@`, `first_last@`, `f.last@`) are checked one at a time against the company's mail server, stopping at the first confirmed mailbox. No email is ever sent. Names are normalised first (accents removed, titles such as Dr. and post-nominals such as PhD dropped); profiles without a usable first and last name are skipped.\n\n**Why is `email` null for everyone at some companies?** Some mail servers accept every address (\"catch-all\"), so no individual mailbox can be confirmed there. The Actor does not guess in that case: `email` stays `null`, no email is charged, and the run's status message names the domain. If email checking is unavailable, the run log says so, profiles are still returned, and no email is charged.\n\n**Is this legal?** It collects only data that profiles publish publicly. You are responsible for using it in line with LinkedIn's terms and the privacy laws that apply to you (for example GDPR) — have a legitimate purpose, and do not use it to build spam lists.\n\n---\n\n*Tags: linkedin scraper, linkedin profile scraper, email finder, work email, lead generation, sales prospecting, recruiting, b2b leads, linkedin email.*\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "linkedin-profile-email-scraper",
      "title": "LinkedIn Profile Scraper & Email Finder - No Login",
      "description": "Scrape public LinkedIn profiles in bulk: name, headline, location, about & current company. Optionally find verified work emails by company domain. Paste profile URLs or slugs. Clean JSON/CSV for recruiting & sales. No login required.",
      "version": "0.0",
      "buildTag": "latest",
      "meta": {
        "templateId": "ts-empty"
      },
      "input": {
        "title": "LinkedIn Profile Scraper & Email Finder — Input",
        "description": "Scrape public LinkedIn profiles and optionally find work emails.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "profiles": {
            "title": "LinkedIn profiles",
            "type": "array",
            "description": "Profile URLs or slugs, e.g. ‘williamhgates’ or ‘https://www.linkedin.com/in/williamhgates’. One per line. Up to 200 per run.",
            "editor": "stringList",
            "prefill": [
              "williamhgates",
              "https://www.linkedin.com/in/satyanadella"
            ],
            "minItems": 1,
            "maxItems": 200
          },
          "includeEmail": {
            "title": "Find work emails",
            "type": "boolean",
            "description": "Find each person's work email at the company domain below: common address formats are checked against the company's mail server, and an email is returned only when that exact mailbox is confirmed. Charged only when an email is found.",
            "editor": "checkbox",
            "default": true
          },
          "companyDomain": {
            "title": "Company domain (for email finding)",
            "type": "string",
            "description": "The company's own domain to find emails at, e.g. ‘microsoft.com’ (not a public provider such as gmail.com). Applied to all profiles in this run. Leave blank to skip email finding.",
            "editor": "textfield"
          }
        }
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "LinkedIn Profile Scraper - Output",
        "description": "One row per profile, plus a run summary.",
        "properties": {
          "dataset": {
            "type": "string",
            "title": "Profiles",
            "description": "Scraped LinkedIn profiles.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          },
          "summary": {
            "type": "string",
            "title": "Run summary",
            "description": "Profiles scraped and emails found.",
            "template": "{{links.apiDefaultKeyValueStoreUrl}}/records/OUTPUT"
          }
        }
      },
      "dockerfile": "./Dockerfile",
      "readme": "# LinkedIn Profile Scraper & Email Finder — No Login Required\n\n**Scrape public LinkedIn profiles in bulk — name, headline, location, about, current company, photo, work history and education — and optionally find a confirmed work email at a company domain you supply. No login, no cookies, no account at risk.**\n\n## What does LinkedIn Profile Scraper do?\n\nPaste LinkedIn profile URLs or slugs and the Actor reads each profile's public page — the version LinkedIn shows to logged-out visitors — and turns it into a structured record. If you also give it a company domain, it builds the usual work-address formats from the person's name (`first.last@`, `first@`, `flast@` …) and checks them against the company's mail server, returning an address only when that exact mailbox is confirmed.\n\nIt only reads what a profile publicly shows. Profiles that LinkedIn hides behind a login wall come back with an `error` and are not charged.\n\n## What you get per profile\n\n| Field | Description |\n|---|---|\n| `profile_url` | Canonical `linkedin.com/in/…` URL |\n| `name` | Full name |\n| `headline` | The profile's public job titles, joined |\n| `location` | Location as shown on the profile |\n| `about` | The public \"About\" summary |\n| `current_company` | The first current employer listed |\n| `image` | Profile photo URL |\n| `experience` | Roles: `company`, `title`, `start_date`, `end_date`, `url`. Current roles carry their title; past roles LinkedIn shows publicly usually list the company and dates only |\n| `education` | Schools: `school`, `degree`, `start_date`, `end_date`, `url` (degree is often not public) |\n| `social_links` | Other websites the profile links to, when it lists any |\n| `email` / `email_score` | A work email at your company domain whose mailbox was confirmed, and its 0–100 deliverability score. `null` when no mailbox could be confirmed |\n| `error` | Present only when a profile could not be read (e.g. login wall); such rows are not charged |\n\nDates are as precise as LinkedIn shows them: a year (`2018`) or year and month (`2014-02`).\n\n## Use cases\n\n- **Recruiting** — enrich candidate lists with current role, work history and education.\n- **Sales prospecting** — turn a list of decision-maker profiles into records with work emails.\n- **Lead enrichment** — convert profile URLs into CRM-ready rows.\n- **Market research** — compare roles, tenure and career paths across a team or industry.\n- **AI agents** — structured profile data for outreach pipelines and MCP tools.\n\n## How to use\n\n1. Paste **LinkedIn profiles** — full URLs or just the slug (`satyanadella`), up to 200 per run.\n2. To look up emails, enter the **Company domain** the people work at (e.g. `microsoft.com`). It is applied to every profile in the run, so group profiles by company.\n3. Leave **Find work emails** on, or turn it off to scrape profiles only.\n4. Click **Start**, then export JSON, CSV or Excel, or pull the dataset via the Apify API.\n\n### Example input\n\n```json\n{\n  \"profiles\": [\"satyanadella\", \"https://www.linkedin.com/in/williamhgates\"],\n  \"includeEmail\": true,\n  \"companyDomain\": \"microsoft.com\"\n}\n```\n\n### Input configuration\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `profiles` | array of strings | — (required) | Profile URLs or slugs, 1–200 per run. Duplicates are removed. |\n| `includeEmail` | boolean | `true` | Look up a work email for each profile. Only runs when `companyDomain` is set. |\n| `companyDomain` | string | — | The company's own domain to find emails at, e.g. `microsoft.com` (public providers such as `gmail.com` are rejected). Leave blank to skip email finding. |\n\n### Example output\n\nA real row for a public profile:\n\n```json\n{\n  \"profile_url\": \"https://www.linkedin.com/in/satyanadella\",\n  \"name\": \"Satya Nadella\",\n  \"headline\": \"Chairman and CEO, Member Board Of Trustees\",\n  \"location\": \"Redmond, Washington, United States\",\n  \"about\": \"As chairman and CEO of Microsoft, I define my mission and that of my company as empowering every person and every organization on the planet to achieve more.\",\n  \"current_company\": \"Microsoft\",\n  \"image\": \"https://media.licdn.com/dms/image/v2/C5603AQHHUuOSlRVA1w/profile-displayphoto-shrink_200_200/...\",\n  \"social_links\": [],\n  \"experience\": [\n    { \"company\": \"Microsoft\", \"title\": \"Chairman and CEO\", \"start_date\": \"2014-02\", \"end_date\": null, \"url\": \"https://www.linkedin.com/company/microsoft\" },\n    { \"company\": \"University of Chicago\", \"title\": \"Member Board Of Trustees\", \"start_date\": \"2018\", \"end_date\": null, \"url\": \"https://www.linkedin.com/school/uchicago/\" },\n    { \"company\": \"Starbucks\", \"title\": null, \"start_date\": \"2017\", \"end_date\": \"2024\", \"url\": \"https://www.linkedin.com/company/starbucks\" }\n  ],\n  \"education\": [\n    { \"school\": \"The University of Chicago Booth School of Business\", \"degree\": null, \"start_date\": \"1994\", \"end_date\": \"1996\", \"url\": \"https://www.linkedin.com/school/universityofchicagoboothschoolofbusiness/\" }\n  ],\n  \"email\": null,\n  \"email_score\": null\n}\n```\n\n`email` and `email_score` are filled only when a work email's mailbox is confirmed at your company domain; otherwise they are `null` and you are not charged for an email.\n\n## How much does it cost to scrape LinkedIn profiles?\n\nPay per event. No subscription.\n\n| Event | Price | When it is charged |\n|---|---|---|\n| Actor start | $0.001 | Once per run in which at least one profile could be read |\n| Profile result | **$0.02** | Per profile scraped successfully (rows with an `error` are free) |\n| Email found | $0.06 | Only when a work email's mailbox is confirmed |\n\n- 100 profiles, no email lookup: $0.001 + 100 × $0.02 = **$2.001**.\n- 100 profiles with email lookup, 40 emails found: $2.001 + 40 × $0.06 = **$4.401**.\n\nIf no profile can be read at all, the run ends as failed and nothing is charged.\n\n## FAQ\n\n**Do I need to log in or provide cookies?** No. The Actor only reads the public version of each profile, so there is no LinkedIn account involved and nothing to get banned.\n\n**Why is a profile returned with an `error`?** LinkedIn sometimes shows a login wall instead of the public profile. Those rows carry an `error`, have no data and are not charged — re-running them later often works.\n\n**Why are some past roles missing a title, or education missing a degree?** LinkedIn's public profile view only exposes part of the data. The Actor returns everything that view contains and leaves the rest `null` rather than guessing.\n\n**How are emails found?** From the person's first and last name plus the company domain you provide. Up to six common address formats (`first.last@`, `first@`, `flast@`, `firstlast@`, `first_last@`, `f.last@`) are checked one at a time against the company's mail server, stopping at the first confirmed mailbox. No email is ever sent. Names are normalised first (accents removed, titles such as Dr. and post-nominals such as PhD dropped); profiles without a usable first and last name are skipped.\n\n**Why is `email` null for everyone at some companies?** Some mail servers accept every address (\"catch-all\"), so no individual mailbox can be confirmed there. The Actor does not guess in that case: `email` stays `null`, no email is charged, and the run's status message names the domain. If email checking is unavailable, the run log says so, profiles are still returned, and no email is charged.\n\n**Is this legal?** It collects only data that profiles publish publicly. You are responsible for using it in line with LinkedIn's terms and the privacy laws that apply to you (for example GDPR) — have a legitimate purpose, and do not use it to build spam lists.\n\n---\n\n*Tags: linkedin scraper, linkedin profile scraper, email finder, work email, lead generation, sales prospecting, recruiting, b2b leads, linkedin email.*\n",
      "categories": [
        "LEAD_GENERATION",
        "MARKETING",
        "AUTOMATION"
      ],
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Profiles",
              "description": "Name, headline, location, company and email.",
              "transformation": {
                "fields": [
                  "name",
                  "headline",
                  "location",
                  "current_company",
                  "image",
                  "email",
                  "email_score",
                  "profile_url"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "name": {
                    "label": "Name",
                    "format": "text"
                  },
                  "headline": {
                    "label": "Headline",
                    "format": "text"
                  },
                  "location": {
                    "label": "Location",
                    "format": "text"
                  },
                  "current_company": {
                    "label": "Company",
                    "format": "text"
                  },
                  "image": {
                    "label": "Photo",
                    "format": "link"
                  },
                  "email": {
                    "label": "Email",
                    "format": "text"
                  },
                  "email_score": {
                    "label": "Email score",
                    "format": "number"
                  },
                  "profile_url": {
                    "label": "Profile",
                    "format": "link"
                  }
                }
              }
            }
          }
        }
      },
      "environmentVariables": {
        "REOON_API_KEY": "@REOON_API_KEY"
      }
    },
    "buildNumber": "0.0.5",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "0.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.03822111111111111
    }
  }
}