{
  "data": {
    "id": "NAouExIyOHqNWUZxT",
    "actId": "EhVyi9uvJ4eaUz9nF",
    "userId": "4P6eiRh7Zh5UTwC9T",
    "startedAt": "2026-10-16T16:13:13.923Z",
    "finishedAt": "2026-10-16T16:13:16.136Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 2060,
      "runTimeSecs": 2.06,
      "computeUnits": 0.002288888888888889,
      "imageSizeBytes": 584296960
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Bulk People Enrichment input\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"csv\": {\n      \"title\": \"CSV file\",\n      \"type\": \"string\",\n      \"editor\": \"fileupload\",\n      \"description\": \"Upload a CSV or link to one (up to 50,000 rows). Recognized columns: email, profile_url, github, twitter, facebook, full_name (or first_name + last_name), domain. Each row resolves by its strongest key: email > profile URL > social handle > name + domain. The prefilled link is a 3-row sample you can run as is.\",\n      \"prefill\": \"https://api.apify.com/v2/key-value-stores/3QjjLxhysmMUbUbyX/records/sample-people.csv\"\n    },\n    \"contacts\": {\n      \"title\": \"Include emails & phones — $8.00 per 1,000 people with a contact\",\n      \"type\": \"boolean\",\n      \"description\": \"Adds recorded emails, phones and X, Facebook and GitHub links (the profile alone carries none). $8 per 1,000 people with a contact that reaches them today: a personal mailbox, an address at the current employer, a phone that is not a switchboard, or a social link. Everyone else ships at the $3.20 per 1,000 profile price.\",\n      \"default\": false\n    },\n    \"mustHave\": {\n      \"title\": \"Must have — needs \\\"Include emails & phones\\\" on\",\n      \"type\": \"array\",\n      \"editor\": \"select\",\n      \"description\": \"Deliver and charge only people who have all of these. A person who is found but lacks one comes back as a free \\\"missing_required\\\" row. Emails, phones and social profiles need \\\"Include emails & phones\\\".\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"email\",\n          \"personalEmail\",\n          \"workEmail\",\n          \"currentWorkEmail\",\n          \"phone\",\n          \"github\",\n          \"twitter\",\n          \"facebook\"\n        ],\n        \"enumTitles\": [\n          \"Any email address\",\n          \"Personal email (gmail, yahoo, ISP mail)\",\n          \"Work email (any company address)\",\n          \"Work email at the current employer\",\n          \"Direct phone (not a switchboard)\",\n          \"GitHub profile\",\n          \"Twitter / X profile\",\n          \"Facebook profile\"\n        ]\n      },\n      \"uniqueItems\": true\n    },\n    \"compact\": {\n      \"title\": \"Compact rows (for AI agents)\",\n      \"type\": \"boolean\",\n      \"description\": \"Returns a short row instead of the full record: identity, current role, location, the 5 latest positions, education, top skills and any contacts — about 2 KB per person instead of 10+ KB. Made for AI agents and LLM pipelines with a context limit. Same price. Off by default: a run returns the complete record.\",\n      \"default\": false\n    }\n  },\n  \"required\": [\n    \"csv\"\n  ]\n}",
    "readme": "> **$3.20 per 1,000 resolved rows, $8 per 1,000 with emails and phones that\n> work.** Built for the 10,000 to 50,000 row files too big for a lookup form,\n> with crash-safe resume: a delivered row is never billed twice.\n\nUpload a CSV (or link one) and every row resolves by the strongest key it\ncarries:\n\n1. email address\n2. profile URL\n3. social handle (GitHub, X/Twitter, Facebook)\n4. full name, plus a company `domain` column when you have one\n\nBare names resolve only when exactly one profile carries the name.\nNamesakes come back as a free `ambiguous` row with the holder count, never\na guess.\n\n## Built for big files\n\n- Rows stream into your dataset as they resolve.\n- Long runs survive platform server migrations: the Actor checkpoints and\n  resumes instead of starting over.\n- Ten consecutive service errors stop the run early instead of grinding\n  through an outage.\n- A person your file lists twice is looked up once; the repeat is a free\n  row naming the paid one.\n\n## Input\n\n```json\n{\n  \"csv\": \"email\\nsatya.nadella@microsoft.com\",\n  \"contacts\": false,\n  \"mustHave\": []\n}\n```\n\n`csv`: upload a file, paste rows or link a CSV. Recognized columns:\n`email`, `profile_url`, `github`, `twitter`, `facebook`, `full_name` (or\n`first_name` + `last_name`), `domain`.\n\n## Emails and phones: `contacts`\n\nTurn on `contacts` to get the recorded email addresses and phone numbers\nwith each profile. The best address and a phone are lifted into their own\ncolumns: `email`, `emailType` (`work` / `personal`), `employerMatch`,\n`workEmails`, `personalEmails`, `emailCount`, `phone`, `phones`.\n\nYou pay the contacts price, **$8 per 1,000**, only for a person with a\ncontact that reaches them today:\n\n- a personal mailbox (gmail, outlook, ISP mail);\n- an address on the domain of their **current** employer;\n- a phone number not flagged as a company switchboard;\n- an X, Facebook or GitHub link (other than one you looked the person up by).\n\nEveryone else is delivered at the $3.20 profile price, old work addresses\nincluded. The `_tier` column says which price each row was charged at.\nX, Facebook and GitHub links ship only with contacts; the profile alone\ncarries the professional profile URL and website.\n\nHow often that is, measured on 30 September 2026 over 200 employed\nprofessionals per country: the contacts price applied to 53% of people in\nthe US, 42% in India, 40% in France, 33% in the UK and 32% in Germany.\nEveryone else shipped at the lower price.\n\n## Only people who have what you need: `mustHave`\n\nList what a person must have for you to pay: `email`, `personalEmail`,\n`workEmail`, `currentWorkEmail`, `phone`, `github`, `twitter`, `facebook`.\nA person who is found but lacks one comes back as a free\n`missing_required` row that says what was missing (and names nobody).\nThe email, phone and social requirements\nneed `contacts` on, and a run that asks for them without it is refused\nbefore anything is charged.\n\n## Output\n\nOne row per input row, tagged with its record number (the header is record\n1). A real resolved row:\n\n```json\n{\n  \"_status\": \"found\",\n  \"_input\": { \"row\": 2, \"email\": \"satya.nadella@microsoft.com\" },\n  \"_freshness\": \"fresh_90d\",\n  \"profileUrl\": \"https://www.linkedin.com/in/satyanadella\",\n  \"location\": \"Redmond, Washington, United States\",\n  \"countryCode\": \"us\",\n  \"companyName\": \"Microsoft\",\n  \"companySlug\": \"microsoft\",\n  \"_view\": \"lite-v4\",\n  \"slug\": \"satyanadella\",\n  \"fullName\": \"Satya Nadella\",\n  \"headline\": \"Chairman and CEO at Microsoft\",\n  \"jobTitle\": \"Chairman and CEO\",\n  \"industry\": \"Software Development\",\n  \"connectionsCount\": 500,\n  \"seniority\": { \"totalExperienceYears\": 12, \"currentTenureYears\": 12, \"averageTenureYears\": 7 },\n  \"experience\": {\n    \"work\": [\n      { \"title\": \"Chairman and CEO\", \"company\": \"Microsoft\", \"startDate\": \"2014-02-01\", \"endDate\": null },\n      { \"title\": \"Member Board Of Trustees\", \"company\": \"University of Chicago\", \"startDate\": \"2018-01-01\", \"endDate\": null }\n    ]\n  },\n  \"education\": [\n    { \"school\": \"University of Wisconsin-Milwaukee\", \"degreeName\": \"Master’s Degree\", \"fieldOfStudy\": \"Computer Science\" }\n  ],\n  \"contactInformation\": {\n    \"socialLinks\": { \"profileUrl\": \"https://www.linkedin.com/in/satyanadella\", \"twitterUrl\": null, \"githubUrl\": null }\n  }\n}\n```\n\n*(trimmed for display: the row also carries every past position with its\ndescription, `about`, `skills`, languages, certifications, patents,\npublications and articles whenever the profile has them)*\n\nWith `contacts` on, the same kind of row gains the contact columns\n(values below are made up):\n\n```json\n{\n  \"_status\": \"found\",\n  \"_tier\": \"contacts\",\n  \"fullName\": \"Jane Doe\",\n  \"companyName\": \"Acme\",\n  \"profileUrl\": \"https://www.linkedin.com/in/jane-doe-example\",\n  \"email\": \"jane.doe@acme.example\",\n  \"emailType\": \"work\",\n  \"employerMatch\": true,\n  \"workEmails\": [\"jane.doe@acme.example\", \"jdoe@oldjob.example\"],\n  \"personalEmails\": [\"jane.doe@example.com\"],\n  \"emailCount\": 3,\n  \"phone\": \"+15550100123\",\n  \"phones\": [{ \"number\": \"+15550100123\", \"sharedBy\": 1, \"companyLine\": false }]\n}\n```\n\nA row looked up by email never gets that same address sold back to it.\nEvery non-match is a free row with a reason (`ambiguous`, `not_found`,\n`invalid`, `profile_removed`), so the output has the same rows as the\ninput.\n\nThe **Output tab** has three views: *Overview*, *Career & education* and\n*Contacts & signals*.\n\n## Pricing\n\n| Event | Price | When |\n|---|---|---|\n| Row resolved | $0.0032 | resolved to a profile, full career row |\n| Row resolved (with contacts) | $0.008 | `contacts` on and a contact that reaches the person today |\n| Unresolvable / malformed / namesake / `missing_required` | **$0** | always free, with a reason |\n| A person your file lists twice | **$0** | answered as a free row naming the paid one |\n\nA charge fires only after the row is in your dataset.\n\n## Use Bulk LinkedIn & Email Enrichment with AI agents and MCP\n\nThis Actor works as a tool for AI agents. Add it to Claude, ChatGPT, Cursor or any other MCP client through the Apify MCP server:\n\n```\nhttps://mcp.apify.com?tools=b2bsearch/bulk-people-enrichment\n```\n\n- **Fast enough for a tool call.** A small request finishes in seconds, so the agent gets its answer inside one call.\n- **The agent pays only for results.** Prices are per result (see the pricing section above) and every miss is a free row. Cap what one call may spend with `maxTotalChargeUsd`.\n- **Rows explain themselves.** Each row has a `_status`; a row that is not a result says why in `_error`, so the agent can decide what to do next without guessing.\n- **Compact rows for a context window.** `\"compact\": true` returns a short row — about 2 KB for a full profile instead of 10+ KB: identity, current role, the 5 latest positions, education, top skills and any contacts. Same price; leave it off to get the complete record.\n\nInput an agent can send as is:\n\n```json\n{\n  \"compact\": true\n}\n```\n\nThe same Actor is available as a tool in LangChain, CrewAI and the OpenAI Agents SDK, and as a step in n8n, Make and Zapier through the Apify integrations.\n\n## Which actor in this family?\n\nOne database, ten doors. Misses are free on every one of them.\n\n| Actor | Input → output |\n|---|---|\n| [Profile Lookup](https://apify.com/b2bsearch/profile-lookup) | profile URL → full career profile |\n| [Reverse Email Lookup](https://apify.com/b2bsearch/reverse-email-lookup) | email → person, profile URL and employer |\n| [Name to Profile](https://apify.com/b2bsearch/name-to-profile) | name + company domain → profile |\n| [Social Handle Lookup](https://apify.com/b2bsearch/social-handle-lookup) | GitHub, X/Twitter or Facebook handle → profile |\n| **Bulk People Enrichment** (this one) | CSV of emails, URLs, handles or names → profiles |\n| [LinkedIn Email Finder](https://apify.com/b2bsearch/linkedin-email-finder) | profile URL → email addresses on record |\n| [Work Email Finder](https://apify.com/b2bsearch/work-email-finder) | name + company domain → work email candidates |\n| [Company Employees](https://apify.com/b2bsearch/company-employees) | company domain → current staff |\n| [People Database Search](https://apify.com/b2bsearch/people-database-search) | filters → people |\n| [B2B Leads Finder](https://apify.com/b2bsearch/b2b-leads-finder) | filters → leads with a work or personal email, from $1.50/1k |\n| [Company Database Search](https://apify.com/b2bsearch/company-database-search) | filters → companies |\n\n## Large volumes\n\nPaid Apify plans lower the per-result price on their own. Pulling more than\n100,000 rows a month, or missing a field or filter you need? Open an issue\ntitled **Volume** with the monthly count and the fields you want (no names or\nemails needed) and we answer in the thread.\n\n## Free Apify plan\n\nA run started from a free Apify plan delivers the first 100 results and stops;\nthe run's status line says so. Any paid Apify plan lifts the cap. The rows are\nthe same rows a paid run returns.\n\n## Feedback and reviews\n\nHow did it go? A rating in the **Reviews** tab of this Actor tells the next\nbuyer what to expect; we read every word, good or bad. Got a wrong or stale\nrow? Open the **Issues** tab with the run ID. Issues are public, so leave out\nemails, phones and names; the run ID is enough for us to find the row. We\ncheck every report, fix what is ours to fix and answer in the thread.\n\n## Disclaimer\n\nThis Actor is an independent product. It is not affiliated with, endorsed by\nor sponsored by LinkedIn, GitHub, X/Twitter or Facebook. It does not access, crawl or scrape any of them at\nrun time: answers come from our own database of publicly available\nprofessional data, and the network names only describe the kind of data it\ncovers. To have a person's data removed, open an issue on this Actor with only\nthe profile link — nothing else is needed, and it is removed from every listing.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "bulk-people-enrichment",
      "title": "Bulk LinkedIn Profile Scraper & Email Enrichment — CSV, 50k",
      "description": "Bulk LinkedIn profile scraper alternative and email enrichment from a CSV: upload emails, LinkedIn profile URLs or names + domains, get enriched profiles back at $3.20 per 1,000 resolved rows, or with emails and phones at $8 per 1,000 people with a live contact. 50,000 rows per run. Misses are free.",
      "version": "0.1",
      "buildTag": "latest",
      "input": {
        "title": "Bulk People Enrichment input",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "csv": {
            "title": "CSV file",
            "type": "string",
            "editor": "fileupload",
            "description": "Upload a CSV or link to one (up to 50,000 rows). Recognized columns: email, profile_url, github, twitter, facebook, full_name (or first_name + last_name), domain. Each row resolves by its strongest key: email > profile URL > social handle > name + domain. The prefilled link is a 3-row sample you can run as is.",
            "prefill": "https://api.apify.com/v2/key-value-stores/3QjjLxhysmMUbUbyX/records/sample-people.csv"
          },
          "contacts": {
            "title": "Include emails & phones — $8.00 per 1,000 people with a contact",
            "type": "boolean",
            "description": "Adds recorded emails, phones and X, Facebook and GitHub links (the profile alone carries none). $8 per 1,000 people with a contact that reaches them today: a personal mailbox, an address at the current employer, a phone that is not a switchboard, or a social link. Everyone else ships at the $3.20 per 1,000 profile price.",
            "default": false
          },
          "mustHave": {
            "title": "Must have — needs \"Include emails & phones\" on",
            "type": "array",
            "editor": "select",
            "description": "Deliver and charge only people who have all of these. A person who is found but lacks one comes back as a free \"missing_required\" row. Emails, phones and social profiles need \"Include emails & phones\".",
            "items": {
              "type": "string",
              "enum": [
                "email",
                "personalEmail",
                "workEmail",
                "currentWorkEmail",
                "phone",
                "github",
                "twitter",
                "facebook"
              ],
              "enumTitles": [
                "Any email address",
                "Personal email (gmail, yahoo, ISP mail)",
                "Work email (any company address)",
                "Work email at the current employer",
                "Direct phone (not a switchboard)",
                "GitHub profile",
                "Twitter / X profile",
                "Facebook profile"
              ]
            },
            "uniqueItems": true
          },
          "compact": {
            "title": "Compact rows (for AI agents)",
            "type": "boolean",
            "description": "Returns a short row instead of the full record: identity, current role, location, the 5 latest positions, education, top skills and any contacts — about 2 KB per person instead of 10+ KB. Made for AI agents and LLM pipelines with a context limit. Same price. Off by default: a run returns the complete record.",
            "default": false
          }
        },
        "required": [
          "csv"
        ]
      },
      "readme": "> **$3.20 per 1,000 resolved rows, $8 per 1,000 with emails and phones that\n> work.** Built for the 10,000 to 50,000 row files too big for a lookup form,\n> with crash-safe resume: a delivered row is never billed twice.\n\nUpload a CSV (or link one) and every row resolves by the strongest key it\ncarries:\n\n1. email address\n2. profile URL\n3. social handle (GitHub, X/Twitter, Facebook)\n4. full name, plus a company `domain` column when you have one\n\nBare names resolve only when exactly one profile carries the name.\nNamesakes come back as a free `ambiguous` row with the holder count, never\na guess.\n\n## Built for big files\n\n- Rows stream into your dataset as they resolve.\n- Long runs survive platform server migrations: the Actor checkpoints and\n  resumes instead of starting over.\n- Ten consecutive service errors stop the run early instead of grinding\n  through an outage.\n- A person your file lists twice is looked up once; the repeat is a free\n  row naming the paid one.\n\n## Input\n\n```json\n{\n  \"csv\": \"email\\nsatya.nadella@microsoft.com\",\n  \"contacts\": false,\n  \"mustHave\": []\n}\n```\n\n`csv`: upload a file, paste rows or link a CSV. Recognized columns:\n`email`, `profile_url`, `github`, `twitter`, `facebook`, `full_name` (or\n`first_name` + `last_name`), `domain`.\n\n## Emails and phones: `contacts`\n\nTurn on `contacts` to get the recorded email addresses and phone numbers\nwith each profile. The best address and a phone are lifted into their own\ncolumns: `email`, `emailType` (`work` / `personal`), `employerMatch`,\n`workEmails`, `personalEmails`, `emailCount`, `phone`, `phones`.\n\nYou pay the contacts price, **$8 per 1,000**, only for a person with a\ncontact that reaches them today:\n\n- a personal mailbox (gmail, outlook, ISP mail);\n- an address on the domain of their **current** employer;\n- a phone number not flagged as a company switchboard;\n- an X, Facebook or GitHub link (other than one you looked the person up by).\n\nEveryone else is delivered at the $3.20 profile price, old work addresses\nincluded. The `_tier` column says which price each row was charged at.\nX, Facebook and GitHub links ship only with contacts; the profile alone\ncarries the professional profile URL and website.\n\nHow often that is, measured on 30 September 2026 over 200 employed\nprofessionals per country: the contacts price applied to 53% of people in\nthe US, 42% in India, 40% in France, 33% in the UK and 32% in Germany.\nEveryone else shipped at the lower price.\n\n## Only people who have what you need: `mustHave`\n\nList what a person must have for you to pay: `email`, `personalEmail`,\n`workEmail`, `currentWorkEmail`, `phone`, `github`, `twitter`, `facebook`.\nA person who is found but lacks one comes back as a free\n`missing_required` row that says what was missing (and names nobody).\nThe email, phone and social requirements\nneed `contacts` on, and a run that asks for them without it is refused\nbefore anything is charged.\n\n## Output\n\nOne row per input row, tagged with its record number (the header is record\n1). A real resolved row:\n\n```json\n{\n  \"_status\": \"found\",\n  \"_input\": { \"row\": 2, \"email\": \"satya.nadella@microsoft.com\" },\n  \"_freshness\": \"fresh_90d\",\n  \"profileUrl\": \"https://www.linkedin.com/in/satyanadella\",\n  \"location\": \"Redmond, Washington, United States\",\n  \"countryCode\": \"us\",\n  \"companyName\": \"Microsoft\",\n  \"companySlug\": \"microsoft\",\n  \"_view\": \"lite-v4\",\n  \"slug\": \"satyanadella\",\n  \"fullName\": \"Satya Nadella\",\n  \"headline\": \"Chairman and CEO at Microsoft\",\n  \"jobTitle\": \"Chairman and CEO\",\n  \"industry\": \"Software Development\",\n  \"connectionsCount\": 500,\n  \"seniority\": { \"totalExperienceYears\": 12, \"currentTenureYears\": 12, \"averageTenureYears\": 7 },\n  \"experience\": {\n    \"work\": [\n      { \"title\": \"Chairman and CEO\", \"company\": \"Microsoft\", \"startDate\": \"2014-02-01\", \"endDate\": null },\n      { \"title\": \"Member Board Of Trustees\", \"company\": \"University of Chicago\", \"startDate\": \"2018-01-01\", \"endDate\": null }\n    ]\n  },\n  \"education\": [\n    { \"school\": \"University of Wisconsin-Milwaukee\", \"degreeName\": \"Master’s Degree\", \"fieldOfStudy\": \"Computer Science\" }\n  ],\n  \"contactInformation\": {\n    \"socialLinks\": { \"profileUrl\": \"https://www.linkedin.com/in/satyanadella\", \"twitterUrl\": null, \"githubUrl\": null }\n  }\n}\n```\n\n*(trimmed for display: the row also carries every past position with its\ndescription, `about`, `skills`, languages, certifications, patents,\npublications and articles whenever the profile has them)*\n\nWith `contacts` on, the same kind of row gains the contact columns\n(values below are made up):\n\n```json\n{\n  \"_status\": \"found\",\n  \"_tier\": \"contacts\",\n  \"fullName\": \"Jane Doe\",\n  \"companyName\": \"Acme\",\n  \"profileUrl\": \"https://www.linkedin.com/in/jane-doe-example\",\n  \"email\": \"jane.doe@acme.example\",\n  \"emailType\": \"work\",\n  \"employerMatch\": true,\n  \"workEmails\": [\"jane.doe@acme.example\", \"jdoe@oldjob.example\"],\n  \"personalEmails\": [\"jane.doe@example.com\"],\n  \"emailCount\": 3,\n  \"phone\": \"+15550100123\",\n  \"phones\": [{ \"number\": \"+15550100123\", \"sharedBy\": 1, \"companyLine\": false }]\n}\n```\n\nA row looked up by email never gets that same address sold back to it.\nEvery non-match is a free row with a reason (`ambiguous`, `not_found`,\n`invalid`, `profile_removed`), so the output has the same rows as the\ninput.\n\nThe **Output tab** has three views: *Overview*, *Career & education* and\n*Contacts & signals*.\n\n## Pricing\n\n| Event | Price | When |\n|---|---|---|\n| Row resolved | $0.0032 | resolved to a profile, full career row |\n| Row resolved (with contacts) | $0.008 | `contacts` on and a contact that reaches the person today |\n| Unresolvable / malformed / namesake / `missing_required` | **$0** | always free, with a reason |\n| A person your file lists twice | **$0** | answered as a free row naming the paid one |\n\nA charge fires only after the row is in your dataset.\n\n## Use Bulk LinkedIn & Email Enrichment with AI agents and MCP\n\nThis Actor works as a tool for AI agents. Add it to Claude, ChatGPT, Cursor or any other MCP client through the Apify MCP server:\n\n```\nhttps://mcp.apify.com?tools=b2bsearch/bulk-people-enrichment\n```\n\n- **Fast enough for a tool call.** A small request finishes in seconds, so the agent gets its answer inside one call.\n- **The agent pays only for results.** Prices are per result (see the pricing section above) and every miss is a free row. Cap what one call may spend with `maxTotalChargeUsd`.\n- **Rows explain themselves.** Each row has a `_status`; a row that is not a result says why in `_error`, so the agent can decide what to do next without guessing.\n- **Compact rows for a context window.** `\"compact\": true` returns a short row — about 2 KB for a full profile instead of 10+ KB: identity, current role, the 5 latest positions, education, top skills and any contacts. Same price; leave it off to get the complete record.\n\nInput an agent can send as is:\n\n```json\n{\n  \"compact\": true\n}\n```\n\nThe same Actor is available as a tool in LangChain, CrewAI and the OpenAI Agents SDK, and as a step in n8n, Make and Zapier through the Apify integrations.\n\n## Which actor in this family?\n\nOne database, ten doors. Misses are free on every one of them.\n\n| Actor | Input → output |\n|---|---|\n| [Profile Lookup](https://apify.com/b2bsearch/profile-lookup) | profile URL → full career profile |\n| [Reverse Email Lookup](https://apify.com/b2bsearch/reverse-email-lookup) | email → person, profile URL and employer |\n| [Name to Profile](https://apify.com/b2bsearch/name-to-profile) | name + company domain → profile |\n| [Social Handle Lookup](https://apify.com/b2bsearch/social-handle-lookup) | GitHub, X/Twitter or Facebook handle → profile |\n| **Bulk People Enrichment** (this one) | CSV of emails, URLs, handles or names → profiles |\n| [LinkedIn Email Finder](https://apify.com/b2bsearch/linkedin-email-finder) | profile URL → email addresses on record |\n| [Work Email Finder](https://apify.com/b2bsearch/work-email-finder) | name + company domain → work email candidates |\n| [Company Employees](https://apify.com/b2bsearch/company-employees) | company domain → current staff |\n| [People Database Search](https://apify.com/b2bsearch/people-database-search) | filters → people |\n| [B2B Leads Finder](https://apify.com/b2bsearch/b2b-leads-finder) | filters → leads with a work or personal email, from $1.50/1k |\n| [Company Database Search](https://apify.com/b2bsearch/company-database-search) | filters → companies |\n\n## Large volumes\n\nPaid Apify plans lower the per-result price on their own. Pulling more than\n100,000 rows a month, or missing a field or filter you need? Open an issue\ntitled **Volume** with the monthly count and the fields you want (no names or\nemails needed) and we answer in the thread.\n\n## Free Apify plan\n\nA run started from a free Apify plan delivers the first 100 results and stops;\nthe run's status line says so. Any paid Apify plan lifts the cap. The rows are\nthe same rows a paid run returns.\n\n## Feedback and reviews\n\nHow did it go? A rating in the **Reviews** tab of this Actor tells the next\nbuyer what to expect; we read every word, good or bad. Got a wrong or stale\nrow? Open the **Issues** tab with the run ID. Issues are public, so leave out\nemails, phones and names; the run ID is enough for us to find the row. We\ncheck every report, fix what is ours to fix and answer in the thread.\n\n## Disclaimer\n\nThis Actor is an independent product. It is not affiliated with, endorsed by\nor sponsored by LinkedIn, GitHub, X/Twitter or Facebook. It does not access, crawl or scrape any of them at\nrun time: answers come from our own database of publicly available\nprofessional data, and the network names only describe the kind of data it\ncovers. To have a person's data removed, open an issue on this Actor with only\nthe profile link — nothing else is needed, and it is removed from every listing.\n",
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "fields": {
            "$schema": "http://json-schema.org/draft-07/schema#",
            "type": "object",
            "properties": {
              "_status": {
                "type": "string",
                "nullable": true,
                "description": "Outcome of this row: \"found\" is a paid result; every other value (not_found, invalid, no_phone, ambiguous, …) is a free row that explains itself in _error or _note.",
                "example": "found"
              },
              "_input": {
                "type": "object",
                "nullable": true,
                "description": "The input entry this row answers, as the run read it.",
                "example": {
                  "email": "jane.doe@example.com"
                }
              },
              "fullName": {
                "type": "string",
                "nullable": true,
                "description": "Full name of the person.",
                "example": "Jane Doe"
              },
              "jobTitle": {
                "type": "string",
                "nullable": true,
                "description": "Current job title.",
                "example": "VP of Engineering"
              },
              "companyName": {
                "type": "string",
                "nullable": true,
                "description": "Name of the current employer.",
                "example": "Example Corp"
              },
              "profileUrl": {
                "type": "string",
                "nullable": true,
                "description": "LinkedIn profile URL of the person.",
                "example": "https://www.linkedin.com/in/jane-doe-example"
              },
              "location": {
                "description": "Where the person is based, as free text.",
                "example": "Austin, Texas, United States"
              },
              "countryCode": {
                "type": "string",
                "nullable": true,
                "description": "Two-letter country code, lowercase.",
                "example": "us"
              },
              "email": {
                "type": "string",
                "nullable": true,
                "description": "The best email address on record: one at the current employer first, then a personal mailbox.",
                "example": "jane.doe@example.com"
              },
              "emailType": {
                "type": "string",
                "nullable": true,
                "description": "Kind of the best address: \"work\" or \"personal\".",
                "example": "work"
              },
              "phone": {
                "type": "string",
                "nullable": true,
                "description": "The first mobile number on record that is not a company switchboard.",
                "example": "+15550100123"
              },
              "emailCount": {
                "type": "number",
                "nullable": true,
                "description": "How many email addresses are on record for the person.",
                "example": 2
              },
              "_tier": {
                "type": "string",
                "nullable": true,
                "description": "Which price this row was charged at when contacts were requested: \"contacts\" or \"profile\".",
                "example": "contacts"
              },
              "headline": {
                "type": "string",
                "nullable": true,
                "description": "The profile headline, as the person wrote it.",
                "example": "VP of Engineering at Example Corp"
              },
              "_freshness": {
                "type": "string",
                "nullable": true,
                "description": "How recently the record was refreshed: fresh_90d, updated_1y, older or unknown.",
                "example": "updated_1y"
              },
              "_matchCandidates": {
                "type": "number",
                "nullable": true,
                "description": "How many different people matched the input when more than one did.",
                "example": 2
              },
              "_note": {
                "type": "string",
                "nullable": true,
                "description": "A remark about the row or the run: what was skipped, what was capped, how to get the rest.",
                "example": "found, but without phone — skipped as required, not charged"
              },
              "_error": {
                "type": "string",
                "nullable": true,
                "description": "Why this row is not a result, in plain words. Empty on found rows.",
                "example": "No record matches this email address. Not charged."
              },
              "experience": {
                "type": "object",
                "nullable": true,
                "description": "Career history: every position with title, company, dates, location and description.",
                "example": {
                  "work": [
                    {
                      "title": "VP of Engineering",
                      "company": "Example Corp",
                      "startDate": "2021-03-01",
                      "endDate": null
                    }
                  ]
                }
              },
              "education": {
                "type": "array",
                "nullable": true,
                "description": "Education history: school, degree, field of study and dates.",
                "example": [
                  {
                    "school": "Example University",
                    "degreeName": "BSc",
                    "fieldOfStudy": "Computer Science",
                    "endDate": "2008-06-30"
                  }
                ]
              },
              "certifications": {
                "type": "array",
                "nullable": true,
                "description": "Certifications with issuer and dates.",
                "example": [
                  {
                    "name": "Example Cloud Architect",
                    "startDate": "2023-05-01"
                  }
                ]
              },
              "skills": {
                "type": "array",
                "nullable": true,
                "description": "Skills listed on the profile.",
                "example": [
                  "Product Management",
                  "SQL"
                ]
              },
              "about": {
                "type": "string",
                "nullable": true,
                "description": "The profile summary, as the person wrote it.",
                "example": "Engineering leader with 15 years in fintech."
              },
              "contactInformation": {
                "type": "object",
                "nullable": true,
                "description": "Links of the person: website; GitHub, X (Twitter) and Facebook only with emails & phones on.",
                "example": {
                  "socialLinks": {
                    "websiteUrl": "https://janedoe.example"
                  }
                }
              },
              "seniority": {
                "description": "Seniority of the person: a bucket (cxo, vp, director, manager, founder, other) on roster rows, a block with tenure figures on full profiles.",
                "example": "vp"
              },
              "inferredSalary": {
                "type": "object",
                "nullable": true,
                "description": "Estimated salary range when one is on record.",
                "example": {
                  "min": 120000,
                  "max": 160000
                }
              },
              "connectionsCount": {
                "type": "number",
                "nullable": true,
                "description": "Number of connections on the profile (500 means 500 or more).",
                "example": 500
              },
              "followersCount": {
                "type": "number",
                "nullable": true,
                "description": "Number of followers on the profile.",
                "example": 1200
              }
            },
            "required": [],
            "additionalProperties": true
          },
          "views": {
            "overview": {
              "title": "Overview",
              "transformation": {
                "fields": [
                  "_status",
                  "_input",
                  "fullName",
                  "jobTitle",
                  "companyName",
                  "profileUrl",
                  "location",
                  "countryCode",
                  "email",
                  "emailType",
                  "phone",
                  "emailCount",
                  "_tier",
                  "headline",
                  "_freshness",
                  "_nameMatchCount",
                  "_matchCandidates",
                  "_note",
                  "_error"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "_status": {
                    "label": "Status",
                    "format": "text"
                  },
                  "_input": {
                    "label": "Input",
                    "format": "object"
                  },
                  "fullName": {
                    "label": "Name",
                    "format": "text"
                  },
                  "jobTitle": {
                    "label": "Job title",
                    "format": "text"
                  },
                  "companyName": {
                    "label": "Company",
                    "format": "text"
                  },
                  "profileUrl": {
                    "label": "Profile",
                    "format": "link"
                  },
                  "location": {
                    "label": "Location",
                    "format": "text"
                  },
                  "countryCode": {
                    "label": "Country",
                    "format": "text"
                  },
                  "email": {
                    "label": "Best email",
                    "format": "text"
                  },
                  "emailType": {
                    "label": "Email type",
                    "format": "text"
                  },
                  "phone": {
                    "label": "Phone",
                    "format": "text"
                  },
                  "emailCount": {
                    "label": "Emails on record",
                    "format": "number"
                  },
                  "_tier": {
                    "label": "Charged as",
                    "format": "text"
                  },
                  "headline": {
                    "label": "Headline",
                    "format": "text"
                  },
                  "_freshness": {
                    "label": "Freshness",
                    "format": "text"
                  },
                  "_nameMatchCount": {
                    "label": "Namesakes",
                    "format": "number"
                  },
                  "_matchCandidates": {
                    "label": "Possible matches",
                    "format": "number"
                  },
                  "_note": {
                    "label": "Note",
                    "format": "text"
                  },
                  "_error": {
                    "label": "Details",
                    "format": "text"
                  }
                }
              }
            },
            "career": {
              "title": "Career & education",
              "transformation": {
                "fields": [
                  "fullName",
                  "jobTitle",
                  "companyName",
                  "experience",
                  "education",
                  "certifications",
                  "skills",
                  "about"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "fullName": {
                    "label": "Name",
                    "format": "text"
                  },
                  "jobTitle": {
                    "label": "Job title",
                    "format": "text"
                  },
                  "companyName": {
                    "label": "Company",
                    "format": "text"
                  },
                  "experience": {
                    "label": "Positions",
                    "format": "object"
                  },
                  "education": {
                    "label": "Education",
                    "format": "array"
                  },
                  "certifications": {
                    "label": "Certifications",
                    "format": "array"
                  },
                  "skills": {
                    "label": "Skills",
                    "format": "array"
                  },
                  "about": {
                    "label": "About",
                    "format": "text"
                  }
                }
              }
            },
            "contacts": {
              "title": "Contacts & signals",
              "transformation": {
                "fields": [
                  "fullName",
                  "companyName",
                  "contactInformation",
                  "location",
                  "seniority",
                  "inferredSalary",
                  "connectionsCount",
                  "followersCount"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "fullName": {
                    "label": "Name",
                    "format": "text"
                  },
                  "companyName": {
                    "label": "Company",
                    "format": "text"
                  },
                  "contactInformation": {
                    "label": "Contacts & socials",
                    "format": "object"
                  },
                  "location": {
                    "label": "Location",
                    "format": "object"
                  },
                  "seniority": {
                    "label": "Seniority",
                    "format": "object"
                  },
                  "inferredSalary": {
                    "label": "Salary estimate",
                    "format": "object"
                  },
                  "connectionsCount": {
                    "label": "Connections",
                    "format": "number"
                  },
                  "followersCount": {
                    "label": "Followers",
                    "format": "number"
                  }
                }
              }
            }
          }
        }
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Results",
        "description": "Result rows are stored in the run's default dataset.",
        "properties": {
          "results": {
            "type": "string",
            "title": "Results",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "dockerfile": "../Dockerfile",
      "defaultRunOptions": {
        "timeoutSecs": 3600,
        "memoryMbytes": 512
      },
      "environmentVariables": {
        "API_BASE_URL": "https://apify.sputnik.io",
        "API_TOKEN": "@key_bulk_people_enrichment",
        "FULL_OUTPUT_ENABLED": "true"
      }
    },
    "buildNumber": "0.1.51",
    "imageDigest": "d72154684ca14c0ddcb3092176d81c8308118813b55c75b4ef546bd4bf79f497",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "0.1"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.002288888888888889
    }
  }
}