{
  "data": {
    "id": "eVpEfjG27u2JhT8YE",
    "actId": "4hlFo3L9L4XcQGeQ1",
    "userId": "gYCOLcSy6IuM4XiTT",
    "startedAt": "2026-10-05T11:52:11.586Z",
    "finishedAt": "2026-10-05T11:52:27.724Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "API"
    },
    "stats": {
      "durationMillis": 16053,
      "runTimeSecs": 16.053,
      "computeUnits": 0.017836666666666667,
      "imageSizeBytes": 363519488
    },
    "options": {
      "useCache": false,
      "betaPackages": false,
      "tag": "latest",
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"LinkedIn Profile Data Scraper\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"profiles\": {\n      \"title\": \"LinkedIn profiles\",\n      \"type\": \"array\",\n      \"editor\": \"stringList\",\n      \"description\": \"One per line. A profile link (`https://www.linkedin.com/in/satyanadella`), a country one (`https://de.linkedin.com/in/...`) or just the part after /in/ (`satyanadella`). A company page belongs in our company listing; pasted here it is skipped with a note, not charged.\",\n      \"prefill\": [\n        \"satyanadella\",\n        \"williamhgates\",\n        \"reidhoffman\"\n      ]\n    },\n    \"maxProfiles\": {\n      \"title\": \"Maximum profiles\",\n      \"type\": \"integer\",\n      \"description\": \"A ceiling on one run, counted in profiles read. Refused and filtered profiles are never charged, whatever this says.\",\n      \"default\": 100,\n      \"prefill\": 3,\n      \"minimum\": 1,\n      \"maximum\": 200\n    },\n    \"minFollowers\": {\n      \"title\": \"Minimum followers\",\n      \"type\": \"integer\",\n      \"description\": \"Keep only people with at least this many followers. Judged from LinkedIn's own count before the row is stored, so a person below the bar is never charged. 0 keeps everybody.\",\n      \"default\": 0,\n      \"minimum\": 0\n    },\n    \"onlyWithCurrentCompany\": {\n      \"title\": \"Only profiles with a current employer\",\n      \"type\": \"boolean\",\n      \"description\": \"Drop people whose page lists no current organisation - students, retirees, and the profiles LinkedIn withheld the employer of. Dropped rows are free.\",\n      \"default\": false\n    },\n    \"includeFailedProfiles\": {\n      \"title\": \"Include refused profiles as rows\",\n      \"type\": \"boolean\",\n      \"description\": \"On by default: a profile LinkedIn would not serve comes back as a row with `status: blocked` and the reason, so a list of five hundred can be re-run against the gaps. Free either way.\",\n      \"default\": true\n    }\n  },\n  \"required\": [\n    \"profiles\"\n  ]\n}",
    "readme": "# LinkedIn Profile Data Scraper\n\nPaste LinkedIn profile addresses, get one row per person: name, headline, the\nAbout text, the current employer **with its LinkedIn page and the year they\nstarted**, past organisations, schools with years, city, country, follower count\nand photo.\n\nNo account, no cookie, no session to keep alive. The public profile page is read\nas a signed-out visitor sees it.\n\n## What one row looks like\n\n```json\n{\n  \"status\": \"ok\",\n  \"profileUrl\": \"https://www.linkedin.com/in/williamhgates\",\n  \"handle\": \"williamhgates\",\n  \"fullName\": \"Bill Gates\",\n  \"firstName\": \"Bill\",\n  \"lastName\": \"Gates\",\n  \"headline\": \"Chair, Gates Foundation and Founder, Breakthrough Energy\",\n  \"about\": \"Chair of the Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft. Voracious reader. Avid traveler. Active blogger.\",\n  \"badges\": \"Creator, Top Voice\",\n  \"currentCompany\": \"Gates Foundation\",\n  \"currentCompanyUrl\": \"https://www.linkedin.com/company/gates-foundation\",\n  \"currentCompanyStartYear\": 2000,\n  \"jobTitles\": [\"Co-chair\", \"Founder\", \"Co-founder\"],\n  \"companies\": [\n    {\"name\": \"Gates Foundation\", \"url\": \"https://www.linkedin.com/company/gates-foundation\", \"startYear\": 2000},\n    {\"name\": \"Breakthrough Energy\", \"url\": \"https://www.linkedin.com/company/breakthrough-energy\", \"startYear\": 2015},\n    {\"name\": \"Microsoft\", \"url\": \"https://www.linkedin.com/company/microsoft\", \"startYear\": 1975}\n  ],\n  \"schools\": [\n    {\"name\": \"Harvard University\", \"url\": \"https://www.linkedin.com/school/harvard-university/\", \"startYear\": 1973, \"endYear\": 1975}\n  ],\n  \"city\": \"Seattle, Washington, United States\",\n  \"country\": \"US\",\n  \"followers\": 40675985,\n  \"connections\": \"500+\",\n  \"languages\": [],\n  \"awards\": [],\n  \"photoUrl\": \"https://media.licdn.com/dms/image/...\",\n  \"maskedFields\": [],\n  \"error\": null,\n  \"scrapedAt\": \"2026-09-23T07:41:12+00:00\"\n}\n```\n\n25 fields. Views in the dataset tab: **Profiles**, **Lead list** (first name,\nlast name, company, location — the shape a CRM import wants), **Career**,\n**Audience**, **All fields**.\n\n## The two limits, stated up front\n\n**1. About one profile in five is refused.** LinkedIn answers some requests from\na datacenter address with a sign-in wall under HTTP 999. The run retries and\nmoves to a different address, and measured on 2026-09-23 four profiles in five\ncome back whole on the first pass. The fifth arrives as a row saying so:\n\n```json\n{\"status\": \"blocked\", \"profileUrl\": \"https://www.linkedin.com/in/someone\",\n \"error\": \"... answered 1530 bytes with no profile card in them ...\"}\n```\n\n**A refused profile is never charged.** Run the list again and the gaps usually\nfill; nothing is billed twice for the same person, because nothing was billed\nthe first time.\n\n**2. LinkedIn sometimes withholds a field.** The same page can come back with an\nemployer written as `********** ** *******`. The row never carries the\nasterisks — the field is empty and its name appears in `maskedFields`, so\n\"no employer\" and \"LinkedIn would not say\" stay different answers.\n\n## Input\n\n| field | what it does |\n|---|---|\n| **LinkedIn profiles** | one per line: `https://www.linkedin.com/in/satyanadella`, a country address like `de.linkedin.com/in/...`, or just `satyanadella` |\n| **Maximum profiles** | ceiling for one run |\n| **Minimum followers** | drop people below the bar **before** the row is stored, so they are never charged |\n| **Only profiles with a current employer** | drop students, retirees and profiles whose employer was withheld |\n| **Include refused profiles as rows** | on by default; turn off for a clean file |\n\nA company page pasted here is skipped with a note rather than failing the run —\ncompanies are a different listing.\n\n## What it does not do\n\n- **It does not log in**, so it sees exactly what a signed-out visitor sees: no\n  contact details, no email, no phone, no connection list.\n- **It does not search.** Give it addresses; finding people by keyword is a\n  different job.\n- **A name is not an address.** LinkedIn handles are not always the person's\n  name, and there is no lookup from one to the other without a search surface.\n\n## Free plan\n\nEverything works on the free plan: the same fields, the same limits. Refused and\nfiltered rows cost nothing there too.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "linkedin-profile-data-scraper",
      "title": "LinkedIn Profile Data Scraper",
      "description": "Public LinkedIn profiles by URL or handle: name, headline, About text, current employer with its LinkedIn page and start year, past organisations, schools with years, city, country, follower count and photo. No login, no cookie. A profile LinkedIn refuses comes back as a free row saying so.",
      "version": "0.1",
      "buildTag": "latest",
      "minMemoryMbytes": 256,
      "maxMemoryMbytes": 2048,
      "meta": {
        "templateId": "python-empty"
      },
      "dockerfile": "../Dockerfile",
      "readme": "# LinkedIn Profile Data Scraper\n\nPaste LinkedIn profile addresses, get one row per person: name, headline, the\nAbout text, the current employer **with its LinkedIn page and the year they\nstarted**, past organisations, schools with years, city, country, follower count\nand photo.\n\nNo account, no cookie, no session to keep alive. The public profile page is read\nas a signed-out visitor sees it.\n\n## What one row looks like\n\n```json\n{\n  \"status\": \"ok\",\n  \"profileUrl\": \"https://www.linkedin.com/in/williamhgates\",\n  \"handle\": \"williamhgates\",\n  \"fullName\": \"Bill Gates\",\n  \"firstName\": \"Bill\",\n  \"lastName\": \"Gates\",\n  \"headline\": \"Chair, Gates Foundation and Founder, Breakthrough Energy\",\n  \"about\": \"Chair of the Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft. Voracious reader. Avid traveler. Active blogger.\",\n  \"badges\": \"Creator, Top Voice\",\n  \"currentCompany\": \"Gates Foundation\",\n  \"currentCompanyUrl\": \"https://www.linkedin.com/company/gates-foundation\",\n  \"currentCompanyStartYear\": 2000,\n  \"jobTitles\": [\"Co-chair\", \"Founder\", \"Co-founder\"],\n  \"companies\": [\n    {\"name\": \"Gates Foundation\", \"url\": \"https://www.linkedin.com/company/gates-foundation\", \"startYear\": 2000},\n    {\"name\": \"Breakthrough Energy\", \"url\": \"https://www.linkedin.com/company/breakthrough-energy\", \"startYear\": 2015},\n    {\"name\": \"Microsoft\", \"url\": \"https://www.linkedin.com/company/microsoft\", \"startYear\": 1975}\n  ],\n  \"schools\": [\n    {\"name\": \"Harvard University\", \"url\": \"https://www.linkedin.com/school/harvard-university/\", \"startYear\": 1973, \"endYear\": 1975}\n  ],\n  \"city\": \"Seattle, Washington, United States\",\n  \"country\": \"US\",\n  \"followers\": 40675985,\n  \"connections\": \"500+\",\n  \"languages\": [],\n  \"awards\": [],\n  \"photoUrl\": \"https://media.licdn.com/dms/image/...\",\n  \"maskedFields\": [],\n  \"error\": null,\n  \"scrapedAt\": \"2026-09-23T07:41:12+00:00\"\n}\n```\n\n25 fields. Views in the dataset tab: **Profiles**, **Lead list** (first name,\nlast name, company, location — the shape a CRM import wants), **Career**,\n**Audience**, **All fields**.\n\n## The two limits, stated up front\n\n**1. About one profile in five is refused.** LinkedIn answers some requests from\na datacenter address with a sign-in wall under HTTP 999. The run retries and\nmoves to a different address, and measured on 2026-09-23 four profiles in five\ncome back whole on the first pass. The fifth arrives as a row saying so:\n\n```json\n{\"status\": \"blocked\", \"profileUrl\": \"https://www.linkedin.com/in/someone\",\n \"error\": \"... answered 1530 bytes with no profile card in them ...\"}\n```\n\n**A refused profile is never charged.** Run the list again and the gaps usually\nfill; nothing is billed twice for the same person, because nothing was billed\nthe first time.\n\n**2. LinkedIn sometimes withholds a field.** The same page can come back with an\nemployer written as `********** ** *******`. The row never carries the\nasterisks — the field is empty and its name appears in `maskedFields`, so\n\"no employer\" and \"LinkedIn would not say\" stay different answers.\n\n## Input\n\n| field | what it does |\n|---|---|\n| **LinkedIn profiles** | one per line: `https://www.linkedin.com/in/satyanadella`, a country address like `de.linkedin.com/in/...`, or just `satyanadella` |\n| **Maximum profiles** | ceiling for one run |\n| **Minimum followers** | drop people below the bar **before** the row is stored, so they are never charged |\n| **Only profiles with a current employer** | drop students, retirees and profiles whose employer was withheld |\n| **Include refused profiles as rows** | on by default; turn off for a clean file |\n\nA company page pasted here is skipped with a note rather than failing the run —\ncompanies are a different listing.\n\n## What it does not do\n\n- **It does not log in**, so it sees exactly what a signed-out visitor sees: no\n  contact details, no email, no phone, no connection list.\n- **It does not search.** Give it addresses; finding people by keyword is a\n  different job.\n- **A name is not an address.** LinkedIn handles are not always the person's\n  name, and there is no lookup from one to the other without a search surface.\n\n## Free plan\n\nEverything works on the free plan: the same fields, the same limits. Refused and\nfiltered rows cost nothing there too.\n",
      "input": {
        "title": "LinkedIn Profile Data Scraper",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "profiles": {
            "title": "LinkedIn profiles",
            "type": "array",
            "editor": "stringList",
            "description": "One per line. A profile link (`https://www.linkedin.com/in/satyanadella`), a country one (`https://de.linkedin.com/in/...`) or just the part after /in/ (`satyanadella`). A company page belongs in our company listing; pasted here it is skipped with a note, not charged.",
            "prefill": [
              "satyanadella",
              "williamhgates",
              "reidhoffman"
            ]
          },
          "maxProfiles": {
            "title": "Maximum profiles",
            "type": "integer",
            "description": "A ceiling on one run, counted in profiles read. Refused and filtered profiles are never charged, whatever this says.",
            "default": 100,
            "prefill": 3,
            "minimum": 1,
            "maximum": 200
          },
          "minFollowers": {
            "title": "Minimum followers",
            "type": "integer",
            "description": "Keep only people with at least this many followers. Judged from LinkedIn's own count before the row is stored, so a person below the bar is never charged. 0 keeps everybody.",
            "default": 0,
            "minimum": 0
          },
          "onlyWithCurrentCompany": {
            "title": "Only profiles with a current employer",
            "type": "boolean",
            "description": "Drop people whose page lists no current organisation - students, retirees, and the profiles LinkedIn withheld the employer of. Dropped rows are free.",
            "default": false
          },
          "includeFailedProfiles": {
            "title": "Include refused profiles as rows",
            "type": "boolean",
            "description": "On by default: a profile LinkedIn would not serve comes back as a row with `status: blocked` and the reason, so a list of five hundred can be re-run against the gaps. Free either way.",
            "default": true
          }
        },
        "required": [
          "profiles"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "LinkedIn profiles",
        "properties": {
          "overview": {
            "type": "string",
            "title": "Profiles",
            "template": "{{links.apiDefaultDatasetUrl}}/items?view=overview"
          },
          "leads": {
            "type": "string",
            "title": "Lead list",
            "template": "{{links.apiDefaultDatasetUrl}}/items?view=leads"
          },
          "career": {
            "type": "string",
            "title": "Career",
            "template": "{{links.apiDefaultDatasetUrl}}/items?view=career"
          },
          "audience": {
            "type": "string",
            "title": "Audience",
            "template": "{{links.apiDefaultDatasetUrl}}/items?view=audience"
          },
          "all": {
            "type": "string",
            "title": "All fields",
            "template": "{{links.apiDefaultDatasetUrl}}/items?view=all"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "fields": {},
          "views": {
            "overview": {
              "title": "Profiles",
              "transformation": {
                "fields": [
                  "fullName",
                  "headline",
                  "currentCompany",
                  "city",
                  "followers",
                  "profileUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "fullName": {
                    "label": "Name"
                  },
                  "headline": {
                    "label": "Headline"
                  },
                  "currentCompany": {
                    "label": "Company"
                  },
                  "city": {
                    "label": "Location"
                  },
                  "followers": {
                    "label": "Followers"
                  },
                  "profileUrl": {
                    "label": "Profile"
                  }
                }
              }
            },
            "leads": {
              "title": "Lead list",
              "transformation": {
                "fields": [
                  "firstName",
                  "lastName",
                  "headline",
                  "currentCompany",
                  "currentCompanyUrl",
                  "city",
                  "country",
                  "profileUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "firstName": {
                    "label": "First name"
                  },
                  "lastName": {
                    "label": "Last name"
                  },
                  "headline": {
                    "label": "Headline"
                  },
                  "currentCompany": {
                    "label": "Company"
                  },
                  "currentCompanyUrl": {
                    "label": "Company page"
                  },
                  "city": {
                    "label": "City"
                  },
                  "country": {
                    "label": "Country"
                  },
                  "profileUrl": {
                    "label": "Profile"
                  }
                }
              }
            },
            "career": {
              "title": "Career",
              "transformation": {
                "fields": [
                  "fullName",
                  "jobTitles",
                  "companies",
                  "schools",
                  "maskedFields"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "fullName": {
                    "label": "Name"
                  },
                  "jobTitles": {
                    "label": "Titles"
                  },
                  "companies": {
                    "label": "Organisations"
                  },
                  "schools": {
                    "label": "Education"
                  },
                  "maskedFields": {
                    "label": "Withheld by LinkedIn"
                  }
                }
              }
            },
            "audience": {
              "title": "Audience",
              "transformation": {
                "fields": [
                  "fullName",
                  "followers",
                  "connections",
                  "badges",
                  "about",
                  "photoUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "fullName": {
                    "label": "Name"
                  },
                  "followers": {
                    "label": "Followers"
                  },
                  "connections": {
                    "label": "Connections"
                  },
                  "badges": {
                    "label": "Badges"
                  },
                  "about": {
                    "label": "About"
                  },
                  "photoUrl": {
                    "label": "Photo"
                  }
                }
              }
            },
            "all": {
              "title": "All fields",
              "transformation": {},
              "display": {
                "component": "table"
              }
            }
          }
        },
        "keyValueStore": {
          "actorKeyValueStoreSchemaVersion": 1,
          "title": "Run storage",
          "description": "Input, plus a per-run summary: how many profiles were stored and charged, which addresses LinkedIn refused and which were not profile pages at all, which filter dropped how many, how many rows had a field withheld by LinkedIn, and whether the run had to move to the proxy.",
          "collections": {
            "input": {
              "title": "Input",
              "keyPrefix": "INPUT",
              "contentTypes": [
                "application/json"
              ]
            },
            "summary": {
              "title": "Run summary",
              "keyPrefix": "RUN_SUMMARY",
              "contentTypes": [
                "application/json"
              ]
            }
          }
        }
      }
    },
    "buildNumber": "0.0.5",
    "imageDigest": "6cc3ea221c3b0aaa5bf8be71d94893305b283e74d77b6bea7eca6c43ded2930f",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "0.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.017836666666666667
    }
  }
}