{
  "data": {
    "id": "yMtfKKt1AoAVJhCGn",
    "actId": "foBOWhQGRgBleInwu",
    "userId": "2Sdt05QypASulbUn1",
    "startedAt": "2026-10-09T04:30:18.356Z",
    "finishedAt": "2026-10-09T04:31:06.845Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "API"
    },
    "stats": {
      "durationMillis": 48398,
      "runTimeSecs": 48.398,
      "computeUnits": 0.053775555555555556,
      "imageSizeBytes": 539777536
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "tag": "beta",
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"LinkedIn Email Finder Input\",\n  \"description\": \"Who to find work emails for: a name with a company domain or company name, a public LinkedIn profile URL, or a pasted CSV. Every row comes back with a status, a confidence score and the evidence behind it.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"people\": {\n      \"title\": \"People (name + company or domain)\",\n      \"type\": \"array\",\n      \"editor\": \"json\",\n      \"description\": \"One entry per person. Objects like {\\\"fullName\\\": \\\"Jane Doe\\\", \\\"domain\\\": \\\"acme.com\\\"} or {\\\"fullName\\\": \\\"Jane Doe\\\", \\\"companyName\\\": \\\"Acme Inc\\\"} work, and so do CRM export keys such as \\\"First Name\\\", \\\"Last Name\\\", \\\"Company\\\", \\\"Website\\\" or \\\"LinkedIn URL\\\". Plain lines also work: \\\"Jane Doe, acme.com\\\" or \\\"Jane Doe @ Acme Inc\\\". A domain always beats a company name.\",\n      \"prefill\": [\n        {\n          \"fullName\": \"Patrick Collison\",\n          \"domain\": \"stripe.com\"\n        },\n        {\n          \"fullName\": \"Dharmesh Shah\",\n          \"companyName\": \"HubSpot\"\n        }\n      ]\n    },\n    \"linkedinUrls\": {\n      \"title\": \"LinkedIn profile URLs\",\n      \"type\": \"array\",\n      \"editor\": \"stringList\",\n      \"description\": \"Public profile URLs such as https://www.linkedin.com/in/username. The public page is read logged out for the name and current company, then the company's LinkedIn page for its website. No login or cookies. If LinkedIn will not show a profile to logged-out visitors, the name is taken from the URL and the row says so.\",\n      \"prefill\": [\n        \"https://www.linkedin.com/in/satyanadella\"\n      ]\n    },\n    \"csv\": {\n      \"title\": \"Paste a CSV\",\n      \"type\": \"string\",\n      \"editor\": \"textarea\",\n      \"description\": \"Optional. A CSV with a header row, pasted as text. Recognised columns include Full Name, First Name, Last Name, Company, Domain, Website and LinkedIn URL. Comma, semicolon and tab separated files all work.\"\n    },\n    \"domainOverride\": {\n      \"title\": \"Domain for rows without one\",\n      \"type\": \"string\",\n      \"editor\": \"textfield\",\n      \"description\": \"Optional. Used for every row that has no domain, for example a list of LinkedIn URLs of people who all work at acme.com.\"\n    },\n    \"findPatternOnWebsite\": {\n      \"title\": \"Look for evidence on the company website\",\n      \"type\": \"boolean\",\n      \"description\": \"Reads up to 5 pages of the company's own site (home, contact, team, press, imprint) for an address published for this person, or for the pattern its published personal addresses use. This is what turns a guess into a billable, evidence-backed email.\",\n      \"default\": true\n    },\n    \"checkSmtp\": {\n      \"title\": \"Ask the mail server (SMTP)\",\n      \"type\": \"boolean\",\n      \"description\": \"Asks the company's mail server whether the mailbox exists, without sending anything. Many cloud hosts block outbound port 25, and in our own Apify runs the check has not been able to reach mail servers. When it is blocked, the run notices within seconds, switches the check off and says so in the summary row.\",\n      \"default\": true\n    },\n    \"maxPeople\": {\n      \"title\": \"Max people\",\n      \"type\": \"integer\",\n      \"editor\": \"number\",\n      \"description\": \"Stop after this many people. Extra rows are skipped and never charged.\",\n      \"default\": 1000,\n      \"minimum\": 1,\n      \"maximum\": 5000\n    },\n    \"monitorMode\": {\n      \"title\": \"Monitor mode (only new or changed people)\",\n      \"type\": \"boolean\",\n      \"description\": \"Run on a schedule and deliver ONLY people who are new or whose work email, company or domain changed since a previous run (for example after a job change). You are charged per delivered email, not for the whole list each time. Ideal for monthly checks of a lead list. Requires the same input across runs.\",\n      \"default\": false,\n      \"editor\": \"checkbox\"\n    }\n  }\n}",
    "readme": "# LinkedIn Email Finder | Profile URL to Work Email, No Login\n\n[![3 work emails in 10 seconds: a recorded run took a name and domain, a name and company, and a LinkedIn profile URL, and returned one labelled work email for each](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/linkedin-email-finder-hero.png)](https://console.apify.com/actors/foBOWhQGRgBleInwu/input?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\nFrom **The Mine Works**, makers of [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral) and [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral), with over 140,000 runs across 170+ public actors.\n\n## Why choose this actor?\n\n- **Every email says how sure it is, and why.** A recorded run took 3 people and returned 3 work emails in 10 seconds: one address printed on the company's own website (`published`, confidence 90) and two labelled best guesses (`best_guess`, confidence 40). Each row carries its status, a 0 to 100 confidence, the evidence and the page it came from.\n- **Start from whatever you have.** A name with a domain, a name with a company name, a public LinkedIn profile URL, a CRM export row or a pasted CSV. Up to 5,000 people per run, duplicates dropped before any work, and no LinkedIn login or cookies.\n- **Rows without an email are never charged.** $1.50 to $2.00 per 1,000 emails depending on your Apify plan. Guesses cost the same as evidence but are always labelled. Rejected mailboxes, domains with no mail servers, personal domains such as gmail.com, unconfirmed domains, names that could not be split reliably and duplicate rows are free.\n\n[![Run it on Apify](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/button-run.png)](https://console.apify.com/actors/foBOWhQGRgBleInwu/input?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\n**Part of The Mine Works LinkedIn family:** [LinkedIn Company Scraper](https://apify.com/themineworks/linkedin-company-details?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral), [LinkedIn Post Scraper](https://apify.com/themineworks/linkedin-post-search?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral), [LinkedIn Employees Scraper](https://apify.com/themineworks/linkedin-employees?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral), [LinkedIn Profile Scraper](https://apify.com/themineworks/linkedin-profile-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral), [LinkedIn Newsletter Scraper](https://apify.com/themineworks/linkedin-newsletter-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral), [LinkedIn Candidate Finder](https://apify.com/themineworks/linkedin-candidate-finder?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral).\n\n## Try it in one minute\n\nPaste this into the input's JSON tab and start the run. It is the input of our recorded run: three people, three rows, about 10 seconds.\n\n```json\n{\n  \"people\": [\n    { \"fullName\": \"Jason Fried\", \"domain\": \"basecamp.com\" },\n    { \"fullName\": \"Tobi Lutke\", \"companyName\": \"Shopify\" }\n  ],\n  \"linkedinUrls\": [\"https://www.linkedin.com/in/satyanadella\"],\n  \"maxPeople\": 1000\n}\n```\n\nEach person can be given in any of these ways:\n\n- an object in `people` with `fullName` (or `firstName` and `lastName`) plus `domain` or `companyName`;\n- a CRM export row in `people`, such as `{\"First Name\": \"Jane\", \"Last Name\": \"Doe\", \"Company\": \"Acme Inc\", \"Website\": \"https://acme.com\"}`; column names are matched loosely, and a LinkedIn URL in the wrong column is still found;\n- a line of text in `people`: `\"Jane Doe, acme.com\"` or `\"Jane Doe @ Acme Inc\"`;\n- a public profile URL in `linkedinUrls` (or as a line in `people`), with any country subdomain, trailing slash or tracking parameters;\n- a pasted CSV with a header row in `csv`, comma, semicolon or tab separated.\n\n`domainOverride` fills in one domain for every row that has none. A domain always beats a company name.\n\nApify's free plan includes $5 of credit every month, which covers about 2,450 emails at this actor's price (the Free plan rate of $0.002 per email, plus the $0.01 start fee on each of 10 runs at the default memory). From 13 Oct 2026, when the start fee becomes a flat $0.005, the same credit covers about 2,475.\n\n### Copy to your AI assistant\n\n```\nthemineworks/linkedin-email-finder on Apify. Finds the most likely work email for a person from a name plus company domain, a name plus company name, a public LinkedIn profile URL, a CRM row or a pasted CSV, and labels each result with a status, a 0 to 100 confidence and the evidence (address published on the company site, the site's email pattern, a mail server check, or a labelled guess), with no LinkedIn login. Call ApifyClient(\"TOKEN\").actor(\"themineworks/linkedin-email-finder\").call(run_input={...}), then client.dataset(run[\"defaultDatasetId\"]).list_items().items. Required: at least one of people (objects like {\"fullName\": \"Jane Doe\", \"domain\": \"acme.com\"} or {\"fullName\": \"Jane Doe\", \"companyName\": \"Acme Inc\"}, CRM rows, or strings \"Jane Doe, acme.com\"), linkedinUrls (public profile URLs) or csv (text with a header row). Optional: domainOverride, findPatternOnWebsite (default true), checkSmtp (default true), maxPeople (default 1000, up to 5000), monitorMode (default false; true delivers and charges only people new or changed since an earlier run with the same input). Each person row has status, email, confidence, evidence, reason, alternates and billable; statuses verified, published and pattern_match have evidence, best_guess and catch_all are charged guesses, and rejected, no_mx, domain_not_found, company_unknown, not_a_company_domain, invalid_input and error rows are free. One row with _type \"summary\" and one with _type \"info\" close each run and are never charged. Full spec: GET https://api.apify.com/v2/acts/themineworks~linkedin-email-finder/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral\n```\n\n## Key features\n\n- **Five steps per person, evidence first.** Read the input; read the public LinkedIn profile when you give a URL (name and current employer, then the employer's LinkedIn page for its website); find the company domain; look for evidence on the company's own website; ask the mail server whether the mailbox exists, where outbound port 25 is open.\n- **Evidence from the company's own website.** Up to 5 pages per company (home, then contact, team, press, imprint and similar pages), `robots.txt` honoured, each site read once per run however many people work there. If the site prints this person's address, that is the answer. If it prints other staff addresses, their shared pattern (`jane.doe`, `jdoe`, `jane`) is used.\n- **One address plus four alternates.** Each row has the most likely address and, in `alternates`, the next four candidates with their pattern names, at no extra cost.\n- **12 statuses, 5 of them charged.** Every row says exactly what happened, from `verified` (the mail server accepted this mailbox) down to `invalid_input` (no usable name). See the table below.\n- **Fast enough for CRM batches.** Four people are looked up at a time. Rows come back in input order, each with `inputIndex` pointing at its place in your input.\n- **Stops wasting time on blocks.** If LinkedIn refuses several profile pages in a row, the remaining URLs fall back to the name in the URL. If the mail server port is closed, the check is switched off for the rest of the run within seconds.\n\n## How to use it\n\n### Basic: name and domain\n\n```json\n{\n  \"people\": [\n    { \"fullName\": \"Jason Fried\", \"domain\": \"basecamp.com\" }\n  ]\n}\n```\n\nThe fastest and most accurate input. In our recorded run this person came back `published` with confidence 90: Basecamp prints the address on its homepage.\n\n### Several people from a CRM export\n\n```json\n{\n  \"people\": [\n    { \"First Name\": \"Jane\", \"Last Name\": \"Doe\", \"Company\": \"Acme Inc\", \"Website\": \"https://acme.com\" },\n    { \"First Name\": \"Sam\", \"Last Name\": \"Lee\", \"Company\": \"Example Ltd\", \"Website\": \"example.co.uk\" }\n  ],\n  \"maxPeople\": 5000\n}\n```\n\nExport your contacts as JSON with their own column names and paste them in. Names like \"First Name\", \"Last Name\", \"Company\", \"Website\" and \"LinkedIn URL\" are recognised however they are spelled or capitalised. Or paste the same export as text into `csv`.\n\n### LinkedIn profile URLs from a prospect list\n\n```json\n{\n  \"linkedinUrls\": [\n    \"https://www.linkedin.com/in/satyanadella\",\n    \"https://www.linkedin.com/in/patrickcollison\"\n  ]\n}\n```\n\nEach profile is read logged out for the name and current employer, then the employer's LinkedIn page for its website. If everyone on the list works at one company, add `domainOverride` (for example `\"acme.com\"`) to skip the company lookup, and when a row already has a name and a domain the profile is not read at all, which is faster. [LinkedIn Employees Scraper](https://apify.com/themineworks/linkedin-employees?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral) finds public profile URLs at a company by job title.\n\n### Keep only addresses with evidence\n\nRun the list as usual, then filter the dataset on `confidence` of 70 or more, or drop rows whose `evidence` is `pattern_prior`. What is left was published on the company's site, follows the site's own pattern or passed a mail server check. Guesses are still charged, so for large lists of companies that publish no staff addresses, run a small sample first and look at the share of guesses.\n\n### Pipeline enrichment as new leads arrive\n\nThis is usually a one off step on a fresh batch of names. Call it from n8n, Make, Zapier or the API when new rows land in your CRM, with `maxPeople` set to the batch size. To run it on a timer instead, save the input as a task and add a schedule in Apify Console (Schedules, Create new). With `monitorMode` on, each scheduled run delivers and charges only people who are new or whose email, company or domain changed (see Run it on a schedule).\n\n## Input parameters\n\n| Parameter | Type | Default | What it does |\n|---|---|---|---|\n| `people` | array | none (prefilled with two examples) | One entry per person: an object (`fullName` or `firstName` and `lastName`, plus `domain` or `companyName`, optionally `linkedinUrl`), a CRM export row, or a line such as `\"Jane Doe, acme.com\"` or `\"Jane Doe @ Acme Inc\"`. |\n| `linkedinUrls` | array of strings | none (prefilled with one URL) | Public LinkedIn profile URLs. Read logged out for the name and current company. |\n| `csv` | string | none | A pasted CSV with a header row. Comma, semicolon or tab separated. |\n| `domainOverride` | string | none | Domain used for every row that has none. |\n| `findPatternOnWebsite` | boolean | `true` | Read up to 5 pages of the company's site for this person's address or the pattern of its published personal addresses. Turning it off leaves mostly guesses. |\n| `checkSmtp` | boolean | `true` | Ask the company's mail server whether the mailbox exists, without sending anything. Switched off automatically when port 25 is closed. |\n| `maxPeople` | integer | `1000` | Most people processed, 1 to 5,000. Extra rows are skipped and never charged. |\n| `monitorMode` | boolean | `false` | Deliver only people who are new or whose email, company or domain changed since an earlier run with the same input. Unchanged people are not charged. Made for monthly schedules. |\n\n## How sure is each email?\n\n| Status | Confidence | What it means | Charged? |\n|---|---|---|---|\n| `verified` | 95 | The mail server accepted this exact mailbox and rejected a random one | Yes |\n| `published` | 90 | This exact address is printed on the company's own website | Yes |\n| `pattern_match` | 70 or 80 | Personal addresses on the company's website use this pattern (80 when two or more agree) | Yes |\n| `best_guess` | about 40 | No evidence for this company; the most common pattern, `first.last` | Yes, labelled a guess |\n| `catch_all` | about 40 | The server accepts any address, so nothing could be checked, and the site gave no pattern | Yes, labelled a guess |\n| `rejected` | 5 | The server said none of the candidates exist (often: the person has left) | No |\n| `no_mx` | 0 | The domain has no mail servers | No |\n| `domain_not_found` | 0 | No website with mail servers could be found for the company name | No |\n| `company_unknown` | 0 | No company in the row and none on the LinkedIn profile | No |\n| `not_a_company_domain` | 0 | gmail.com, outlook.com and similar personal mail providers | No |\n| `invalid_input` | 0 | No usable name | No |\n| `error` | 0 | Something unexpected failed on this row | No |\n\nA row with an email is still not charged when its domain was only guessed from the company name and could not be confirmed on the company's homepage (its confidence is then capped at 40), or when the name had to be read from a LinkedIn URL that could not be split reliably (for example `williamhgates`). `billable: true` marks every charged row. `billable` is `false` on uncharged rows that reached the final check, and missing on rows that stopped early (`not_a_company_domain`, `company_unknown`, `invalid_input`, `domain_not_found`).\n\n## What data do you get?\n\nOne row per person, in input order, then a summary row and an info row.\n\n**The person:** `inputIndex` (position in your input), `fullName`, `firstName`, `lastName`, `nameSource` (`input`, `linkedin_profile`, or `linkedin_url_slug` when the name had to be read from the URL), and for LinkedIn rows `linkedinUrl`, `linkedinStatus` (`read`, `blocked`, `not_found` or `skipped`) and `headline`.\n\n**The company:** `company`, `domain`, `domainSource` (`input`, `domain_override`, `linkedin_company_page`, `company_name_lookup` or `company_name_guess`), `mxProvider` (for example `google_workspace`, `microsoft_365` or `other`).\n\n**The answer:** `email`, `pattern` (such as `first.last`), `status`, `confidence`, `evidence` (`published_on_company_site`, `company_site_pattern`, `smtp_accepted`, `smtp_rejected` or `pattern_prior`), `reason` (one plain sentence), `alternates` (four more addresses, each with its pattern), `verified` and `billable`.\n\n**What the website and mail server showed:** `evidenceUrl` (the page the evidence came from), `sitePattern` (the pattern the site's personal addresses use), `sitePersonalAddresses` (how many it found), `smtpCheck` (`unavailable` when port 25 is closed, `skipped` when you turned the check off).\n\n**When:** `scrapedAt`, the ISO time the row was written.\n\n**Summary row** (`_type: \"summary\"`, never charged): `received`, `duplicates`, `over_cap`, `processed`, `charged_for`, `by_status` (a count per status), `linkedin_fetches`, `linkedin_blocked`, `company_pages`, `sites_read`, `site_pages`, `smtp_sessions`, `smtp_rcpts`, `smtp_available`, `linkedin_stopped` and `scrapedAt`, plus `note: \"no_valid_rows\"` when the input held nobody to look up.\n\n**Info row** (`_type: \"info\"`, never charged): written when at least one email was charged, with the count and a scheduling tip. With monitor mode on, person rows also carry `monitor_status` (`new` or `changed`), and a last info row gives the monitor counts.\n\n### Stable fields for automations\n\nThe first five fields were present in every person row of our test runs, whatever the status. The other eight were present in every row that carried an email. Their names will not change, so a Google Sheet, Zapier zap or n8n flow can map them once.\n\n| Field | What it is |\n|---|---|\n| `inputIndex` | Position of the person in your input, the key to join back on |\n| `status` | One of the 12 statuses above |\n| `confidence` | 0 to 100 |\n| `reason` | One sentence on how the answer was reached |\n| `scrapedAt` | When this row was written, ISO 8601 |\n| `email` | The most likely work address |\n| `pattern` | Its pattern, such as `first.last` or `first` |\n| `evidence` | What the answer rests on |\n| `alternates` | Next four addresses, each `{ \"email\", \"pattern\" }` |\n| `domain` | The company domain used |\n| `domainSource` | Where that domain came from |\n| `verified` | True only for `verified` rows |\n| `billable` | True when the row was charged |\n\n### Output examples\n\n**An address printed on the company's website** (recorded run `XG8G6WMekAvbzPtvs`, 28 Sep 2026; charged):\n\n```json\n{\n  \"inputIndex\": 0,\n  \"nameSource\": \"input\",\n  \"fullName\": \"Jason Fried\",\n  \"firstName\": \"jason\",\n  \"lastName\": \"fried\",\n  \"domain\": \"basecamp.com\",\n  \"domainSource\": \"input\",\n  \"mxProvider\": \"other\",\n  \"sitePattern\": \"first\",\n  \"evidenceUrl\": \"https://basecamp.com/\",\n  \"sitePersonalAddresses\": 1,\n  \"smtpCheck\": \"unavailable\",\n  \"status\": \"published\",\n  \"email\": \"jason@basecamp.com\",\n  \"pattern\": \"first\",\n  \"confidence\": 90,\n  \"evidence\": \"published_on_company_site\",\n  \"reason\": \"This exact address is published on the company website.\",\n  \"alternates\": [\n    { \"email\": \"jason.fried@basecamp.com\", \"pattern\": \"first.last\" },\n    { \"email\": \"jfried@basecamp.com\", \"pattern\": \"flast\" },\n    { \"email\": \"jasonfried@basecamp.com\", \"pattern\": \"firstlast\" },\n    { \"email\": \"j.fried@basecamp.com\", \"pattern\": \"f.last\" }\n  ],\n  \"verified\": false,\n  \"billable\": true,\n  \"scrapedAt\": \"2026-09-28T12:47:52.378Z\"\n}\n```\n\n**A LinkedIn URL with no evidence on the company site** (same run; charged and labelled a guess):\n\n```json\n{\n  \"inputIndex\": 2,\n  \"linkedinUrl\": \"https://www.linkedin.com/in/satyanadella\",\n  \"nameSource\": \"linkedin_profile\",\n  \"fullName\": \"Satya Nadella\",\n  \"linkedinStatus\": \"read\",\n  \"headline\": \"Chairman and CEO\",\n  \"firstName\": \"satya\",\n  \"lastName\": \"nadella\",\n  \"company\": \"Microsoft\",\n  \"domain\": \"microsoft.com\",\n  \"domainSource\": \"linkedin_company_page\",\n  \"mxProvider\": \"microsoft_365\",\n  \"smtpCheck\": \"unavailable\",\n  \"status\": \"best_guess\",\n  \"email\": \"satya.nadella@microsoft.com\",\n  \"pattern\": \"first.last\",\n  \"confidence\": 40,\n  \"evidence\": \"pattern_prior\",\n  \"reason\": \"No evidence for this company yet. This is the most common work email pattern.\",\n  \"alternates\": [\n    { \"email\": \"satya@microsoft.com\", \"pattern\": \"first\" },\n    { \"email\": \"snadella@microsoft.com\", \"pattern\": \"flast\" },\n    { \"email\": \"satyanadella@microsoft.com\", \"pattern\": \"firstlast\" },\n    { \"email\": \"s.nadella@microsoft.com\", \"pattern\": \"f.last\" }\n  ],\n  \"verified\": false,\n  \"billable\": true,\n  \"scrapedAt\": \"2026-09-28T12:47:52.826Z\"\n}\n```\n\nThe third person in that run, Tobi Lutke at \"Shopify\", was matched to `shopify.com` through the company name (`domainSource: \"company_name_lookup\"`) and also came back `best_guess`.\n\n**A row that cannot produce a work email** (test run on our machine, 1 Oct 2026; never charged, and `billable` is missing because the row stopped early):\n\n```json\n{\n  \"inputIndex\": 0,\n  \"nameSource\": \"input\",\n  \"fullName\": \"Jane Nobody\",\n  \"firstName\": \"jane\",\n  \"lastName\": \"nobody\",\n  \"domain\": \"gmail.com\",\n  \"domainSource\": \"input\",\n  \"status\": \"not_a_company_domain\",\n  \"confidence\": 0,\n  \"reason\": \"gmail.com is a personal mailbox provider, not a company domain.\",\n  \"scrapedAt\": \"2026-10-01T13:45:41.448Z\"\n}\n```\n\n**The summary row of the recorded run** (trimmed):\n\n```json\n{\n  \"_type\": \"summary\",\n  \"received\": 3,\n  \"duplicates\": 0,\n  \"over_cap\": 0,\n  \"processed\": 3,\n  \"charged_for\": 3,\n  \"by_status\": { \"published\": 1, \"best_guess\": 2 },\n  \"linkedin_fetches\": 1,\n  \"linkedin_blocked\": 0,\n  \"company_pages\": 1,\n  \"sites_read\": 3,\n  \"site_pages\": 4,\n  \"smtp_sessions\": 3,\n  \"smtp_rcpts\": 0,\n  \"smtp_available\": false,\n  \"linkedin_stopped\": false,\n  \"scrapedAt\": \"2026-09-28T12:47:52.920Z\"\n}\n```\n\n`smtp_available: false` is what every run of ours on Apify has shown: outbound port 25 is closed there, so the mail server statuses (`verified`, `rejected` and `catch_all`) do not come up on Apify runs today. See \"Does it check the mail server?\" below.\n\n## Pricing\n\nPay per event. You are charged for each email returned on a charged row, plus a start fee per run. The rate falls as your Apify plan rises. The start fee changes on 13 Oct 2026.\n\n| Event | Free | Bronze | Silver | Gold and above |\n|---|---|---|---|---|\n| Email returned (`email-found`), per email | $0.002 | $0.002 | $0.0018 | $0.0015 |\n| Per 1,000 emails | $2.00 | $2.00 | $1.80 | $1.50 |\n| Run start until 12 Oct 2026 (`apify-actor-start`) | $0.01 per GB of run memory, minimum one event | same | same | same |\n| Run start from 13 Oct 2026 (`run-start`) | $0.005 flat per run | same | same | same |\n\n**The start fee, exactly.** Until 12 Oct 2026, Apify's `apify-actor-start` event is charged once when every run starts, one event per GB of memory with a minimum of one: $0.01 at the default 512 MB and at 1 GB, $0.04 at 4 GB. It applies to every run, including one with nothing to look up. From 13 Oct 2026 (00:00 UTC) it is replaced by our own `run-start` event: a flat $0.005 per run whatever memory you choose, charged once the input holds at least one row to look up. A run whose input holds no rows at all then costs nothing. The per email prices do not change.\n\n**Never charged:** rows with the statuses `rejected`, `no_mx`, `domain_not_found`, `company_unknown`, `not_a_company_domain`, `invalid_input` and `error`; rows whose domain was guessed from a company name and not confirmed; rows whose name was read from a LinkedIn URL that could not be split reliably; duplicate rows and rows over `maxPeople` (skipped before any work); the summary and info rows.\n\n**Guesses cost the same as evidence.** `best_guess` and `catch_all` rows are charged at the same price, always labelled. To keep only addresses with evidence, filter on `confidence` of 70 or more.\n\n**What real jobs cost on Gold:**\n\n| Run | Rows with an email | Until 12 Oct | From 13 Oct |\n|---|---|---|---|\n| The recorded run: 3 people | 3 | $0.0045 + $0.01 = $0.0145 | $0.0045 + $0.005 = $0.0095 |\n| 500 people, 450 with an email | 450 | $0.675 + $0.01 = $0.685 | $0.675 + $0.005 = $0.68 |\n| 500 people, no email found | 0 | $0.01 | $0.005 |\n\nThe Pricing tab on this page always shows the rate for your own plan.\n\n## Run it on a schedule\n\nSwitch on `monitorMode` to keep a lead list current. The first run delivers every person. After that, a person comes back only when the work email found for them, their company or their domain changes, which is what a job change looks like on a list of LinkedIn profile URLs. You pay only for the emails delivered.\n\n1. Fill in the input, tick **Monitor mode**, and save it as a task.\n2. In Apify Console open **Schedules**, click **Add schedule**, and pick **Monthly** (or a cron such as `0 7 1 * *`).\n3. Add the saved task to the schedule and click **Save**.\n\n```json\n{\n  \"linkedinUrls\": [\n    \"https://www.linkedin.com/in/satyanadella/\"\n  ],\n  \"monitorMode\": true\n}\n```\n\nEach delivered row carries `monitor_status`: `new` the first time, `changed` when the email, company or domain differs from the version you last received. A person with no change is looked up but not delivered and not charged; the flat run fee applies to every run as usual. A change in `status` or `confidence` alone does not count. A run that finds no email for someone already delivered, or cannot read their LinkedIn profile, never sends that as a change. The last row of each run (`_type: \"info\"`) gives `new_this_run`, `changed_this_run` and `skipped_already_seen`. The history belongs to the input: change the people, URLs, CSV or `domainOverride` and a new history starts; change `maxPeople`, `checkSmtp` or `findPatternOnWebsite` and it carries on.\n\n## FAQ\n\n**What does this actor do that a pattern guesser does not?**\nA pattern guesser hands you a list of candidates. This actor looks for evidence first (the company's own website, then the mail server where it can be reached), returns one address per person, says which kind of evidence it found or that it is a guess, and lists four alternates at no extra cost.\n\n**Does it check the mail server?**\nIt tries. Asking a mail server whether a mailbox exists needs outbound port 25, and many cloud hosts block it, including the Apify servers this actor runs on in all our tests. The run notices within seconds, switches the check off for the rest of the run, reports `smtpCheck: \"unavailable\"` on each row and `smtp_available: false` in the summary, and relies on website evidence instead. Run it on a machine where port 25 is open and `verified` rows can appear. Even then, many large companies accept every address (catch all), so no single mailbox can be confirmed there; those rows say `catch_all`.\n\n**Why did most of my rows come back `best_guess`?**\nBecause the companies on your list do not publish staff addresses on their websites, and the mail server could not be asked. Those rows are charged and labelled, so you can drop them or check them with an email verifier first. Small firms, agencies, media, law firms and German companies (imprint pages) often publish staff addresses; large tech companies usually publish only role addresses such as press@ or sales@, which are not used as evidence.\n\n**How accurate is a best guess?**\nA best guess is the most common work email pattern, `first.last`, and it is still wrong more often than right: many companies use `first`, `flast` or something else, and founders at tech companies often use just their first name (jason@basecamp.com in the example above). That is why its confidence is about 40 and why `alternates` lists the next four patterns.\n\n**How does the LinkedIn URL input work?**\nThe public profile page is read the way a logged out visitor or a search engine sees it, over Apify's datacenter proxy, with no login and no cookies. From it the actor takes the name, the headline and the current employer, then the employer's public LinkedIn page for its website. Some profiles are hidden from logged out visitors: the name is then read from the URL (`nameSource: \"linkedin_url_slug\"`), and without a company or domain in your row the result is `company_unknown`, so add `domainOverride` or a domain column. Some members show only a last initial, so only `first` and `firstl` style addresses can be built. Masked employer names are skipped.\n\n**Do I need a LinkedIn account, cookies or an API key?**\nNo. The actor never logs in and never uses cookies. It reads only what LinkedIn shows to logged out visitors and what companies publish on their own websites.\n\n**How many people can I look up?**\nUp to 5,000 per run (`maxPeople`, default 1,000). Four people are processed at a time and each company website is read once per run, however many of its people are on your list.\n\n**Does it use a database of known emails?**\nNo. Every answer comes from public pages read during your run, the mail server where reachable, or the pattern prior. It never returns personal addresses at gmail.com and similar providers.\n\n**What happens with duplicates and bad rows?**\nDuplicates (same LinkedIn URL, name and domain or company) are dropped before any work and counted in the summary's `duplicates`. Rows with no usable name come back `invalid_input`. Neither is charged.\n\n**How do I get the data out?**\nFrom the run's Storage tab as JSON, CSV, Excel, XML or HTML, or through the Apify API. CSV and Excel flatten `alternates` into numbered columns.\n\n**Can I run it from the API in one call?**\nYes, with Apify's run sync endpoint, which waits for the run and returns the rows:\n\n```bash\ncurl -X POST \"https://api.apify.com/v2/acts/themineworks~linkedin-email-finder/run-sync-get-dataset-items\" \\\n  -H \"Authorization: Bearer <YOUR_APIFY_TOKEN>\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"people\": [\"Jason Fried, basecamp.com\"]}'\n```\n\n**Can I use it from Claude, ChatGPT or another AI assistant?**\n- Connector URL: `https://mcp.apify.com/?tools=themineworks/linkedin-email-finder`.\n- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.\n- ChatGPT: developer mode, add an MCP connector with the URL, sign in with Apify.\n- Cursor or VS Code: add it as an HTTP MCP server with that URL.\n- Claude Code: `claude mcp add -t http linkedin-email-finder \"https://mcp.apify.com/?tools=themineworks/linkedin-email-finder\"`.\n\n**Is it legal to find work emails this way?**\nThe actor reads only public pages: public LinkedIn profiles as a logged out visitor, and the company's own website. In *hiQ Labs v. LinkedIn* (9th Cir. 2022) the court found that scraping publicly available LinkedIn profiles likely does not violate the Computer Fraud and Abuse Act. No login is used and no account terms are accepted. Work emails are still personal data, so you are responsible for how you use the results: have a lawful basis under GDPR, UK GDPR or CCPA where they apply, honour opt outs, and follow anti spam rules such as CAN-SPAM when you send. This is general information, not legal advice. This actor is independent and not affiliated with or endorsed by LinkedIn.\n\n## Integrations\n\nResults land in a standard Apify dataset, so they connect without extra code:\n\n- **Google Sheets:** send each run's rows to a sheet with Apify's Google Sheets integration.\n- **Make, Zapier and n8n:** start a run and read its dataset with the official Apify apps and nodes.\n- **Webhooks:** get a call to your own URL when a run succeeds, then fetch the dataset.\n- **API and SDKs:** start runs and read results with the Apify API, or the Python and JavaScript clients.\n- **MCP clients:** Claude, ChatGPT, Cursor and other MCP clients can call the actor through `https://mcp.apify.com/?tools=themineworks/linkedin-email-finder`.\n\n<!-- RELATED:START (generated by _readme_kit/related_block.py, do not edit by hand) -->\n## More from The Mine Works\n\n**LinkedIn**\n\n- [LinkedIn Company Scraper](https://apify.com/themineworks/linkedin-company-details?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [LinkedIn Post Scraper](https://apify.com/themineworks/linkedin-post-search?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [LinkedIn Employees Scraper](https://apify.com/themineworks/linkedin-employees?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [LinkedIn Profile Scraper](https://apify.com/themineworks/linkedin-profile-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [LinkedIn Newsletter Scraper](https://apify.com/themineworks/linkedin-newsletter-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [LinkedIn Candidate Finder](https://apify.com/themineworks/linkedin-candidate-finder?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\n**Social media and video**\n\n- [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Reddit Scraper](https://apify.com/themineworks/reddit-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Threads Search Scraper](https://apify.com/themineworks/threads-search-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Instagram Profile Scraper](https://apify.com/themineworks/instagram-profile-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\n**Leads and business directories**\n\n- [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Skip Trace Lookup](https://apify.com/themineworks/skip-trace-lookup?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Google Maps Email Scraper](https://apify.com/themineworks/maps-leads?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [JustDial Scraper](https://apify.com/themineworks/justdial-business?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\n**Marketing, SEO and reviews**\n\n- [Facebook Ad Library Scraper](https://apify.com/themineworks/meta-ad-library-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Similarweb Scraper](https://apify.com/themineworks/similarweb-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Google Ads Transparency Scraper](https://apify.com/themineworks/google-ads-transparency?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Google News Scraper](https://apify.com/themineworks/google-news?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\n**Real estate**\n\n- [Zillow Rentals Scraper](https://apify.com/themineworks/zillow-rental-listings?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Zillow Sold Comps Scraper](https://apify.com/themineworks/zillow-recently-sold?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Housing.com Scraper](https://apify.com/themineworks/housing-com-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [India Real Estate MCP](https://apify.com/themineworks/india-real-estate-mcp?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\n**Science, health and government data**\n\n- [CourtListener Scraper](https://apify.com/themineworks/courtlistener-court-records?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [data.gov.in Scraper](https://apify.com/themineworks/india-data-gov-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Socrata Open Data Scraper](https://apify.com/themineworks/socrata-open-data?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Academic Research MCP](https://apify.com/themineworks/academic-research-mcp?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\n**Jobs and hiring**\n\n- [Foundit Monster India Jobs](https://apify.com/themineworks/foundit-jobs-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Hirist Jobs Scraper](https://apify.com/themineworks/hirist-jobs-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [India Jobs MCP](https://apify.com/themineworks/india-jobs-mcp?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Naukri Jobs Scraper](https://apify.com/themineworks/naukri-jobs?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\n**E-commerce and marketplaces**\n\n- [Ozon.ru Scraper](https://apify.com/themineworks/ozon-product-search?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [⭐ Amazon Reviews Scraper](https://apify.com/themineworks/amazon-reviews?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Amazon Product Scraper](https://apify.com/themineworks/amazon-products?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Carsales.com.au Scraper](https://apify.com/themineworks/carsales-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\n**Company and business data**\n\n- [Company Domain Finder](https://apify.com/themineworks/company-domain-finder?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [GST Taxpayer Lookup](https://apify.com/themineworks/gst-taxpayer-lookup?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [World Bank Trade Scraper](https://apify.com/themineworks/global-trade-data?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Company KYB Resolver](https://apify.com/themineworks/company-identity-resolver?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\n**Food and local services**\n\n- [NoBroker Scraper](https://apify.com/themineworks/nobroker-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Swiggy Restaurant Scraper](https://apify.com/themineworks/swiggy-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Zomato Scraper](https://apify.com/themineworks/zomato-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\n**Developer and AI tools**\n\n- [Website to Markdown Crawler](https://apify.com/themineworks/rag-crawler?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [GitHub Skill Finder](https://apify.com/themineworks/github-skill-discovery?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [GitHub Repo Scraper](https://apify.com/themineworks/github-repo-intelligence?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [GitHub Trending Scraper](https://apify.com/themineworks/github-trending-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\n**More tools**\n\n- [Tennis Match & Player Data Scraper](https://apify.com/themineworks/tennis-match-data?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Google Hotels Prices Scraper](https://apify.com/themineworks/google-hotels-prices-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [LandWatch Scraper](https://apify.com/themineworks/landwatch-land-for-sale-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\n<!-- RELATED:END -->\n\n## Support\n\nFound a bug or need a field? Open an issue on the Issues tab of this actor. To ask for a new source, email dmineworks@gmail.com.\n\n*LinkedIn Email Finder turns a name and company, or a public LinkedIn profile URL, into one labelled work email with its confidence and evidence, with no login, from $1.50 per 1,000 emails.*\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "linkedin-email-finder",
      "title": "LinkedIn Email Finder | Profile URL to Work Email, No Login",
      "description": "Find work emails from LinkedIn profile URLs, or from a name plus a company or domain. One address per person with a status, a confidence score and its evidence: verified, published on the company site, matching its staff pattern, or a labelled guess. No login, no cookies.",
      "version": "0.1",
      "buildTag": "latest",
      "categories": [
        "LEAD_GENERATION",
        "SOCIAL_MEDIA",
        "MCP_SERVERS"
      ],
      "defaultRunOptions": {
        "memoryMbytes": 512,
        "timeoutSecs": 3600
      },
      "dockerfile": "../Dockerfile",
      "readme": "# LinkedIn Email Finder | Profile URL to Work Email, No Login\n\n[![3 work emails in 10 seconds: a recorded run took a name and domain, a name and company, and a LinkedIn profile URL, and returned one labelled work email for each](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/linkedin-email-finder-hero.png)](https://console.apify.com/actors/foBOWhQGRgBleInwu/input?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\nFrom **The Mine Works**, makers of [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral) and [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral), with over 140,000 runs across 170+ public actors.\n\n## Why choose this actor?\n\n- **Every email says how sure it is, and why.** A recorded run took 3 people and returned 3 work emails in 10 seconds: one address printed on the company's own website (`published`, confidence 90) and two labelled best guesses (`best_guess`, confidence 40). Each row carries its status, a 0 to 100 confidence, the evidence and the page it came from.\n- **Start from whatever you have.** A name with a domain, a name with a company name, a public LinkedIn profile URL, a CRM export row or a pasted CSV. Up to 5,000 people per run, duplicates dropped before any work, and no LinkedIn login or cookies.\n- **Rows without an email are never charged.** $1.50 to $2.00 per 1,000 emails depending on your Apify plan. Guesses cost the same as evidence but are always labelled. Rejected mailboxes, domains with no mail servers, personal domains such as gmail.com, unconfirmed domains, names that could not be split reliably and duplicate rows are free.\n\n[![Run it on Apify](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/button-run.png)](https://console.apify.com/actors/foBOWhQGRgBleInwu/input?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\n**Part of The Mine Works LinkedIn family:** [LinkedIn Company Scraper](https://apify.com/themineworks/linkedin-company-details?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral), [LinkedIn Post Scraper](https://apify.com/themineworks/linkedin-post-search?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral), [LinkedIn Employees Scraper](https://apify.com/themineworks/linkedin-employees?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral), [LinkedIn Profile Scraper](https://apify.com/themineworks/linkedin-profile-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral), [LinkedIn Newsletter Scraper](https://apify.com/themineworks/linkedin-newsletter-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral), [LinkedIn Candidate Finder](https://apify.com/themineworks/linkedin-candidate-finder?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral).\n\n## Try it in one minute\n\nPaste this into the input's JSON tab and start the run. It is the input of our recorded run: three people, three rows, about 10 seconds.\n\n```json\n{\n  \"people\": [\n    { \"fullName\": \"Jason Fried\", \"domain\": \"basecamp.com\" },\n    { \"fullName\": \"Tobi Lutke\", \"companyName\": \"Shopify\" }\n  ],\n  \"linkedinUrls\": [\"https://www.linkedin.com/in/satyanadella\"],\n  \"maxPeople\": 1000\n}\n```\n\nEach person can be given in any of these ways:\n\n- an object in `people` with `fullName` (or `firstName` and `lastName`) plus `domain` or `companyName`;\n- a CRM export row in `people`, such as `{\"First Name\": \"Jane\", \"Last Name\": \"Doe\", \"Company\": \"Acme Inc\", \"Website\": \"https://acme.com\"}`; column names are matched loosely, and a LinkedIn URL in the wrong column is still found;\n- a line of text in `people`: `\"Jane Doe, acme.com\"` or `\"Jane Doe @ Acme Inc\"`;\n- a public profile URL in `linkedinUrls` (or as a line in `people`), with any country subdomain, trailing slash or tracking parameters;\n- a pasted CSV with a header row in `csv`, comma, semicolon or tab separated.\n\n`domainOverride` fills in one domain for every row that has none. A domain always beats a company name.\n\nApify's free plan includes $5 of credit every month, which covers about 2,450 emails at this actor's price (the Free plan rate of $0.002 per email, plus the $0.01 start fee on each of 10 runs at the default memory). From 13 Oct 2026, when the start fee becomes a flat $0.005, the same credit covers about 2,475.\n\n### Copy to your AI assistant\n\n```\nthemineworks/linkedin-email-finder on Apify. Finds the most likely work email for a person from a name plus company domain, a name plus company name, a public LinkedIn profile URL, a CRM row or a pasted CSV, and labels each result with a status, a 0 to 100 confidence and the evidence (address published on the company site, the site's email pattern, a mail server check, or a labelled guess), with no LinkedIn login. Call ApifyClient(\"TOKEN\").actor(\"themineworks/linkedin-email-finder\").call(run_input={...}), then client.dataset(run[\"defaultDatasetId\"]).list_items().items. Required: at least one of people (objects like {\"fullName\": \"Jane Doe\", \"domain\": \"acme.com\"} or {\"fullName\": \"Jane Doe\", \"companyName\": \"Acme Inc\"}, CRM rows, or strings \"Jane Doe, acme.com\"), linkedinUrls (public profile URLs) or csv (text with a header row). Optional: domainOverride, findPatternOnWebsite (default true), checkSmtp (default true), maxPeople (default 1000, up to 5000), monitorMode (default false; true delivers and charges only people new or changed since an earlier run with the same input). Each person row has status, email, confidence, evidence, reason, alternates and billable; statuses verified, published and pattern_match have evidence, best_guess and catch_all are charged guesses, and rejected, no_mx, domain_not_found, company_unknown, not_a_company_domain, invalid_input and error rows are free. One row with _type \"summary\" and one with _type \"info\" close each run and are never charged. Full spec: GET https://api.apify.com/v2/acts/themineworks~linkedin-email-finder/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral\n```\n\n## Key features\n\n- **Five steps per person, evidence first.** Read the input; read the public LinkedIn profile when you give a URL (name and current employer, then the employer's LinkedIn page for its website); find the company domain; look for evidence on the company's own website; ask the mail server whether the mailbox exists, where outbound port 25 is open.\n- **Evidence from the company's own website.** Up to 5 pages per company (home, then contact, team, press, imprint and similar pages), `robots.txt` honoured, each site read once per run however many people work there. If the site prints this person's address, that is the answer. If it prints other staff addresses, their shared pattern (`jane.doe`, `jdoe`, `jane`) is used.\n- **One address plus four alternates.** Each row has the most likely address and, in `alternates`, the next four candidates with their pattern names, at no extra cost.\n- **12 statuses, 5 of them charged.** Every row says exactly what happened, from `verified` (the mail server accepted this mailbox) down to `invalid_input` (no usable name). See the table below.\n- **Fast enough for CRM batches.** Four people are looked up at a time. Rows come back in input order, each with `inputIndex` pointing at its place in your input.\n- **Stops wasting time on blocks.** If LinkedIn refuses several profile pages in a row, the remaining URLs fall back to the name in the URL. If the mail server port is closed, the check is switched off for the rest of the run within seconds.\n\n## How to use it\n\n### Basic: name and domain\n\n```json\n{\n  \"people\": [\n    { \"fullName\": \"Jason Fried\", \"domain\": \"basecamp.com\" }\n  ]\n}\n```\n\nThe fastest and most accurate input. In our recorded run this person came back `published` with confidence 90: Basecamp prints the address on its homepage.\n\n### Several people from a CRM export\n\n```json\n{\n  \"people\": [\n    { \"First Name\": \"Jane\", \"Last Name\": \"Doe\", \"Company\": \"Acme Inc\", \"Website\": \"https://acme.com\" },\n    { \"First Name\": \"Sam\", \"Last Name\": \"Lee\", \"Company\": \"Example Ltd\", \"Website\": \"example.co.uk\" }\n  ],\n  \"maxPeople\": 5000\n}\n```\n\nExport your contacts as JSON with their own column names and paste them in. Names like \"First Name\", \"Last Name\", \"Company\", \"Website\" and \"LinkedIn URL\" are recognised however they are spelled or capitalised. Or paste the same export as text into `csv`.\n\n### LinkedIn profile URLs from a prospect list\n\n```json\n{\n  \"linkedinUrls\": [\n    \"https://www.linkedin.com/in/satyanadella\",\n    \"https://www.linkedin.com/in/patrickcollison\"\n  ]\n}\n```\n\nEach profile is read logged out for the name and current employer, then the employer's LinkedIn page for its website. If everyone on the list works at one company, add `domainOverride` (for example `\"acme.com\"`) to skip the company lookup, and when a row already has a name and a domain the profile is not read at all, which is faster. [LinkedIn Employees Scraper](https://apify.com/themineworks/linkedin-employees?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral) finds public profile URLs at a company by job title.\n\n### Keep only addresses with evidence\n\nRun the list as usual, then filter the dataset on `confidence` of 70 or more, or drop rows whose `evidence` is `pattern_prior`. What is left was published on the company's site, follows the site's own pattern or passed a mail server check. Guesses are still charged, so for large lists of companies that publish no staff addresses, run a small sample first and look at the share of guesses.\n\n### Pipeline enrichment as new leads arrive\n\nThis is usually a one off step on a fresh batch of names. Call it from n8n, Make, Zapier or the API when new rows land in your CRM, with `maxPeople` set to the batch size. To run it on a timer instead, save the input as a task and add a schedule in Apify Console (Schedules, Create new). With `monitorMode` on, each scheduled run delivers and charges only people who are new or whose email, company or domain changed (see Run it on a schedule).\n\n## Input parameters\n\n| Parameter | Type | Default | What it does |\n|---|---|---|---|\n| `people` | array | none (prefilled with two examples) | One entry per person: an object (`fullName` or `firstName` and `lastName`, plus `domain` or `companyName`, optionally `linkedinUrl`), a CRM export row, or a line such as `\"Jane Doe, acme.com\"` or `\"Jane Doe @ Acme Inc\"`. |\n| `linkedinUrls` | array of strings | none (prefilled with one URL) | Public LinkedIn profile URLs. Read logged out for the name and current company. |\n| `csv` | string | none | A pasted CSV with a header row. Comma, semicolon or tab separated. |\n| `domainOverride` | string | none | Domain used for every row that has none. |\n| `findPatternOnWebsite` | boolean | `true` | Read up to 5 pages of the company's site for this person's address or the pattern of its published personal addresses. Turning it off leaves mostly guesses. |\n| `checkSmtp` | boolean | `true` | Ask the company's mail server whether the mailbox exists, without sending anything. Switched off automatically when port 25 is closed. |\n| `maxPeople` | integer | `1000` | Most people processed, 1 to 5,000. Extra rows are skipped and never charged. |\n| `monitorMode` | boolean | `false` | Deliver only people who are new or whose email, company or domain changed since an earlier run with the same input. Unchanged people are not charged. Made for monthly schedules. |\n\n## How sure is each email?\n\n| Status | Confidence | What it means | Charged? |\n|---|---|---|---|\n| `verified` | 95 | The mail server accepted this exact mailbox and rejected a random one | Yes |\n| `published` | 90 | This exact address is printed on the company's own website | Yes |\n| `pattern_match` | 70 or 80 | Personal addresses on the company's website use this pattern (80 when two or more agree) | Yes |\n| `best_guess` | about 40 | No evidence for this company; the most common pattern, `first.last` | Yes, labelled a guess |\n| `catch_all` | about 40 | The server accepts any address, so nothing could be checked, and the site gave no pattern | Yes, labelled a guess |\n| `rejected` | 5 | The server said none of the candidates exist (often: the person has left) | No |\n| `no_mx` | 0 | The domain has no mail servers | No |\n| `domain_not_found` | 0 | No website with mail servers could be found for the company name | No |\n| `company_unknown` | 0 | No company in the row and none on the LinkedIn profile | No |\n| `not_a_company_domain` | 0 | gmail.com, outlook.com and similar personal mail providers | No |\n| `invalid_input` | 0 | No usable name | No |\n| `error` | 0 | Something unexpected failed on this row | No |\n\nA row with an email is still not charged when its domain was only guessed from the company name and could not be confirmed on the company's homepage (its confidence is then capped at 40), or when the name had to be read from a LinkedIn URL that could not be split reliably (for example `williamhgates`). `billable: true` marks every charged row. `billable` is `false` on uncharged rows that reached the final check, and missing on rows that stopped early (`not_a_company_domain`, `company_unknown`, `invalid_input`, `domain_not_found`).\n\n## What data do you get?\n\nOne row per person, in input order, then a summary row and an info row.\n\n**The person:** `inputIndex` (position in your input), `fullName`, `firstName`, `lastName`, `nameSource` (`input`, `linkedin_profile`, or `linkedin_url_slug` when the name had to be read from the URL), and for LinkedIn rows `linkedinUrl`, `linkedinStatus` (`read`, `blocked`, `not_found` or `skipped`) and `headline`.\n\n**The company:** `company`, `domain`, `domainSource` (`input`, `domain_override`, `linkedin_company_page`, `company_name_lookup` or `company_name_guess`), `mxProvider` (for example `google_workspace`, `microsoft_365` or `other`).\n\n**The answer:** `email`, `pattern` (such as `first.last`), `status`, `confidence`, `evidence` (`published_on_company_site`, `company_site_pattern`, `smtp_accepted`, `smtp_rejected` or `pattern_prior`), `reason` (one plain sentence), `alternates` (four more addresses, each with its pattern), `verified` and `billable`.\n\n**What the website and mail server showed:** `evidenceUrl` (the page the evidence came from), `sitePattern` (the pattern the site's personal addresses use), `sitePersonalAddresses` (how many it found), `smtpCheck` (`unavailable` when port 25 is closed, `skipped` when you turned the check off).\n\n**When:** `scrapedAt`, the ISO time the row was written.\n\n**Summary row** (`_type: \"summary\"`, never charged): `received`, `duplicates`, `over_cap`, `processed`, `charged_for`, `by_status` (a count per status), `linkedin_fetches`, `linkedin_blocked`, `company_pages`, `sites_read`, `site_pages`, `smtp_sessions`, `smtp_rcpts`, `smtp_available`, `linkedin_stopped` and `scrapedAt`, plus `note: \"no_valid_rows\"` when the input held nobody to look up.\n\n**Info row** (`_type: \"info\"`, never charged): written when at least one email was charged, with the count and a scheduling tip. With monitor mode on, person rows also carry `monitor_status` (`new` or `changed`), and a last info row gives the monitor counts.\n\n### Stable fields for automations\n\nThe first five fields were present in every person row of our test runs, whatever the status. The other eight were present in every row that carried an email. Their names will not change, so a Google Sheet, Zapier zap or n8n flow can map them once.\n\n| Field | What it is |\n|---|---|\n| `inputIndex` | Position of the person in your input, the key to join back on |\n| `status` | One of the 12 statuses above |\n| `confidence` | 0 to 100 |\n| `reason` | One sentence on how the answer was reached |\n| `scrapedAt` | When this row was written, ISO 8601 |\n| `email` | The most likely work address |\n| `pattern` | Its pattern, such as `first.last` or `first` |\n| `evidence` | What the answer rests on |\n| `alternates` | Next four addresses, each `{ \"email\", \"pattern\" }` |\n| `domain` | The company domain used |\n| `domainSource` | Where that domain came from |\n| `verified` | True only for `verified` rows |\n| `billable` | True when the row was charged |\n\n### Output examples\n\n**An address printed on the company's website** (recorded run `XG8G6WMekAvbzPtvs`, 28 Sep 2026; charged):\n\n```json\n{\n  \"inputIndex\": 0,\n  \"nameSource\": \"input\",\n  \"fullName\": \"Jason Fried\",\n  \"firstName\": \"jason\",\n  \"lastName\": \"fried\",\n  \"domain\": \"basecamp.com\",\n  \"domainSource\": \"input\",\n  \"mxProvider\": \"other\",\n  \"sitePattern\": \"first\",\n  \"evidenceUrl\": \"https://basecamp.com/\",\n  \"sitePersonalAddresses\": 1,\n  \"smtpCheck\": \"unavailable\",\n  \"status\": \"published\",\n  \"email\": \"jason@basecamp.com\",\n  \"pattern\": \"first\",\n  \"confidence\": 90,\n  \"evidence\": \"published_on_company_site\",\n  \"reason\": \"This exact address is published on the company website.\",\n  \"alternates\": [\n    { \"email\": \"jason.fried@basecamp.com\", \"pattern\": \"first.last\" },\n    { \"email\": \"jfried@basecamp.com\", \"pattern\": \"flast\" },\n    { \"email\": \"jasonfried@basecamp.com\", \"pattern\": \"firstlast\" },\n    { \"email\": \"j.fried@basecamp.com\", \"pattern\": \"f.last\" }\n  ],\n  \"verified\": false,\n  \"billable\": true,\n  \"scrapedAt\": \"2026-09-28T12:47:52.378Z\"\n}\n```\n\n**A LinkedIn URL with no evidence on the company site** (same run; charged and labelled a guess):\n\n```json\n{\n  \"inputIndex\": 2,\n  \"linkedinUrl\": \"https://www.linkedin.com/in/satyanadella\",\n  \"nameSource\": \"linkedin_profile\",\n  \"fullName\": \"Satya Nadella\",\n  \"linkedinStatus\": \"read\",\n  \"headline\": \"Chairman and CEO\",\n  \"firstName\": \"satya\",\n  \"lastName\": \"nadella\",\n  \"company\": \"Microsoft\",\n  \"domain\": \"microsoft.com\",\n  \"domainSource\": \"linkedin_company_page\",\n  \"mxProvider\": \"microsoft_365\",\n  \"smtpCheck\": \"unavailable\",\n  \"status\": \"best_guess\",\n  \"email\": \"satya.nadella@microsoft.com\",\n  \"pattern\": \"first.last\",\n  \"confidence\": 40,\n  \"evidence\": \"pattern_prior\",\n  \"reason\": \"No evidence for this company yet. This is the most common work email pattern.\",\n  \"alternates\": [\n    { \"email\": \"satya@microsoft.com\", \"pattern\": \"first\" },\n    { \"email\": \"snadella@microsoft.com\", \"pattern\": \"flast\" },\n    { \"email\": \"satyanadella@microsoft.com\", \"pattern\": \"firstlast\" },\n    { \"email\": \"s.nadella@microsoft.com\", \"pattern\": \"f.last\" }\n  ],\n  \"verified\": false,\n  \"billable\": true,\n  \"scrapedAt\": \"2026-09-28T12:47:52.826Z\"\n}\n```\n\nThe third person in that run, Tobi Lutke at \"Shopify\", was matched to `shopify.com` through the company name (`domainSource: \"company_name_lookup\"`) and also came back `best_guess`.\n\n**A row that cannot produce a work email** (test run on our machine, 1 Oct 2026; never charged, and `billable` is missing because the row stopped early):\n\n```json\n{\n  \"inputIndex\": 0,\n  \"nameSource\": \"input\",\n  \"fullName\": \"Jane Nobody\",\n  \"firstName\": \"jane\",\n  \"lastName\": \"nobody\",\n  \"domain\": \"gmail.com\",\n  \"domainSource\": \"input\",\n  \"status\": \"not_a_company_domain\",\n  \"confidence\": 0,\n  \"reason\": \"gmail.com is a personal mailbox provider, not a company domain.\",\n  \"scrapedAt\": \"2026-10-01T13:45:41.448Z\"\n}\n```\n\n**The summary row of the recorded run** (trimmed):\n\n```json\n{\n  \"_type\": \"summary\",\n  \"received\": 3,\n  \"duplicates\": 0,\n  \"over_cap\": 0,\n  \"processed\": 3,\n  \"charged_for\": 3,\n  \"by_status\": { \"published\": 1, \"best_guess\": 2 },\n  \"linkedin_fetches\": 1,\n  \"linkedin_blocked\": 0,\n  \"company_pages\": 1,\n  \"sites_read\": 3,\n  \"site_pages\": 4,\n  \"smtp_sessions\": 3,\n  \"smtp_rcpts\": 0,\n  \"smtp_available\": false,\n  \"linkedin_stopped\": false,\n  \"scrapedAt\": \"2026-09-28T12:47:52.920Z\"\n}\n```\n\n`smtp_available: false` is what every run of ours on Apify has shown: outbound port 25 is closed there, so the mail server statuses (`verified`, `rejected` and `catch_all`) do not come up on Apify runs today. See \"Does it check the mail server?\" below.\n\n## Pricing\n\nPay per event. You are charged for each email returned on a charged row, plus a start fee per run. The rate falls as your Apify plan rises. The start fee changes on 13 Oct 2026.\n\n| Event | Free | Bronze | Silver | Gold and above |\n|---|---|---|---|---|\n| Email returned (`email-found`), per email | $0.002 | $0.002 | $0.0018 | $0.0015 |\n| Per 1,000 emails | $2.00 | $2.00 | $1.80 | $1.50 |\n| Run start until 12 Oct 2026 (`apify-actor-start`) | $0.01 per GB of run memory, minimum one event | same | same | same |\n| Run start from 13 Oct 2026 (`run-start`) | $0.005 flat per run | same | same | same |\n\n**The start fee, exactly.** Until 12 Oct 2026, Apify's `apify-actor-start` event is charged once when every run starts, one event per GB of memory with a minimum of one: $0.01 at the default 512 MB and at 1 GB, $0.04 at 4 GB. It applies to every run, including one with nothing to look up. From 13 Oct 2026 (00:00 UTC) it is replaced by our own `run-start` event: a flat $0.005 per run whatever memory you choose, charged once the input holds at least one row to look up. A run whose input holds no rows at all then costs nothing. The per email prices do not change.\n\n**Never charged:** rows with the statuses `rejected`, `no_mx`, `domain_not_found`, `company_unknown`, `not_a_company_domain`, `invalid_input` and `error`; rows whose domain was guessed from a company name and not confirmed; rows whose name was read from a LinkedIn URL that could not be split reliably; duplicate rows and rows over `maxPeople` (skipped before any work); the summary and info rows.\n\n**Guesses cost the same as evidence.** `best_guess` and `catch_all` rows are charged at the same price, always labelled. To keep only addresses with evidence, filter on `confidence` of 70 or more.\n\n**What real jobs cost on Gold:**\n\n| Run | Rows with an email | Until 12 Oct | From 13 Oct |\n|---|---|---|---|\n| The recorded run: 3 people | 3 | $0.0045 + $0.01 = $0.0145 | $0.0045 + $0.005 = $0.0095 |\n| 500 people, 450 with an email | 450 | $0.675 + $0.01 = $0.685 | $0.675 + $0.005 = $0.68 |\n| 500 people, no email found | 0 | $0.01 | $0.005 |\n\nThe Pricing tab on this page always shows the rate for your own plan.\n\n## Run it on a schedule\n\nSwitch on `monitorMode` to keep a lead list current. The first run delivers every person. After that, a person comes back only when the work email found for them, their company or their domain changes, which is what a job change looks like on a list of LinkedIn profile URLs. You pay only for the emails delivered.\n\n1. Fill in the input, tick **Monitor mode**, and save it as a task.\n2. In Apify Console open **Schedules**, click **Add schedule**, and pick **Monthly** (or a cron such as `0 7 1 * *`).\n3. Add the saved task to the schedule and click **Save**.\n\n```json\n{\n  \"linkedinUrls\": [\n    \"https://www.linkedin.com/in/satyanadella/\"\n  ],\n  \"monitorMode\": true\n}\n```\n\nEach delivered row carries `monitor_status`: `new` the first time, `changed` when the email, company or domain differs from the version you last received. A person with no change is looked up but not delivered and not charged; the flat run fee applies to every run as usual. A change in `status` or `confidence` alone does not count. A run that finds no email for someone already delivered, or cannot read their LinkedIn profile, never sends that as a change. The last row of each run (`_type: \"info\"`) gives `new_this_run`, `changed_this_run` and `skipped_already_seen`. The history belongs to the input: change the people, URLs, CSV or `domainOverride` and a new history starts; change `maxPeople`, `checkSmtp` or `findPatternOnWebsite` and it carries on.\n\n## FAQ\n\n**What does this actor do that a pattern guesser does not?**\nA pattern guesser hands you a list of candidates. This actor looks for evidence first (the company's own website, then the mail server where it can be reached), returns one address per person, says which kind of evidence it found or that it is a guess, and lists four alternates at no extra cost.\n\n**Does it check the mail server?**\nIt tries. Asking a mail server whether a mailbox exists needs outbound port 25, and many cloud hosts block it, including the Apify servers this actor runs on in all our tests. The run notices within seconds, switches the check off for the rest of the run, reports `smtpCheck: \"unavailable\"` on each row and `smtp_available: false` in the summary, and relies on website evidence instead. Run it on a machine where port 25 is open and `verified` rows can appear. Even then, many large companies accept every address (catch all), so no single mailbox can be confirmed there; those rows say `catch_all`.\n\n**Why did most of my rows come back `best_guess`?**\nBecause the companies on your list do not publish staff addresses on their websites, and the mail server could not be asked. Those rows are charged and labelled, so you can drop them or check them with an email verifier first. Small firms, agencies, media, law firms and German companies (imprint pages) often publish staff addresses; large tech companies usually publish only role addresses such as press@ or sales@, which are not used as evidence.\n\n**How accurate is a best guess?**\nA best guess is the most common work email pattern, `first.last`, and it is still wrong more often than right: many companies use `first`, `flast` or something else, and founders at tech companies often use just their first name (jason@basecamp.com in the example above). That is why its confidence is about 40 and why `alternates` lists the next four patterns.\n\n**How does the LinkedIn URL input work?**\nThe public profile page is read the way a logged out visitor or a search engine sees it, over Apify's datacenter proxy, with no login and no cookies. From it the actor takes the name, the headline and the current employer, then the employer's public LinkedIn page for its website. Some profiles are hidden from logged out visitors: the name is then read from the URL (`nameSource: \"linkedin_url_slug\"`), and without a company or domain in your row the result is `company_unknown`, so add `domainOverride` or a domain column. Some members show only a last initial, so only `first` and `firstl` style addresses can be built. Masked employer names are skipped.\n\n**Do I need a LinkedIn account, cookies or an API key?**\nNo. The actor never logs in and never uses cookies. It reads only what LinkedIn shows to logged out visitors and what companies publish on their own websites.\n\n**How many people can I look up?**\nUp to 5,000 per run (`maxPeople`, default 1,000). Four people are processed at a time and each company website is read once per run, however many of its people are on your list.\n\n**Does it use a database of known emails?**\nNo. Every answer comes from public pages read during your run, the mail server where reachable, or the pattern prior. It never returns personal addresses at gmail.com and similar providers.\n\n**What happens with duplicates and bad rows?**\nDuplicates (same LinkedIn URL, name and domain or company) are dropped before any work and counted in the summary's `duplicates`. Rows with no usable name come back `invalid_input`. Neither is charged.\n\n**How do I get the data out?**\nFrom the run's Storage tab as JSON, CSV, Excel, XML or HTML, or through the Apify API. CSV and Excel flatten `alternates` into numbered columns.\n\n**Can I run it from the API in one call?**\nYes, with Apify's run sync endpoint, which waits for the run and returns the rows:\n\n```bash\ncurl -X POST \"https://api.apify.com/v2/acts/themineworks~linkedin-email-finder/run-sync-get-dataset-items\" \\\n  -H \"Authorization: Bearer <YOUR_APIFY_TOKEN>\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"people\": [\"Jason Fried, basecamp.com\"]}'\n```\n\n**Can I use it from Claude, ChatGPT or another AI assistant?**\n- Connector URL: `https://mcp.apify.com/?tools=themineworks/linkedin-email-finder`.\n- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.\n- ChatGPT: developer mode, add an MCP connector with the URL, sign in with Apify.\n- Cursor or VS Code: add it as an HTTP MCP server with that URL.\n- Claude Code: `claude mcp add -t http linkedin-email-finder \"https://mcp.apify.com/?tools=themineworks/linkedin-email-finder\"`.\n\n**Is it legal to find work emails this way?**\nThe actor reads only public pages: public LinkedIn profiles as a logged out visitor, and the company's own website. In *hiQ Labs v. LinkedIn* (9th Cir. 2022) the court found that scraping publicly available LinkedIn profiles likely does not violate the Computer Fraud and Abuse Act. No login is used and no account terms are accepted. Work emails are still personal data, so you are responsible for how you use the results: have a lawful basis under GDPR, UK GDPR or CCPA where they apply, honour opt outs, and follow anti spam rules such as CAN-SPAM when you send. This is general information, not legal advice. This actor is independent and not affiliated with or endorsed by LinkedIn.\n\n## Integrations\n\nResults land in a standard Apify dataset, so they connect without extra code:\n\n- **Google Sheets:** send each run's rows to a sheet with Apify's Google Sheets integration.\n- **Make, Zapier and n8n:** start a run and read its dataset with the official Apify apps and nodes.\n- **Webhooks:** get a call to your own URL when a run succeeds, then fetch the dataset.\n- **API and SDKs:** start runs and read results with the Apify API, or the Python and JavaScript clients.\n- **MCP clients:** Claude, ChatGPT, Cursor and other MCP clients can call the actor through `https://mcp.apify.com/?tools=themineworks/linkedin-email-finder`.\n\n<!-- RELATED:START (generated by _readme_kit/related_block.py, do not edit by hand) -->\n## More from The Mine Works\n\n**LinkedIn**\n\n- [LinkedIn Company Scraper](https://apify.com/themineworks/linkedin-company-details?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [LinkedIn Post Scraper](https://apify.com/themineworks/linkedin-post-search?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [LinkedIn Employees Scraper](https://apify.com/themineworks/linkedin-employees?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [LinkedIn Profile Scraper](https://apify.com/themineworks/linkedin-profile-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [LinkedIn Newsletter Scraper](https://apify.com/themineworks/linkedin-newsletter-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [LinkedIn Candidate Finder](https://apify.com/themineworks/linkedin-candidate-finder?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\n**Social media and video**\n\n- [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Reddit Scraper](https://apify.com/themineworks/reddit-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Threads Search Scraper](https://apify.com/themineworks/threads-search-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Instagram Profile Scraper](https://apify.com/themineworks/instagram-profile-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\n**Leads and business directories**\n\n- [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Skip Trace Lookup](https://apify.com/themineworks/skip-trace-lookup?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Google Maps Email Scraper](https://apify.com/themineworks/maps-leads?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [JustDial Scraper](https://apify.com/themineworks/justdial-business?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\n**Marketing, SEO and reviews**\n\n- [Facebook Ad Library Scraper](https://apify.com/themineworks/meta-ad-library-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Similarweb Scraper](https://apify.com/themineworks/similarweb-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Google Ads Transparency Scraper](https://apify.com/themineworks/google-ads-transparency?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Google News Scraper](https://apify.com/themineworks/google-news?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\n**Real estate**\n\n- [Zillow Rentals Scraper](https://apify.com/themineworks/zillow-rental-listings?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Zillow Sold Comps Scraper](https://apify.com/themineworks/zillow-recently-sold?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Housing.com Scraper](https://apify.com/themineworks/housing-com-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [India Real Estate MCP](https://apify.com/themineworks/india-real-estate-mcp?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\n**Science, health and government data**\n\n- [CourtListener Scraper](https://apify.com/themineworks/courtlistener-court-records?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [data.gov.in Scraper](https://apify.com/themineworks/india-data-gov-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Socrata Open Data Scraper](https://apify.com/themineworks/socrata-open-data?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Academic Research MCP](https://apify.com/themineworks/academic-research-mcp?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\n**Jobs and hiring**\n\n- [Foundit Monster India Jobs](https://apify.com/themineworks/foundit-jobs-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Hirist Jobs Scraper](https://apify.com/themineworks/hirist-jobs-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [India Jobs MCP](https://apify.com/themineworks/india-jobs-mcp?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Naukri Jobs Scraper](https://apify.com/themineworks/naukri-jobs?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\n**E-commerce and marketplaces**\n\n- [Ozon.ru Scraper](https://apify.com/themineworks/ozon-product-search?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [⭐ Amazon Reviews Scraper](https://apify.com/themineworks/amazon-reviews?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Amazon Product Scraper](https://apify.com/themineworks/amazon-products?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Carsales.com.au Scraper](https://apify.com/themineworks/carsales-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\n**Company and business data**\n\n- [Company Domain Finder](https://apify.com/themineworks/company-domain-finder?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [GST Taxpayer Lookup](https://apify.com/themineworks/gst-taxpayer-lookup?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [World Bank Trade Scraper](https://apify.com/themineworks/global-trade-data?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Company KYB Resolver](https://apify.com/themineworks/company-identity-resolver?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\n**Food and local services**\n\n- [NoBroker Scraper](https://apify.com/themineworks/nobroker-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Swiggy Restaurant Scraper](https://apify.com/themineworks/swiggy-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Zomato Scraper](https://apify.com/themineworks/zomato-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\n**Developer and AI tools**\n\n- [Website to Markdown Crawler](https://apify.com/themineworks/rag-crawler?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [GitHub Skill Finder](https://apify.com/themineworks/github-skill-discovery?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [GitHub Repo Scraper](https://apify.com/themineworks/github-repo-intelligence?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [GitHub Trending Scraper](https://apify.com/themineworks/github-trending-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\n**More tools**\n\n- [Tennis Match & Player Data Scraper](https://apify.com/themineworks/tennis-match-data?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [Google Hotels Prices Scraper](https://apify.com/themineworks/google-hotels-prices-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n- [LandWatch Scraper](https://apify.com/themineworks/landwatch-land-for-sale-scraper?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral)\n\n<!-- RELATED:END -->\n\n## Support\n\nFound a bug or need a field? Open an issue on the Issues tab of this actor. To ask for a new source, email dmineworks@gmail.com.\n\n*LinkedIn Email Finder turns a name and company, or a public LinkedIn profile URL, into one labelled work email with its confidence and evidence, with no login, from $1.50 per 1,000 emails.*\n",
      "input": {
        "title": "LinkedIn Email Finder Input",
        "description": "Who to find work emails for: a name with a company domain or company name, a public LinkedIn profile URL, or a pasted CSV. Every row comes back with a status, a confidence score and the evidence behind it.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "people": {
            "title": "People (name + company or domain)",
            "type": "array",
            "editor": "json",
            "description": "One entry per person. Objects like {\"fullName\": \"Jane Doe\", \"domain\": \"acme.com\"} or {\"fullName\": \"Jane Doe\", \"companyName\": \"Acme Inc\"} work, and so do CRM export keys such as \"First Name\", \"Last Name\", \"Company\", \"Website\" or \"LinkedIn URL\". Plain lines also work: \"Jane Doe, acme.com\" or \"Jane Doe @ Acme Inc\". A domain always beats a company name.",
            "prefill": [
              {
                "fullName": "Patrick Collison",
                "domain": "stripe.com"
              },
              {
                "fullName": "Dharmesh Shah",
                "companyName": "HubSpot"
              }
            ]
          },
          "linkedinUrls": {
            "title": "LinkedIn profile URLs",
            "type": "array",
            "editor": "stringList",
            "description": "Public profile URLs such as https://www.linkedin.com/in/username. The public page is read logged out for the name and current company, then the company's LinkedIn page for its website. No login or cookies. If LinkedIn will not show a profile to logged-out visitors, the name is taken from the URL and the row says so.",
            "prefill": [
              "https://www.linkedin.com/in/satyanadella"
            ]
          },
          "csv": {
            "title": "Paste a CSV",
            "type": "string",
            "editor": "textarea",
            "description": "Optional. A CSV with a header row, pasted as text. Recognised columns include Full Name, First Name, Last Name, Company, Domain, Website and LinkedIn URL. Comma, semicolon and tab separated files all work."
          },
          "domainOverride": {
            "title": "Domain for rows without one",
            "type": "string",
            "editor": "textfield",
            "description": "Optional. Used for every row that has no domain, for example a list of LinkedIn URLs of people who all work at acme.com."
          },
          "findPatternOnWebsite": {
            "title": "Look for evidence on the company website",
            "type": "boolean",
            "description": "Reads up to 5 pages of the company's own site (home, contact, team, press, imprint) for an address published for this person, or for the pattern its published personal addresses use. This is what turns a guess into a billable, evidence-backed email.",
            "default": true
          },
          "checkSmtp": {
            "title": "Ask the mail server (SMTP)",
            "type": "boolean",
            "description": "Asks the company's mail server whether the mailbox exists, without sending anything. Many cloud hosts block outbound port 25, and in our own Apify runs the check has not been able to reach mail servers. When it is blocked, the run notices within seconds, switches the check off and says so in the summary row.",
            "default": true
          },
          "maxPeople": {
            "title": "Max people",
            "type": "integer",
            "editor": "number",
            "description": "Stop after this many people. Extra rows are skipped and never charged.",
            "default": 1000,
            "minimum": 1,
            "maximum": 5000
          },
          "monitorMode": {
            "title": "Monitor mode (only new or changed people)",
            "type": "boolean",
            "description": "Run on a schedule and deliver ONLY people who are new or whose work email, company or domain changed since a previous run (for example after a job change). You are charged per delivered email, not for the whole list each time. Ideal for monthly checks of a lead list. Requires the same input across runs.",
            "default": false,
            "editor": "checkbox"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "fields": {
            "type": "object",
            "properties": {
              "inputIndex": {
                "type": "integer",
                "description": "Position of this person in your input (0 based)"
              },
              "fullName": {
                "type": "string",
                "description": "The person's name, from your input or the LinkedIn profile"
              },
              "firstName": {
                "type": "string",
                "description": "First name as used in the address (lower case, accents removed)"
              },
              "lastName": {
                "type": "string",
                "description": "Last name as used in the address"
              },
              "nameSource": {
                "type": "string",
                "description": "input, linkedin_profile, or linkedin_url_slug (profile hidden from logged-out visitors, name read from the URL)"
              },
              "nameReliability": {
                "type": "string",
                "description": "Only for linkedin_url_slug: high (first-last in the URL), medium (split on a known first name), low (could not split)"
              },
              "linkedinUrl": {
                "type": "string",
                "description": "The LinkedIn profile URL, when one was given"
              },
              "linkedinStatus": {
                "type": "string",
                "description": "read, blocked, not_found or skipped"
              },
              "headline": {
                "type": "string",
                "description": "Current job title from the public LinkedIn profile"
              },
              "company": {
                "type": "string",
                "description": "Company name from your input or the LinkedIn profile"
              },
              "domain": {
                "type": "string",
                "description": "Company email domain used for the address"
              },
              "domainSource": {
                "type": "string",
                "description": "input, domain_override, linkedin_company_page, company_name_lookup (confirmed on the homepage) or company_name_guess (not confirmed)"
              },
              "domainGuessed": {
                "type": "boolean",
                "description": "True when the domain came from the company name and could not be confirmed on the homepage. These rows are never charged."
              },
              "email": {
                "type": "string",
                "description": "The most likely work email"
              },
              "status": {
                "type": "string",
                "description": "verified, published, pattern_match (evidence found), best_guess, catch_all (labelled guesses; all five billable), rejected, no_mx, domain_not_found, company_unknown, not_a_company_domain, invalid_input, error"
              },
              "confidence": {
                "type": "integer",
                "description": "0 to 100. verified 95, published 90, pattern_match 70 or 80, best_guess and catch_all are the share of companies using that pattern (about 40)"
              },
              "billable": {
                "type": "boolean",
                "description": "True when this row is billed as email-found under the rule in the README"
              },
              "verified": {
                "type": "boolean",
                "description": "True only when the mail server accepted this exact mailbox"
              },
              "evidence": {
                "type": "string",
                "description": "smtp_accepted, published_on_company_site, company_site_pattern, smtp_rejected or pattern_prior"
              },
              "evidenceUrl": {
                "type": "string",
                "description": "Company web page where the address or the pattern was found"
              },
              "reason": {
                "type": "string",
                "description": "One sentence on why the row has this status"
              },
              "pattern": {
                "type": "string",
                "description": "first.last, first, flast, firstlast, f.last, firstl, first_last, last, last.first, first-last or lastf"
              },
              "alternates": {
                "type": "array",
                "description": "Next most likely addresses, best first, as {email, pattern}"
              },
              "sitePattern": {
                "type": "string",
                "description": "The pattern the company's published personal addresses use, when found"
              },
              "sitePersonalAddresses": {
                "type": "integer",
                "description": "How many personal (non role) addresses the company site publishes. The addresses themselves are not returned."
              },
              "mxProvider": {
                "type": "string",
                "description": "Who hosts the company mail: google_workspace, microsoft_365, proofpoint, mimecast, zoho and so on"
              },
              "catchAll": {
                "type": "boolean",
                "description": "True when the mail server accepts any address, so no mailbox can be verified. Empty when the server could not be asked."
              },
              "smtpCheck": {
                "type": "string",
                "description": "accepted, all_rejected, catch_all, refused, inconclusive, unavailable (port 25 closed) or skipped"
              },
              "candidatesChecked": {
                "type": "integer",
                "description": "How many addresses were put to the mail server for this person"
              },
              "monitor_status": {
                "type": "string",
                "description": "Monitor mode only: 'new' for a record delivered for the first time, 'changed' when its details differ from the last delivered version."
              },
              "scrapedAt": {
                "type": "string",
                "description": "When this person was processed (ISO 8601)"
              }
            }
          },
          "views": {
            "overview": {
              "title": "Results",
              "transformation": {
                "fields": [
                  "fullName",
                  "company",
                  "email",
                  "status",
                  "confidence",
                  "billable",
                  "evidence",
                  "domain",
                  "linkedinUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "fullName": {
                    "label": "Name"
                  },
                  "company": {
                    "label": "Company"
                  },
                  "email": {
                    "label": "Email"
                  },
                  "status": {
                    "label": "Status"
                  },
                  "confidence": {
                    "label": "Confidence",
                    "format": "number"
                  },
                  "billable": {
                    "label": "Billed",
                    "format": "boolean"
                  },
                  "evidence": {
                    "label": "Evidence"
                  },
                  "domain": {
                    "label": "Domain"
                  },
                  "linkedinUrl": {
                    "label": "LinkedIn",
                    "format": "link"
                  }
                }
              }
            }
          }
        }
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "LinkedIn Email Finder: Profile URL to Work Email",
        "properties": {
          "results": {
            "type": "string",
            "title": "Results",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      }
    },
    "buildNumber": "0.1.12",
    "imageDigest": "2baa094fa58f6b6c65fbfe4ba61f976acf479a77ce7d23238f07d895a1fac4cd",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "0.1"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.053775555555555556
    }
  }
}