{
  "data": {
    "id": "xk5PWqLSBkHaH1kyM",
    "actId": "02M0bZU80eOYHyQmK",
    "userId": "phYI3YZyPKfMKGUfI",
    "startedAt": "2026-10-03T06:30:01.645Z",
    "finishedAt": "2026-10-03T06:31:10.489Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "API"
    },
    "stats": {
      "durationMillis": 68758,
      "runTimeSecs": 68.758,
      "computeUnits": 0.07639777777777777,
      "imageSizeBytes": 664687104
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "tag": "latest",
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"LinkedIn Profile Scraper with Public Contacts\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"profileUrls\": {\n      \"title\": \"🔗 LinkedIn profile URLs\",\n      \"type\": \"array\",\n      \"editor\": \"stringList\",\n      \"description\": \"Add one or more public LinkedIn profile URLs (linkedin.com/in/…). Country-specific links (for example, br.linkedin.com) and links to a profile's sub-pages are accepted. Entries that are not public profile links are skipped and listed by position in the run log.\",\n      \"prefill\": [\n        \"https://www.linkedin.com/in/williamhgates\",\n        \"https://www.linkedin.com/in/satyanadella\"\n      ],\n      \"minItems\": 1,\n      \"maxItems\": 1000,\n      \"items\": {\n        \"type\": \"string\",\n        \"minLength\": 1,\n        \"maxLength\": 2048,\n        \"pattern\": \"\\\\S\"\n      }\n    }\n  },\n  \"required\": [\n    \"profileUrls\"\n  ],\n  \"additionalProperties\": false\n}",
    "readme": "# LinkedIn Profile Scraper with Public Contacts\n\nTurn public LinkedIn profile URLs into structured profile records. Results can include names, headlines, work experience, education, follower counts, websites, and contact matches found in supported public profile fields.\n\nContact matches include their source and nearby context. They are not verified for ownership, consent, recency, or deliverability.\n\n---\n\n## What you get\n\nEach usable profile link the run reaches produces one result row with a clear retrieval status. A run that stops early, shortly before its time limit or at your spending limit, lists the profiles it did not reach in its run summary.\n\n| Field                                                         | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n| ------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `firstName`, `lastName`, `fullName`                           | Name shown on the profile. First and last name take the first word as the first name and leave out credentials after a comma (“Jane Doe, MBA”, “Jane Doe, REALTOR®” and “Jane Doe, Realtor” give Jane, Doe); a credential after the last name without a comma, written in capitals or a common degree such as PhD, leaves only the last name empty (“Jane Doe MBA” gives Jane); both stay empty when the first name would be a guess, for example for “Smith, John”, “Smith Jr”, “Dr Jane Doe”, “Jane Doe (she/her)”, a name with a business word such as “Realty” or “LLC”, Realtor without a comma (“Jane Doe Realtor”, “Jane Doe REALTOR®”), or a Chinese, Japanese or Korean name; a business name without such a word can be read as a person’s name |\n| `headline`, `about`                                           | Profile headline and About text when available                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n| `location`, `city`, `country`                                 | Returned location, a confidently separated city, and a two-letter country code when identifiable                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n| `profilePictureUrl`                                           | Profile photo URL when identified; generic platform artwork is excluded                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n| `linkedinBadge`                                               | Creator or Top Voice label when returned; this is not identity verification                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n| `followerCount`, `connectionCount`                            | Counts from the returned profile; compact follower labels are normalized to numbers, while non-exact connection labels such as `500+` remain empty                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n| `experiences[]`                                               | Returned roles with organization, dates, location, description, and employment-status evidence                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n| `experiencesTruncated`                                        | `true` when the returned content indicates that more work history may exist                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n| `currentCompany`, `currentTitle`, `currentCompanyLinkedinUrl` | Current role when explicitly identified; otherwise the most recently listed role. When job titles are not public, only the company the profile shows is filled                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n| `educations[]`                                                | Returned schools, degrees, fields of study, and dates                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n| `emails[]`, `phones[]`                                        | Contact matches with source and context                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n| `email`, `phone`                                              | First contact match for convenient export                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n| `websites[]`                                                  | Unique website and email links present in supported profile content                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n| `inputUrl`, `linkedinUrl`, `publicIdentifier`, `urn`          | Input and profile identifiers                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n| `extractionWarnings`                                          | Readable notes when the public profile was incomplete; empty when nothing was missing                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n| `succeeded`, `error`, `extractedAt`                           | Retrieval status, failure reason when applicable, and output time                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n\n### Reading employment status\n\n`isCurrent` is evidence-based:\n\n- `isCurrent: true` means the role was explicitly marked as current.\n- `isCurrent: false` with an `endedOn` value means an end date was shown.\n- `isCurrent: false` with `endedOn: null` means no current marker or end date was available. It does not prove that the role has ended.\n\n### When a profile shows less in public\n\nMany LinkedIn members show only part of their profile to visitors who are not signed in. The row keeps everything that was visible, says what was missing in `extractionWarnings`, and sets `experiencesTruncated` to `true` when the work history may be incomplete:\n\n| Note                                                                          | What it means                                                                                                      |\n| ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |\n| `this profile shows its full work history only to signed-in LinkedIn members` | Job titles and dates are hidden; the name, location, current company, schools and a shortened About usually remain |\n| `the About text was shortened in the public view`                             | The About text ends where the public profile cuts it                                                               |\n| `this is a limited public view — most fields may be empty`                    | Very little of the profile is public                                                                               |\n| `LinkedIn returned a shortened public view — work history was not included`   | The public page came back without the roles, their titles and dates                                                |\n| `work history was not present in the returned public content`                 | The public page had no work history section: the member may list none, or the view hides it                        |\n| `education was not present in the returned public content`                    | The public page had no education section: the member may list none, or the view hides it                           |\n\n---\n\n## Sample output\n\nThis example is the actor's output for a public profile captured on 2026-09-30, trimmed for length: the real row lists every visible role and school (5 roles and 3 schools here), and every role carries all of its keys, including `location`, `durationMonths` and `description` (null when LinkedIn shows none). Public values can change after capture.\n\nInput:\n\n```json\n{\n  \"profileUrls\": [\"https://www.linkedin.com/in/satyanadella\"]\n}\n```\n\nOutput:\n\n```json\n{\n  \"inputUrl\": \"https://www.linkedin.com/in/satyanadella\",\n  \"linkedinUrl\": \"https://www.linkedin.com/in/satyanadella\",\n  \"publicIdentifier\": \"satyanadella\",\n  \"urn\": \"urn:li:member:19186432\",\n  \"succeeded\": true,\n  \"error\": null,\n  \"extractionWarnings\": [],\n  \"firstName\": \"Satya\",\n  \"lastName\": \"Nadella\",\n  \"fullName\": \"Satya Nadella\",\n  \"headline\": \"Chairman and CEO at Microsoft\",\n  \"about\": \"As chairman and CEO of Microsoft, I define my mission and that of my company as empowering every person and every organization on the planet to achieve more.\",\n  \"location\": \"Redmond, Washington, United States\",\n  \"city\": \"Redmond\",\n  \"country\": \"US\",\n  \"linkedinBadge\": \"Creator, Top Voice\",\n  \"followerCount\": 12194326,\n  \"connectionCount\": null,\n  \"experiences\": [\n    {\n      \"title\": \"Chairman and CEO\",\n      \"company\": \"Microsoft\",\n      \"companyLinkedinUrl\": \"https://www.linkedin.com/company/microsoft\",\n      \"location\": \"Greater Seattle Area\",\n      \"startedOn\": \"2014-02\",\n      \"endedOn\": null,\n      \"isCurrent\": true\n    },\n    {\n      \"title\": \"Board Member\",\n      \"company\": \"Starbucks\",\n      \"companyLinkedinUrl\": \"https://www.linkedin.com/company/starbucks\",\n      \"startedOn\": \"2017\",\n      \"endedOn\": \"2024\",\n      \"isCurrent\": false\n    }\n  ],\n  \"experiencesTruncated\": false,\n  \"currentCompany\": \"Microsoft\",\n  \"currentTitle\": \"Chairman and CEO\",\n  \"educations\": [\n    {\n      \"school\": \"Manipal Institute of Technology, Manipal\",\n      \"degree\": \"Bachelor’s Degree\",\n      \"field\": \"Electrical Engineering\",\n      \"startedOn\": null,\n      \"endedOn\": null\n    },\n    {\n      \"school\": \"University of Wisconsin-Milwaukee\",\n      \"degree\": \"Master’s Degree\",\n      \"field\": \"Computer Science\",\n      \"startedOn\": null,\n      \"endedOn\": null\n    }\n  ],\n  \"websites\": [\"https://snscratchpad.com/\"],\n  \"emails\": [],\n  \"email\": null,\n  \"phones\": [],\n  \"phone\": null\n}\n```\n\nThe saved profile produced no email or phone match. The actor does not infer contacts when supported fields contain none.\n\nAn email match includes reviewable evidence:\n\n```json\n{\n  \"email\": \"jane.doe@acme.test\",\n  \"source\": \"about\",\n  \"sourceContext\": \"…Reach me at jane.doe@acme.test for introductions…\",\n  \"isObfuscated\": false\n}\n```\n\nThe address above is fictional and shows the layout only: addresses on reserved test domains, such as .test and example.com, are never returned.\n\n### Run summary\n\nA run that ends on its own also saves a short summary: one that finishes its list, stops early before its time limit or at your spending or result limit, or fails because no profile could be extracted. Open it from the run's Output tab (**Run summary**), or read the key-value store record `OUTPUT`. Illustrative values:\n\n```json\n{\n  \"complete\": false,\n  \"stoppedBy\": [\"timeLimit\"],\n  \"entries\": 4,\n  \"profiles\": 3,\n  \"extracted\": 1,\n  \"couldNotBeRetrieved\": 0,\n  \"notStarted\": 2,\n  \"notStartedUrls\": [\n    \"https://www.linkedin.com/in/profile-handle-2\",\n    \"https://www.linkedin.com/in/profile-handle-3\"\n  ],\n  \"skipped\": 1,\n  \"skippedEntries\": [{ \"position\": 4, \"entry\": \"https://www.linkedin.com/company/example\" }]\n}\n```\n\n- `complete` is `false` when some profile links have no result row; `notStartedUrls` lists them in list order, as entered (without surrounding spaces; of equivalent links, the first one entered).\n- `stoppedBy` says why they were not started, and is empty when the run is complete. For a Succeeded run, `timeLimit` means resurrect the run to continue with them; `resultOrSpendingLimit` means start a new run with just the links in `notStartedUrls` and a higher limit, not the whole list again. When both appear, start a new run with just those links, a higher limit and a longer timeout. After a run that failed because no profile could be extracted, follow its status message instead.\n- `skippedEntries` lists each entry that was not a usable profile link, with its position in your list (a repeated entry once, at its first position). Skipped entries never get a row, so `complete` speaks for the usable links only.\n- `entries` counts the entries in your list, repeats included: `entries` = `profiles` + `skipped` + the repeated and equivalent links that were merged into them.\n- If you start runs from code or an integration: when the run Succeeded, read the summary rather than counting rows. When `stoppedBy` is just `[\"timeLimit\"]`, resurrect the run and act on nothing else yet: the resurrected run's summary repeats the skipped entries and the counts. Otherwise the run's work has ended: act on `stoppedBy`, and once per run, correct and resend any `skippedEntries` and retry the rows with `succeeded: false` you want to try again. Repeated links are processed once and skipped entries have no row, so a complete run can have fewer rows than your list has entries. A Succeeded run always has its own summary; if one cannot be saved, the run ends Failed and says so.\n- A profile that could not be retrieved counts as done: it has a result row, like an extracted profile, with `succeeded: false` and the reason in `error`, and a resurrect does not try it again. To try some again, start a new run later with just those links, once the run's work has ended; each try adds a new result row. The status message that ends the run's work says so, once, and names a new run with just the corrected entries for any that were skipped; a message that advises a resurrect leaves this to the message after it.\n- When a run Failed or was Aborted, follow its status message. When it says \"Resurrect this run\", a resurrect continues where the run stopped: a resurrected run checks which profiles already have a result row and does not start them again. After a stop because profiles could not be retrieved, resurrect later rather than at once: a resurrect right away may stop the same way, and each resurrect counts as a new run start. When it says \"start a new run\", do that, with the change or the links it names (a message never says both): when the cause is in your list or the run's limits (for example, when no entry is a profile link or the limits do not cover a single profile), a resurrect would end the same way. When the message says neither (for example, the run ran out of memory, or was aborted without time to stop itself), resurrect it: a resurrect does not start a profile that already has a result row.\n- A run that fails because no profile could be extracted also saves a summary: start a new run later with just the links that could not be retrieved, plus any in `notStartedUrls`. A resurrect does not try again a link that already has a row.\n- A run stopped by the time limit itself (Timed out) has no closing message, and a summary it holds is not one to act on (the time limit can land just after a summary is saved): resurrect it later to continue.\n\n---\n\n## Input\n\nProvide public LinkedIn profile URLs, up to 1,000 per run:\n\n```json\n{\n  \"profileUrls\": [\n    \"https://www.linkedin.com/in/williamhgates\",\n    \"https://www.linkedin.com/in/satyanadella\"\n  ]\n}\n```\n\n- Standard and country-prefixed links (for example `br.linkedin.com`) are accepted, as are links to a profile's sub-pages such as `/details/experience/`. Tracking parameters and trailing slashes are cleaned automatically, and equivalent links to the same profile are processed once.\n- An entry that is not a public profile link is skipped and named by its position in your list, in the run log and in the run's final status message (whether the run finishes or stops early). The run stops only when no entry can be used.\n- Sales Navigator links, links that contain a LinkedIn member ID, private profile access, and non-profile LinkedIn URLs are not supported.\n\n---\n\n## Contact and completeness notes\n\nEmail matches can come from the returned About text, headline, work descriptions, or email links. Phone matches can come from the returned About text, headline, or work descriptions. The actor does not generate addresses from name-and-domain patterns or use third-party contact databases.\n\nA phone number written with its country code (such as +1) is returned in international format (+14155552671), and `rawText` keeps it as written. One written without it is returned only when a word such as Phone, Mobile or Tel marks it and the profile shows a country; numbers with no such word are left out, because order, invoice and ID numbers look the same. The country code is then taken from the profile's country, and `rawText` keeps the number exactly as it was written. An address or number cut off where the public view shortens the About text is left out rather than returned incomplete. An email address is returned only when it stands apart from the text around it (one written straight after a Chinese, Japanese, Korean or Thai word still counts): one joined to a word with no space (such as Founder|jane@… or email=jane@…), one that is part of a link (such as https://name@site…) and a social handle written with two @ signs (such as @jane@mastodon.social) are left out rather than returned in part.\n\nA successful row means the returned profile identity matched the requested URL. It does not guarantee that every field was publicly available. Check `experiencesTruncated` and `extractionWarnings` before treating a result as complete.\n\nThe actor does not return skills, languages, certifications, publications, recommendations, projects, identity-verification status, or company-page details such as industry and company size.\n\n---\n\n## FAQ\n\n### Why is `email` or `phone` empty?\n\nNo contact detail was found in the parts of the profile that are returned. The most common reason is the public view: when the row's notes say the About text was shortened, contact details in the hidden part are not available, and one cut off at the end is left out rather than returned incomplete. A phone number written without its country code also needs a word such as Phone or Mobile next to it (see the contact notes above). An empty field does not prove that the person has no public contact details elsewhere.\n\n### Why are job titles empty for many profiles?\n\nMany members show their work history only to signed-in LinkedIn members. The actor returns what is public — usually the name, location, current company, schools and a shortened About — and says so in `extractionWarnings`.\n\n### Why are some profile fields empty?\n\nVisible fields vary across public profiles. When the public profile was incomplete, the row says so in `experiencesTruncated` and `extractionWarnings`.\n\n### Why was one of my entries skipped?\n\nIt was not a public LinkedIn profile link — for example a company page, a Sales Navigator link, a link with extra text or punctuation around it (such as a period at the end of a sentence), or text that is not a link. The run log names it by its position in your list and repeats what was entered, with invisible characters copied along with the link shown as spaces; the final status message gives the position. When more than five entries are skipped, the first five are named and the rest are counted. Correct the entry and start a new run with only the corrected entries: running the whole list again would extract, and charge, the profiles already done a second time. Once the run needs no resurrect, its status message says the same; when the run stopped before starting any profile and says to start a new run, it asks you to correct the entry in your list first.\n\n### What happens when a run gets close to its time limit?\n\nAbout two minutes before the run's time limit (halfway through, for a timeout under four minutes), the actor stops starting new profiles and lets the ones in progress finish. The final status message says how many profiles were not started, and the run summary lists them; they are not requested and add no results. To continue with them, resurrect the run: it starts only those profiles and adds their rows to the same dataset, after the rows already saved. If the run also stopped at your result or spending limit, the status message says to start a new run with just those links and a higher limit instead. If you import the dataset again, take only the rows whose `inputUrl` you have not imported yet. Each resurrect has the run's full time limit again and counts as a new run start; a long list can need more than one. For a long list, you can also raise the run's timeout before you start. With a timeout of only a few minutes, a profile that is slow to load can still be cut off by the time limit.\n\n### Does `isCurrent: false` always mean a past role?\n\nNo. Treat it as a confirmed past role only when `endedOn` contains a date. If `endedOn` is also empty, the status is unknown.\n\n---\n\n## Responsible use\n\nYou are responsible for complying with applicable terms of service, data-protection laws, contractual obligations, and the rules of your jurisdiction. Review contact evidence and confirm that your intended use is lawful and appropriate.\n\nPublic profile availability and visible fields can vary by profile, request, location, and time. LinkedIn is a registered trademark of LinkedIn Corporation. This actor is not affiliated with, endorsed by, or sponsored by LinkedIn.\n\n---\n\n## More actors by futurizerush\n\nBrowse the catalogue: [apify.com/futurizerush](https://apify.com/futurizerush)\n\n---\n\nLinkedIn Profile Scraper, LinkedIn Profile Data, LinkedIn Email Extractor, Public Contact Info, Lead Generation, LinkedIn Profile Dataset, Public Profile Data, B2B Sales Data, Recruiter Tool, Claude Code, OpenClaw, Gemini, Antigravity, Codex, ChatGPT\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "linkedin-profile-scraper",
      "title": "LinkedIn Profile Scraper with Public Contacts",
      "description": "Extract structured public LinkedIn profile data, including names, headlines, work history, education, follower counts, websites, and contact matches from About, headlines, work descriptions, and email links. Matches include source context; ownership and deliverability are not verified.",
      "version": "0.0",
      "minMemoryMbytes": 256,
      "maxMemoryMbytes": 4096,
      "usesStandbyMode": false,
      "input": {
        "title": "LinkedIn Profile Scraper with Public Contacts",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "profileUrls": {
            "title": "🔗 LinkedIn profile URLs",
            "type": "array",
            "editor": "stringList",
            "description": "Add one or more public LinkedIn profile URLs (linkedin.com/in/…). Country-specific links (for example, br.linkedin.com) and links to a profile's sub-pages are accepted. Entries that are not public profile links are skipped and listed by position in the run log.",
            "prefill": [
              "https://www.linkedin.com/in/williamhgates",
              "https://www.linkedin.com/in/satyanadella"
            ],
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 2048,
              "pattern": "\\S"
            }
          }
        },
        "required": [
          "profileUrls"
        ],
        "additionalProperties": false
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Output",
        "properties": {
          "profiles": {
            "type": "string",
            "title": "Profile results",
            "description": "Open the dataset to review profile details, available public contact matches, and each row's retrieval status.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          },
          "summary": {
            "type": "string",
            "title": "Run summary",
            "description": "Counts for the run, and the links of any profiles that were not started. Read it when the run Succeeded; otherwise follow the run's status message, and resurrect when it gives no next step.",
            "template": "{{links.apiDefaultKeyValueStoreUrl}}/records/OUTPUT"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "fields": {
            "$schema": "http://json-schema.org/draft-07/schema#",
            "type": "object",
            "properties": {
              "inputUrl": {
                "type": "string",
                "title": "Input URL",
                "description": "The LinkedIn URL as submitted, after surrounding whitespace is removed.",
                "pattern": "^(?:[Hh][Tt][Tt][Pp][Ss]?://)?(?:[A-Za-z0-9-]+\\.)*[Ll][Ii][Nn][Kk][Ee][Dd][Ii][Nn]\\.[Cc][Oo][Mm]/[Ii][Nn]/[^/?#\\s]+(?:/[^?#\\s]*)?(?:[?#].*)?$",
                "example": "https://www.linkedin.com/in/satyanadella"
              },
              "linkedinUrl": {
                "type": "string",
                "title": "Profile URL",
                "description": "The clean LinkedIn profile URL — country prefix and extra URL parameters removed.",
                "format": "uri",
                "pattern": "^https://www\\.linkedin\\.com/in/[^/?#\\s]+$",
                "example": "https://www.linkedin.com/in/satyanadella"
              },
              "publicIdentifier": {
                "type": "string",
                "title": "Profile handle",
                "description": "The handle in the LinkedIn URL — e.g. williamhgates for linkedin.com/in/williamhgates",
                "minLength": 1,
                "pattern": "^(?:[^/?#\\s]|\\u202F)+$",
                "example": "satyanadella"
              },
              "urn": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "LinkedIn ID",
                "description": "LinkedIn member identifier tied to the requested profile when the public response exposes one; otherwise null.",
                "pattern": "^urn:li:member:[0-9]+$",
                "example": "urn:li:member:19186432"
              },
              "succeeded": {
                "type": "boolean",
                "title": "Succeeded",
                "description": "True if an identity-matched profile row was extracted; fields may still be empty when the public view is limited. False when public profile content could not be retrieved or verified.",
                "example": true
              },
              "error": {
                "type": [
                  "string",
                  "null"
                ],
                "minLength": 1,
                "title": "Reason if not retrieved",
                "description": "A short readable reason when the row could not be retrieved (null on success), including unavailable content, connection problems, unreadable content, or a returned profile that did not match the requested URL."
              },
              "extractedAt": {
                "type": "string",
                "title": "Extracted at",
                "description": "Timestamp when this row was produced (ISO 8601 / UTC)",
                "format": "date-time"
              },
              "firstName": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "First name",
                "minLength": 1
              },
              "lastName": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Last name",
                "minLength": 1
              },
              "fullName": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Full name",
                "minLength": 1
              },
              "headline": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Headline",
                "description": "The one-line summary shown under the person's name on LinkedIn — most often 'Title at Company'."
              },
              "about": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "About / bio",
                "description": "The 'About' / bio text from the profile. It can end with '…' when extractionWarnings says the About text was shortened in the public view."
              },
              "location": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Location",
                "description": "Full location label as the profile shows it (e.g. 'Redmond, Washington, United States')."
              },
              "country": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Country code",
                "description": "Two-letter country code (e.g. US, GB, BR), or null when the returned location does not identify one confidently.",
                "pattern": "^[A-Z]{2}$"
              },
              "city": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "City",
                "description": "First segment of a multi-part profile location. Null when a city cannot be separated confidently."
              },
              "profilePictureUrl": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Profile picture URL",
                "description": "Direct link to the person's profile photo when identified in the returned page. Generic LinkedIn artwork is excluded.",
                "format": "uri",
                "pattern": "^https://"
              },
              "linkedinBadge": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Creator / Top Voice label",
                "description": "Creator or Top Voice label when present in the returned profile content. This is not an identity-verification status.",
                "enum": [
                  null,
                  "Creator",
                  "Top Voice",
                  "Creator, Top Voice"
                ]
              },
              "followerCount": {
                "type": [
                  "integer",
                  "null"
                ],
                "title": "Followers",
                "description": "Follower count from the returned profile content. Compact labels such as 12M are normalized to their displayed numeric value and should not be treated as a more precise total.",
                "minimum": 0
              },
              "connectionCount": {
                "type": [
                  "integer",
                  "null"
                ],
                "title": "Connections",
                "description": "Number of connections shown on the profile. Empty when the profile shows '500+' rather than an exact number — the real count is unknown in that case.",
                "minimum": 0
              },
              "currentTitle": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Current / most recent title",
                "description": "Current title when a current role is visible; otherwise the title from the most recently listed experience."
              },
              "currentCompany": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Current / most recent company",
                "description": "Current company when a current role is visible; otherwise the organization from the most recently listed experience, or — when job titles are not public — the one organization the page still shows (experiences may then be empty)."
              },
              "currentCompanyLinkedinUrl": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Current / most recent organization URL",
                "description": "LinkedIn organization URL for the selected current or most recently listed experience, or for the organization the page still shows when job titles are not public; null when the page gives none.",
                "format": "uri",
                "pattern": "^https://www\\.linkedin\\.com/(?:company|school)/[^/?#\\s]+/?$"
              },
              "experiences": {
                "type": "array",
                "title": "Work experience",
                "description": "Work history present in the returned public profile content. Use experiencesTruncated and extractionWarnings to assess completeness.",
                "items": {
                  "type": "object",
                  "properties": {
                    "title": {
                      "type": "string",
                      "description": "Job title",
                      "minLength": 1
                    },
                    "company": {
                      "type": "string",
                      "minLength": 1
                    },
                    "companyLinkedinUrl": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "LinkedIn link to the company, school, or other organization page",
                      "format": "uri",
                      "pattern": "^https://www\\.linkedin\\.com/(?:company|school)/[^/?#\\s]+/?$"
                    },
                    "location": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Location label shown for this role when present in the returned public profile content"
                    },
                    "startedOn": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Start date as year-and-month or year only (e.g. 2020-03 or 2020)",
                      "pattern": "^(?:19|20)[0-9]{2}(?:-(?:0[1-9]|1[0-2]))?$"
                    },
                    "endedOn": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "End date shown for the role. Null for a role marked as current or when no end date is present.",
                      "pattern": "^(?:19|20)[0-9]{2}(?:-(?:0[1-9]|1[0-2]))?$"
                    },
                    "isCurrent": {
                      "type": "boolean",
                      "description": "True only when the returned role is explicitly marked as current. False means no current marker was found; use endedOn to distinguish a shown past role from an unknown status."
                    },
                    "durationMonths": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Length in months when both start and end have month precision; null for current, year-only, incomplete, or contradictory ranges.",
                      "minimum": 0
                    },
                    "description": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  },
                  "required": [
                    "title",
                    "company",
                    "companyLinkedinUrl",
                    "location",
                    "startedOn",
                    "endedOn",
                    "isCurrent",
                    "durationMonths",
                    "description"
                  ],
                  "additionalProperties": false
                }
              },
              "experiencesTruncated": {
                "type": "boolean",
                "title": "More work history may exist",
                "description": "True when the returned page signals that more work history may exist: an explicit link to additional positions, a missing work-history section, or a shortened, members-only or limited public view (extractionWarnings says which)."
              },
              "extractionWarnings": {
                "type": "array",
                "title": "Notes",
                "description": "Short readable notes when the returned public profile was incomplete — for example 'LinkedIn returned a shortened public view — work history was not included', 'this profile shows its full work history only to signed-in LinkedIn members', 'the About text was shortened in the public view', 'this is a limited public view — most fields may be empty', 'work history was not present in the returned public content' or 'education was not present in the returned public content'. Empty when nothing was missing.",
                "items": {
                  "type": "string"
                }
              },
              "educations": {
                "type": "array",
                "title": "Education",
                "items": {
                  "type": "object",
                  "properties": {
                    "school": {
                      "type": "string",
                      "minLength": 1
                    },
                    "degree": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "field": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "startedOn": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "pattern": "^(?:19|20)[0-9]{2}(?:-(?:0[1-9]|1[0-2]))?$"
                    },
                    "endedOn": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "pattern": "^(?:19|20)[0-9]{2}(?:-(?:0[1-9]|1[0-2]))?$"
                    }
                  },
                  "required": [
                    "school",
                    "degree",
                    "field",
                    "startedOn",
                    "endedOn"
                  ],
                  "additionalProperties": false
                }
              },
              "emails": {
                "type": "array",
                "title": "Email matches (with source)",
                "description": "Email-shaped contact details found in the returned About, headline, work descriptions, or email links. Each entry includes its source and evidence. Ownership and deliverability are not verified.",
                "items": {
                  "type": "object",
                  "properties": {
                    "email": {
                      "type": "string",
                      "format": "email"
                    },
                    "source": {
                      "type": "string",
                      "enum": [
                        "about",
                        "headline",
                        "experience.description",
                        "website"
                      ]
                    },
                    "sourceContext": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Nearby text for a text match, or a short provenance note for an email link"
                    },
                    "isObfuscated": {
                      "type": "boolean",
                      "description": "True when the original profile text disguised the email — the address shown in the `email` field is the recovered form"
                    }
                  },
                  "required": [
                    "email",
                    "source",
                    "sourceContext",
                    "isObfuscated"
                  ],
                  "additionalProperties": false
                }
              },
              "email": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "First email match",
                "description": "The first email match surfaced for convenient export. See `emails` for source context; ownership and deliverability are not verified.",
                "format": "email"
              },
              "phones": {
                "type": "array",
                "title": "Phone matches (with source)",
                "description": "Phone numbers found in the returned About, headline, or work descriptions, in international format with source context. A number written without its country code is returned only when a word such as Phone, Mobile or Tel marks it and the profile shows a country; its country code is then taken from that country, and rawText keeps the number as written. Ownership is not verified.",
                "items": {
                  "type": "object",
                  "properties": {
                    "phone": {
                      "type": "string",
                      "description": "International format (e.g. +14155551234)",
                      "pattern": "^\\+[1-9][0-9]{6,14}$"
                    },
                    "rawText": {
                      "type": "string",
                      "description": "The phone exactly as written on the profile"
                    },
                    "source": {
                      "type": "string",
                      "enum": [
                        "about",
                        "headline",
                        "experience.description"
                      ]
                    },
                    "sourceContext": {
                      "type": "string",
                      "minLength": 1
                    },
                    "countryCode": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Two-letter country code when the number maps to a country; null for valid non-geographic international numbers",
                      "pattern": "^[A-Z]{2}$"
                    }
                  },
                  "required": [
                    "phone",
                    "rawText",
                    "source",
                    "sourceContext",
                    "countryCode"
                  ],
                  "additionalProperties": false
                }
              },
              "phone": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "First phone match",
                "pattern": "^\\+[1-9][0-9]{6,14}$"
              },
              "websites": {
                "type": "array",
                "title": "Website / contact links",
                "description": "Website or contact links present in the returned profile content, including mailto links.",
                "items": {
                  "type": "string",
                  "format": "uri",
                  "pattern": "^(?:https?://|mailto:)"
                }
              }
            },
            "required": [
              "inputUrl",
              "linkedinUrl",
              "publicIdentifier",
              "urn",
              "succeeded",
              "error",
              "extractedAt",
              "extractionWarnings",
              "firstName",
              "lastName",
              "fullName",
              "headline",
              "about",
              "location",
              "country",
              "city",
              "profilePictureUrl",
              "linkedinBadge",
              "followerCount",
              "connectionCount",
              "experiences",
              "experiencesTruncated",
              "currentCompany",
              "currentTitle",
              "currentCompanyLinkedinUrl",
              "educations",
              "emails",
              "email",
              "phones",
              "phone",
              "websites"
            ],
            "additionalProperties": false
          },
          "views": {
            "overview": {
              "title": "Profiles overview",
              "description": "Headline view with the most useful columns first.",
              "transformation": {
                "fields": [
                  "profilePictureUrl",
                  "fullName",
                  "headline",
                  "linkedinBadge",
                  "currentTitle",
                  "currentCompany",
                  "location",
                  "followerCount",
                  "email",
                  "phone",
                  "linkedinUrl",
                  "succeeded",
                  "error",
                  "extractionWarnings"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "profilePictureUrl": {
                    "label": "Photo",
                    "format": "image"
                  },
                  "fullName": {
                    "label": "Name",
                    "format": "text"
                  },
                  "headline": {
                    "label": "Headline",
                    "format": "text"
                  },
                  "linkedinBadge": {
                    "label": "Badge",
                    "format": "text"
                  },
                  "currentTitle": {
                    "label": "Title",
                    "format": "text"
                  },
                  "currentCompany": {
                    "label": "Company",
                    "format": "text"
                  },
                  "location": {
                    "label": "Location",
                    "format": "text"
                  },
                  "followerCount": {
                    "label": "Followers",
                    "format": "number"
                  },
                  "email": {
                    "label": "Email",
                    "format": "text"
                  },
                  "phone": {
                    "label": "Phone",
                    "format": "text"
                  },
                  "linkedinUrl": {
                    "label": "LinkedIn URL",
                    "format": "link"
                  },
                  "succeeded": {
                    "label": "OK",
                    "format": "boolean"
                  },
                  "error": {
                    "label": "Reason if not OK",
                    "format": "text"
                  },
                  "extractionWarnings": {
                    "label": "Notes",
                    "format": "array"
                  }
                }
              }
            },
            "contacts": {
              "title": "Contact columns",
              "description": "Primary contact matches with a clear retrieval status for every row.",
              "transformation": {
                "fields": [
                  "fullName",
                  "currentCompany",
                  "email",
                  "phone",
                  "linkedinUrl",
                  "succeeded",
                  "error",
                  "extractionWarnings"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "fullName": {
                    "label": "Name",
                    "format": "text"
                  },
                  "currentCompany": {
                    "label": "Company",
                    "format": "text"
                  },
                  "email": {
                    "label": "Primary email",
                    "format": "text"
                  },
                  "phone": {
                    "label": "Primary phone",
                    "format": "text"
                  },
                  "linkedinUrl": {
                    "label": "LinkedIn URL",
                    "format": "link"
                  },
                  "succeeded": {
                    "label": "Profile retrieved",
                    "format": "boolean"
                  },
                  "error": {
                    "label": "Reason",
                    "format": "text"
                  },
                  "extractionWarnings": {
                    "label": "Notes",
                    "format": "array"
                  }
                }
              }
            }
          }
        },
        "keyValueStore": {
          "actorKeyValueStoreSchemaVersion": 1,
          "title": "Run storage",
          "collections": {
            "runProgress": {
              "title": "Run progress",
              "description": "Progress checkpoint: a resurrect continues from it and from the rows already stored, so profiles already done, including any that could not be retrieved, are not done again.",
              "key": "crawling-state",
              "contentTypes": [
                "application/json"
              ],
              "jsonSchema": {
                "$schema": "http://json-schema.org/draft-07/schema#",
                "type": "object",
                "properties": {
                  "processedProfiles": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "successCount": {
                    "type": "integer",
                    "minimum": 0
                  },
                  "retryCount": {
                    "type": "integer",
                    "minimum": 0
                  }
                },
                "required": [
                  "processedProfiles",
                  "successCount",
                  "retryCount"
                ],
                "additionalProperties": false
              }
            },
            "runSummary": {
              "title": "Run summary",
              "description": "Counts for the run, the links of any profiles that were not started (for example because the run stopped shortly before its time limit) and the entries that were skipped. A Succeeded run always has its own: read it only then. When stoppedBy is just timeLimit, resurrect the run first: the resurrected run's summary repeats the skipped entries and counts, so act on them once the run's work has ended. A run that fails because no profile could be extracted saves one too. Other failed, aborted or timed-out runs have none of their own to act on: follow the run's status message, and resurrect when it gives no next step; a timed-out run can be resurrected to continue.",
              "key": "OUTPUT",
              "contentTypes": [
                "application/json"
              ],
              "jsonSchema": {
                "$schema": "http://json-schema.org/draft-07/schema#",
                "type": "object",
                "properties": {
                  "complete": {
                    "type": "boolean",
                    "description": "True when every usable profile link has a result row."
                  },
                  "stoppedBy": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "timeLimit",
                        "resultOrSpendingLimit"
                      ]
                    },
                    "description": "Why profiles were not started, empty when complete. For a Succeeded run: timeLimit (resurrect the run to continue), resultOrSpendingLimit (start a new run with notStartedUrls and a higher limit); when both appear, start a new run with notStartedUrls, a higher limit and a longer timeout. After a run that failed because no profile could be extracted, follow its status message."
                  },
                  "entries": {
                    "type": "integer",
                    "minimum": 0,
                    "description": "Entries in your list, repeats included: profiles + skipped + the repeats and equivalent links merged into them."
                  },
                  "profiles": {
                    "type": "integer",
                    "minimum": 0,
                    "description": "Distinct usable profile links in the list."
                  },
                  "extracted": {
                    "type": "integer",
                    "minimum": 0,
                    "description": "Profiles extracted."
                  },
                  "couldNotBeRetrieved": {
                    "type": "integer",
                    "minimum": 0,
                    "description": "Profiles whose row gives the reason they could not be retrieved."
                  },
                  "notStarted": {
                    "type": "integer",
                    "minimum": 0,
                    "description": "Profiles without a result row."
                  },
                  "notStartedUrls": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "The links of those profiles as entered (without surrounding spaces; of equivalent links, the first one), in list order."
                  },
                  "skipped": {
                    "type": "integer",
                    "minimum": 0,
                    "description": "Entries that were not usable profile links. They never get a result row."
                  },
                  "skippedEntries": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "position": {
                          "type": "integer",
                          "minimum": 1
                        },
                        "entry": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "position",
                        "entry"
                      ],
                      "additionalProperties": false
                    },
                    "description": "Each skipped entry with its position in your list and what was entered (a repeated entry once, at its first position)."
                  }
                },
                "required": [
                  "complete",
                  "stoppedBy",
                  "entries",
                  "profiles",
                  "extracted",
                  "couldNotBeRetrieved",
                  "notStarted",
                  "notStartedUrls",
                  "skipped",
                  "skippedEntries"
                ],
                "additionalProperties": false
              }
            }
          }
        }
      },
      "dockerfile": "./Dockerfile",
      "categories": [
        "LEAD_GENERATION",
        "SOCIAL_MEDIA"
      ],
      "readme": "# LinkedIn Profile Scraper with Public Contacts\n\nTurn public LinkedIn profile URLs into structured profile records. Results can include names, headlines, work experience, education, follower counts, websites, and contact matches found in supported public profile fields.\n\nContact matches include their source and nearby context. They are not verified for ownership, consent, recency, or deliverability.\n\n---\n\n## What you get\n\nEach usable profile link the run reaches produces one result row with a clear retrieval status. A run that stops early, shortly before its time limit or at your spending limit, lists the profiles it did not reach in its run summary.\n\n| Field                                                         | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n| ------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `firstName`, `lastName`, `fullName`                           | Name shown on the profile. First and last name take the first word as the first name and leave out credentials after a comma (“Jane Doe, MBA”, “Jane Doe, REALTOR®” and “Jane Doe, Realtor” give Jane, Doe); a credential after the last name without a comma, written in capitals or a common degree such as PhD, leaves only the last name empty (“Jane Doe MBA” gives Jane); both stay empty when the first name would be a guess, for example for “Smith, John”, “Smith Jr”, “Dr Jane Doe”, “Jane Doe (she/her)”, a name with a business word such as “Realty” or “LLC”, Realtor without a comma (“Jane Doe Realtor”, “Jane Doe REALTOR®”), or a Chinese, Japanese or Korean name; a business name without such a word can be read as a person’s name |\n| `headline`, `about`                                           | Profile headline and About text when available                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n| `location`, `city`, `country`                                 | Returned location, a confidently separated city, and a two-letter country code when identifiable                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n| `profilePictureUrl`                                           | Profile photo URL when identified; generic platform artwork is excluded                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n| `linkedinBadge`                                               | Creator or Top Voice label when returned; this is not identity verification                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n| `followerCount`, `connectionCount`                            | Counts from the returned profile; compact follower labels are normalized to numbers, while non-exact connection labels such as `500+` remain empty                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n| `experiences[]`                                               | Returned roles with organization, dates, location, description, and employment-status evidence                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n| `experiencesTruncated`                                        | `true` when the returned content indicates that more work history may exist                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n| `currentCompany`, `currentTitle`, `currentCompanyLinkedinUrl` | Current role when explicitly identified; otherwise the most recently listed role. When job titles are not public, only the company the profile shows is filled                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n| `educations[]`                                                | Returned schools, degrees, fields of study, and dates                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n| `emails[]`, `phones[]`                                        | Contact matches with source and context                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n| `email`, `phone`                                              | First contact match for convenient export                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n| `websites[]`                                                  | Unique website and email links present in supported profile content                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n| `inputUrl`, `linkedinUrl`, `publicIdentifier`, `urn`          | Input and profile identifiers                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n| `extractionWarnings`                                          | Readable notes when the public profile was incomplete; empty when nothing was missing                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n| `succeeded`, `error`, `extractedAt`                           | Retrieval status, failure reason when applicable, and output time                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n\n### Reading employment status\n\n`isCurrent` is evidence-based:\n\n- `isCurrent: true` means the role was explicitly marked as current.\n- `isCurrent: false` with an `endedOn` value means an end date was shown.\n- `isCurrent: false` with `endedOn: null` means no current marker or end date was available. It does not prove that the role has ended.\n\n### When a profile shows less in public\n\nMany LinkedIn members show only part of their profile to visitors who are not signed in. The row keeps everything that was visible, says what was missing in `extractionWarnings`, and sets `experiencesTruncated` to `true` when the work history may be incomplete:\n\n| Note                                                                          | What it means                                                                                                      |\n| ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |\n| `this profile shows its full work history only to signed-in LinkedIn members` | Job titles and dates are hidden; the name, location, current company, schools and a shortened About usually remain |\n| `the About text was shortened in the public view`                             | The About text ends where the public profile cuts it                                                               |\n| `this is a limited public view — most fields may be empty`                    | Very little of the profile is public                                                                               |\n| `LinkedIn returned a shortened public view — work history was not included`   | The public page came back without the roles, their titles and dates                                                |\n| `work history was not present in the returned public content`                 | The public page had no work history section: the member may list none, or the view hides it                        |\n| `education was not present in the returned public content`                    | The public page had no education section: the member may list none, or the view hides it                           |\n\n---\n\n## Sample output\n\nThis example is the actor's output for a public profile captured on 2026-09-30, trimmed for length: the real row lists every visible role and school (5 roles and 3 schools here), and every role carries all of its keys, including `location`, `durationMonths` and `description` (null when LinkedIn shows none). Public values can change after capture.\n\nInput:\n\n```json\n{\n  \"profileUrls\": [\"https://www.linkedin.com/in/satyanadella\"]\n}\n```\n\nOutput:\n\n```json\n{\n  \"inputUrl\": \"https://www.linkedin.com/in/satyanadella\",\n  \"linkedinUrl\": \"https://www.linkedin.com/in/satyanadella\",\n  \"publicIdentifier\": \"satyanadella\",\n  \"urn\": \"urn:li:member:19186432\",\n  \"succeeded\": true,\n  \"error\": null,\n  \"extractionWarnings\": [],\n  \"firstName\": \"Satya\",\n  \"lastName\": \"Nadella\",\n  \"fullName\": \"Satya Nadella\",\n  \"headline\": \"Chairman and CEO at Microsoft\",\n  \"about\": \"As chairman and CEO of Microsoft, I define my mission and that of my company as empowering every person and every organization on the planet to achieve more.\",\n  \"location\": \"Redmond, Washington, United States\",\n  \"city\": \"Redmond\",\n  \"country\": \"US\",\n  \"linkedinBadge\": \"Creator, Top Voice\",\n  \"followerCount\": 12194326,\n  \"connectionCount\": null,\n  \"experiences\": [\n    {\n      \"title\": \"Chairman and CEO\",\n      \"company\": \"Microsoft\",\n      \"companyLinkedinUrl\": \"https://www.linkedin.com/company/microsoft\",\n      \"location\": \"Greater Seattle Area\",\n      \"startedOn\": \"2014-02\",\n      \"endedOn\": null,\n      \"isCurrent\": true\n    },\n    {\n      \"title\": \"Board Member\",\n      \"company\": \"Starbucks\",\n      \"companyLinkedinUrl\": \"https://www.linkedin.com/company/starbucks\",\n      \"startedOn\": \"2017\",\n      \"endedOn\": \"2024\",\n      \"isCurrent\": false\n    }\n  ],\n  \"experiencesTruncated\": false,\n  \"currentCompany\": \"Microsoft\",\n  \"currentTitle\": \"Chairman and CEO\",\n  \"educations\": [\n    {\n      \"school\": \"Manipal Institute of Technology, Manipal\",\n      \"degree\": \"Bachelor’s Degree\",\n      \"field\": \"Electrical Engineering\",\n      \"startedOn\": null,\n      \"endedOn\": null\n    },\n    {\n      \"school\": \"University of Wisconsin-Milwaukee\",\n      \"degree\": \"Master’s Degree\",\n      \"field\": \"Computer Science\",\n      \"startedOn\": null,\n      \"endedOn\": null\n    }\n  ],\n  \"websites\": [\"https://snscratchpad.com/\"],\n  \"emails\": [],\n  \"email\": null,\n  \"phones\": [],\n  \"phone\": null\n}\n```\n\nThe saved profile produced no email or phone match. The actor does not infer contacts when supported fields contain none.\n\nAn email match includes reviewable evidence:\n\n```json\n{\n  \"email\": \"jane.doe@acme.test\",\n  \"source\": \"about\",\n  \"sourceContext\": \"…Reach me at jane.doe@acme.test for introductions…\",\n  \"isObfuscated\": false\n}\n```\n\nThe address above is fictional and shows the layout only: addresses on reserved test domains, such as .test and example.com, are never returned.\n\n### Run summary\n\nA run that ends on its own also saves a short summary: one that finishes its list, stops early before its time limit or at your spending or result limit, or fails because no profile could be extracted. Open it from the run's Output tab (**Run summary**), or read the key-value store record `OUTPUT`. Illustrative values:\n\n```json\n{\n  \"complete\": false,\n  \"stoppedBy\": [\"timeLimit\"],\n  \"entries\": 4,\n  \"profiles\": 3,\n  \"extracted\": 1,\n  \"couldNotBeRetrieved\": 0,\n  \"notStarted\": 2,\n  \"notStartedUrls\": [\n    \"https://www.linkedin.com/in/profile-handle-2\",\n    \"https://www.linkedin.com/in/profile-handle-3\"\n  ],\n  \"skipped\": 1,\n  \"skippedEntries\": [{ \"position\": 4, \"entry\": \"https://www.linkedin.com/company/example\" }]\n}\n```\n\n- `complete` is `false` when some profile links have no result row; `notStartedUrls` lists them in list order, as entered (without surrounding spaces; of equivalent links, the first one entered).\n- `stoppedBy` says why they were not started, and is empty when the run is complete. For a Succeeded run, `timeLimit` means resurrect the run to continue with them; `resultOrSpendingLimit` means start a new run with just the links in `notStartedUrls` and a higher limit, not the whole list again. When both appear, start a new run with just those links, a higher limit and a longer timeout. After a run that failed because no profile could be extracted, follow its status message instead.\n- `skippedEntries` lists each entry that was not a usable profile link, with its position in your list (a repeated entry once, at its first position). Skipped entries never get a row, so `complete` speaks for the usable links only.\n- `entries` counts the entries in your list, repeats included: `entries` = `profiles` + `skipped` + the repeated and equivalent links that were merged into them.\n- If you start runs from code or an integration: when the run Succeeded, read the summary rather than counting rows. When `stoppedBy` is just `[\"timeLimit\"]`, resurrect the run and act on nothing else yet: the resurrected run's summary repeats the skipped entries and the counts. Otherwise the run's work has ended: act on `stoppedBy`, and once per run, correct and resend any `skippedEntries` and retry the rows with `succeeded: false` you want to try again. Repeated links are processed once and skipped entries have no row, so a complete run can have fewer rows than your list has entries. A Succeeded run always has its own summary; if one cannot be saved, the run ends Failed and says so.\n- A profile that could not be retrieved counts as done: it has a result row, like an extracted profile, with `succeeded: false` and the reason in `error`, and a resurrect does not try it again. To try some again, start a new run later with just those links, once the run's work has ended; each try adds a new result row. The status message that ends the run's work says so, once, and names a new run with just the corrected entries for any that were skipped; a message that advises a resurrect leaves this to the message after it.\n- When a run Failed or was Aborted, follow its status message. When it says \"Resurrect this run\", a resurrect continues where the run stopped: a resurrected run checks which profiles already have a result row and does not start them again. After a stop because profiles could not be retrieved, resurrect later rather than at once: a resurrect right away may stop the same way, and each resurrect counts as a new run start. When it says \"start a new run\", do that, with the change or the links it names (a message never says both): when the cause is in your list or the run's limits (for example, when no entry is a profile link or the limits do not cover a single profile), a resurrect would end the same way. When the message says neither (for example, the run ran out of memory, or was aborted without time to stop itself), resurrect it: a resurrect does not start a profile that already has a result row.\n- A run that fails because no profile could be extracted also saves a summary: start a new run later with just the links that could not be retrieved, plus any in `notStartedUrls`. A resurrect does not try again a link that already has a row.\n- A run stopped by the time limit itself (Timed out) has no closing message, and a summary it holds is not one to act on (the time limit can land just after a summary is saved): resurrect it later to continue.\n\n---\n\n## Input\n\nProvide public LinkedIn profile URLs, up to 1,000 per run:\n\n```json\n{\n  \"profileUrls\": [\n    \"https://www.linkedin.com/in/williamhgates\",\n    \"https://www.linkedin.com/in/satyanadella\"\n  ]\n}\n```\n\n- Standard and country-prefixed links (for example `br.linkedin.com`) are accepted, as are links to a profile's sub-pages such as `/details/experience/`. Tracking parameters and trailing slashes are cleaned automatically, and equivalent links to the same profile are processed once.\n- An entry that is not a public profile link is skipped and named by its position in your list, in the run log and in the run's final status message (whether the run finishes or stops early). The run stops only when no entry can be used.\n- Sales Navigator links, links that contain a LinkedIn member ID, private profile access, and non-profile LinkedIn URLs are not supported.\n\n---\n\n## Contact and completeness notes\n\nEmail matches can come from the returned About text, headline, work descriptions, or email links. Phone matches can come from the returned About text, headline, or work descriptions. The actor does not generate addresses from name-and-domain patterns or use third-party contact databases.\n\nA phone number written with its country code (such as +1) is returned in international format (+14155552671), and `rawText` keeps it as written. One written without it is returned only when a word such as Phone, Mobile or Tel marks it and the profile shows a country; numbers with no such word are left out, because order, invoice and ID numbers look the same. The country code is then taken from the profile's country, and `rawText` keeps the number exactly as it was written. An address or number cut off where the public view shortens the About text is left out rather than returned incomplete. An email address is returned only when it stands apart from the text around it (one written straight after a Chinese, Japanese, Korean or Thai word still counts): one joined to a word with no space (such as Founder|jane@… or email=jane@…), one that is part of a link (such as https://name@site…) and a social handle written with two @ signs (such as @jane@mastodon.social) are left out rather than returned in part.\n\nA successful row means the returned profile identity matched the requested URL. It does not guarantee that every field was publicly available. Check `experiencesTruncated` and `extractionWarnings` before treating a result as complete.\n\nThe actor does not return skills, languages, certifications, publications, recommendations, projects, identity-verification status, or company-page details such as industry and company size.\n\n---\n\n## FAQ\n\n### Why is `email` or `phone` empty?\n\nNo contact detail was found in the parts of the profile that are returned. The most common reason is the public view: when the row's notes say the About text was shortened, contact details in the hidden part are not available, and one cut off at the end is left out rather than returned incomplete. A phone number written without its country code also needs a word such as Phone or Mobile next to it (see the contact notes above). An empty field does not prove that the person has no public contact details elsewhere.\n\n### Why are job titles empty for many profiles?\n\nMany members show their work history only to signed-in LinkedIn members. The actor returns what is public — usually the name, location, current company, schools and a shortened About — and says so in `extractionWarnings`.\n\n### Why are some profile fields empty?\n\nVisible fields vary across public profiles. When the public profile was incomplete, the row says so in `experiencesTruncated` and `extractionWarnings`.\n\n### Why was one of my entries skipped?\n\nIt was not a public LinkedIn profile link — for example a company page, a Sales Navigator link, a link with extra text or punctuation around it (such as a period at the end of a sentence), or text that is not a link. The run log names it by its position in your list and repeats what was entered, with invisible characters copied along with the link shown as spaces; the final status message gives the position. When more than five entries are skipped, the first five are named and the rest are counted. Correct the entry and start a new run with only the corrected entries: running the whole list again would extract, and charge, the profiles already done a second time. Once the run needs no resurrect, its status message says the same; when the run stopped before starting any profile and says to start a new run, it asks you to correct the entry in your list first.\n\n### What happens when a run gets close to its time limit?\n\nAbout two minutes before the run's time limit (halfway through, for a timeout under four minutes), the actor stops starting new profiles and lets the ones in progress finish. The final status message says how many profiles were not started, and the run summary lists them; they are not requested and add no results. To continue with them, resurrect the run: it starts only those profiles and adds their rows to the same dataset, after the rows already saved. If the run also stopped at your result or spending limit, the status message says to start a new run with just those links and a higher limit instead. If you import the dataset again, take only the rows whose `inputUrl` you have not imported yet. Each resurrect has the run's full time limit again and counts as a new run start; a long list can need more than one. For a long list, you can also raise the run's timeout before you start. With a timeout of only a few minutes, a profile that is slow to load can still be cut off by the time limit.\n\n### Does `isCurrent: false` always mean a past role?\n\nNo. Treat it as a confirmed past role only when `endedOn` contains a date. If `endedOn` is also empty, the status is unknown.\n\n---\n\n## Responsible use\n\nYou are responsible for complying with applicable terms of service, data-protection laws, contractual obligations, and the rules of your jurisdiction. Review contact evidence and confirm that your intended use is lawful and appropriate.\n\nPublic profile availability and visible fields can vary by profile, request, location, and time. LinkedIn is a registered trademark of LinkedIn Corporation. This actor is not affiliated with, endorsed by, or sponsored by LinkedIn.\n\n---\n\n## More actors by futurizerush\n\nBrowse the catalogue: [apify.com/futurizerush](https://apify.com/futurizerush)\n\n---\n\nLinkedIn Profile Scraper, LinkedIn Profile Data, LinkedIn Email Extractor, Public Contact Info, Lead Generation, LinkedIn Profile Dataset, Public Profile Data, B2B Sales Data, Recruiter Tool, Claude Code, OpenClaw, Gemini, Antigravity, Codex, ChatGPT\n"
    },
    "buildNumber": "0.0.32",
    "imageDigest": "df3a61f7f2779a4033f2fea45b8fecc029ee3643e31934bc78f7fdee939dab58",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "0.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.07639777777777777
    }
  }
}