{
  "openapi": "3.0.1",
  "info": {
    "title": "LinkedIn Profile Scraper",
    "description": "Scrape complete LinkedIn profiles from URLs, usernames, or profile IDs. Work history, education, skills, certifications, current-company details, and optional business-email enrichment. Profiles are deduplicated across inputs. No LinkedIn login or cookies required.",
    "version": "1.0",
    "x-build-id": "JLGCe3YB7xfqhWxBd"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/coregent~linkedin-people-search-profile-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-coregent-linkedin-people-search-profile-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/coregent~linkedin-people-search-profile-scraper/runs": {
      "post": {
        "operationId": "runs-sync-coregent-linkedin-people-search-profile-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/coregent~linkedin-people-search-profile-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-coregent-linkedin-people-search-profile-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "profiles": {
            "title": "LinkedIn profiles",
            "type": "array",
            "description": "Paste any mix of full profile URLs (\"https://www.linkedin.com/in/example-user/\"), usernames / public identifiers (\"example-user\"), or LinkedIn internal profile IDs (\"ACoAAA8BYqEBCGLg...\"). The type of each entry is detected automatically, equivalent entries are merged, and malformed entries are reported and skipped without stopping the run.\n\nURLs and usernames are read from LinkedIn's public profile pages, which costs nothing upstream. Profile IDs are not resolvable as URLs, so those always use the metered provider.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxProfiles": {
            "title": "Maximum profiles",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Maximum number of unique people to save. A global run limit. Duplicates and profiles removed by filters do not count towards it and are never charged.",
            "default": 100
          },
          "currentJobTitles": {
            "title": "Current job titles",
            "type": "array",
            "description": "Keep only people whose CURRENT title matches any of these, matched on title and headline.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Keep only people in any of these locations, matched against the location text on their profile.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "pastJobTitles": {
            "title": "Past job titles",
            "type": "array",
            "description": "Keep only people who previously held any of these titles, matched against their work history. Requires Full profile data.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "pastCompanies": {
            "title": "Past companies",
            "type": "array",
            "description": "Keep only people who previously worked at any of these companies, matched against their work history. Requires Full profile data.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "industries": {
            "title": "Industries",
            "type": "array",
            "description": "Keep only people whose current employer is in any of these industries. Requires Include current company details.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "schools": {
            "title": "Schools",
            "type": "array",
            "description": "Match people who attended any of these schools. Accepts school or university names, LinkedIn school URLs, or school IDs. Where LinkedIn cannot filter on this directly it is applied after extraction and requires Full profile data.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "minimumYearsExperience": {
            "title": "Minimum years of experience",
            "minimum": 0,
            "maximum": 60,
            "type": "integer",
            "description": "Only keep people with at least this much total work experience. Computed from the work history, counting overlapping roles once. Requires Full profile data — in Basic mode there is no work history to measure, so this filter is ignored and the run warns you."
          },
          "maximumYearsExperience": {
            "title": "Maximum years of experience",
            "minimum": 0,
            "maximum": 60,
            "type": "integer",
            "description": "Only keep people with at most this much total work experience. Requires Full profile data; ignored in Basic mode."
          },
          "minimumYearsAtCurrentCompany": {
            "title": "Minimum years at current company",
            "minimum": 0,
            "maximum": 60,
            "type": "integer",
            "description": "Only keep people who have been at their current company for at least this long. Requires Full profile data, because the current role's start date is not in the search results; ignored in Basic mode."
          },
          "maximumYearsAtCurrentCompany": {
            "title": "Maximum years at current company",
            "minimum": 0,
            "maximum": 60,
            "type": "integer",
            "description": "Only keep people who have been at their current company for at most this long — useful for finding recent movers. Requires Full profile data; ignored in Basic mode."
          },
          "includeKeywords": {
            "title": "Must contain keywords",
            "type": "array",
            "description": "Only keep people whose profile text contains at least one of these. Matched case-insensitively against the headline, about section, current title, skills and work-history titles. A person whose profile could not be read at all is kept rather than dropped.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "type": "array",
            "description": "Drop people whose profile text contains any of these. Applied conservatively — matched on whole words, so excluding 'AI' does not drop someone called 'Said'.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeCurrentCompanies": {
            "title": "Exclude current companies",
            "type": "array",
            "description": "Drop people who currently work at any of these companies. Accepts names, LinkedIn company URLs, or company IDs. Applied before any profile page is opened, so excluded people cost nothing.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeJobTitles": {
            "title": "Exclude job titles",
            "type": "array",
            "description": "Drop people whose current title contains any of these words — for example 'Recruiter', 'Talent Acquisition'. Matched case-insensitively, and applied before any profile page is opened, so excluded people cost nothing.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "includeCurrentCompanyDetails": {
            "title": "Include current company details",
            "type": "boolean",
            "description": "Add the person's current employer: website, domain, industry, company size, employee count, company type, headquarters, offices, founding year, description and logo. Each unique company is looked up once per run and charged once — 100 people at one company is a single company charge, not 100. Failed or blocked lookups return the person without company data and are never charged.",
            "default": false
          },
          "findEmail": {
            "title": "Find business email",
            "type": "boolean",
            "description": "Extract a business email address for each unique person. Two sources, and the output records which via contact.source.\n\nFREE: an address published in the public LinkedIn text this Actor already reads — their About section or their employer's description. Costs nothing and is never charged. Most people publish no address.\n\nPAID (requires a PAID Apify plan — on the Free plan this step is skipped entirely, nothing is charged, and the free extraction above still runs): the person's name and their employer's mail domain are sent to a third-party email finder. That provider is NOT LinkedIn, and such an address is labelled contact.source 'enrichment'. You are charged ONLY when the provider returns an address it has CONFIRMED to be deliverable.\n\nUNCONFIRMED ADDRESSES ARE DISCARDED, NOT RETURNED. Many large employers run mail gateways that accept every recipient, so no provider can confirm whether a mailbox exists there — and a provider asked about such a domain will return a pattern-derived address for any name at all, including one belonging to nobody. Those are dropped rather than handed to you, and never charged. The consequence is real: expect an empty email column for a substantial share of people at large enterprises, by design.\n\nEach unique person is looked up at most once per run. Duplicates, filtered profiles and skip-list matches are never looked up. People whose employer domain we could not resolve cannot be looked up at all — the run log reports how many.",
            "default": false
          },
          "removeDuplicates": {
            "title": "Remove duplicate people",
            "type": "boolean",
            "description": "Return each person once, even when several searches find them or you also supply their profile directly. Matched on LinkedIn profile ID first, then public identifier, then profile URL. Every search that matched a person is preserved in matchedSearches, and merging never causes a second charge.",
            "default": true
          },
          "skipProfileIds": {
            "title": "Skip profile IDs",
            "type": "array",
            "description": "LinkedIn internal profile IDs to skip — for example 'ACoAAA123...'. Matched people are not extracted, not enriched, not saved and never charged. Entries are cross-matched against all three skip lists, so a URL pasted here still works.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "skipPublicIdentifiers": {
            "title": "Skip usernames",
            "type": "array",
            "description": "Public identifiers / usernames to skip — for example 'john-smith'. Matched people are never extracted, enriched, saved or charged.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "skipProfileUrls": {
            "title": "Skip profile URLs",
            "type": "array",
            "description": "Full LinkedIn profile URLs to skip. Matched people are never extracted, enriched, saved or charged.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Datacenter proxy is the default, and is what this Actor uses.\n\nRESIDENTIAL IS NOT USED, even if you select it. LinkedIn blocks a large share of public profile requests regardless of proxy type: measured across datacenter, residential, and residential with a regenerated browser fingerprint, the identical set of profiles was blocked every time — LinkedIn decides per profile, not per requester. Selecting residential would therefore cost bandwidth without changing a single result, so the Actor falls back to datacenter and says so in the log.\n\nBlocked profiles still produce a result, recovered through a paid data provider, though that version carries fewer sections.\n\nCUSTOM PROXY URLS: if you supply your own provider it is used in full, through your own proxy account. That is the supported way to control which IPs are used.\n\nNO PROXY: honoured as-is.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}