LinkedIn Jobs Scraper
Pricing
from $0.60 / 1,000 job delivereds
LinkedIn Jobs Scraper
Export LinkedIn jobs with company enrichment, CV keyword matching, applicant counts and annualised salary. No login, no cookie, no proxy needed.
LinkedIn Jobs Scraper
Pricing
from $0.60 / 1,000 job delivereds
Export LinkedIn jobs with company enrichment, CV keyword matching, applicant counts and annualised salary. No login, no cookie, no proxy needed.
You can access the LinkedIn Jobs Scraper programmatically from your own applications by using the Apify API. You can also choose the language preference from below. To use the Apify API, you’ll need an Apify account and your API token, found in API & Integrations in Apify Console.
{ "openapi": "3.0.1", "info": { "version": "0.1", "x-build-id": "6gPZhYYIofCZSnrYc" }, "servers": [ { "url": "https://api.apify.com/v2" } ], "paths": { "/acts/spookyweb~linkedin-jobs/run-sync-get-dataset-items": { "post": { "operationId": "run-sync-get-dataset-items-spookyweb-linkedin-jobs", "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/spookyweb~linkedin-jobs/runs": { "post": { "operationId": "runs-sync-spookyweb-linkedin-jobs", "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/spookyweb~linkedin-jobs/run-sync": { "post": { "operationId": "run-sync-spookyweb-linkedin-jobs", "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": { "keywords": { "title": "Keywords", "type": "string", "description": "Job title or keywords, for example software engineer." }, "location": { "title": "Location", "type": "string", "description": "City, region or country, for example London." }, "datePosted": { "title": "Posted within", "enum": [ "any", "day", "week", "month" ], "type": "string", "description": "How recently the job was posted. Use day, week or month to restrict to that window, or any to return everything LinkedIn still lists.", "default": "any" }, "workplaceType": { "title": "Workplace type", "enum": [ "any", "onsite", "remote", "hybrid" ], "type": "string", "description": "Where the work is done, as LinkedIn classifies it: onsite, remote or hybrid. Use any to include all three.", "default": "any" }, "jobType": { "title": "Job type", "enum": [ "any", "full-time", "part-time", "contract", "temporary", "internship", "volunteer" ], "type": "string", "description": "The contract basis of the role, for example full-time, contract or internship. Use any to include every basis LinkedIn lists.", "default": "any" }, "experienceLevel": { "title": "Experience level", "enum": [ "any", "internship", "entry", "associate", "mid-senior", "director", "executive" ], "type": "string", "description": "Seniority band as LinkedIn defines it, from entry and associate up to director and executive. Use any to include every level.", "default": "any" }, "sortBy": { "title": "Sort by", "enum": [ "relevance", "date" ], "type": "string", "description": "Result ordering. relevance uses LinkedIn own ranking, date returns the most recently posted first, which is what you want when monitoring for new listings.", "default": "relevance" }, "maxResults": { "title": "Max jobs", "minimum": 1, "maximum": 1000, "type": "integer", "description": "Hard cap. LinkedIn serves at most 1000 per search. Each job is one billable result.", "default": 100 }, "companyInclude": { "title": "Only these companies", "type": "array", "description": "Keep only jobs from these employers. Company suffixes and case are ignored.", "items": { "type": "string" } }, "companyExclude": { "title": "Exclude these companies", "type": "array", "description": "Employer names to drop from the results, matched on the company name as LinkedIn displays it. Useful for filtering out staffing agencies or your own listings.", "items": { "type": "string" } }, "excludeRecruitingAgencies": { "title": "Exclude recruitment agencies", "type": "boolean", "description": "Drop listings posted by agencies rather than the employer. Useful because LinkedIn carries far more direct employer posts than agency ones.", "default": false }, "enrichCompanyData": { "title": "Enrich company data", "type": "boolean", "description": "Fetch each company page for employee count, followers, industry, website and location. Costs one extra request per company, cached within a run.", "default": false }, "companySizeMin": { "title": "Min employees", "type": "integer", "description": "Only companies with at least this many employees. Enables company enrichment." }, "companySizeMax": { "title": "Max employees", "type": "integer", "description": "Only companies with at most this many employees." }, "companyFollowersMin": { "title": "Min LinkedIn followers", "type": "integer", "description": "Only companies with at least this many followers." }, "companyFollowersMax": { "title": "Max LinkedIn followers", "type": "integer", "description": "Only companies with at most this many followers." }, "excludeJobTitles": { "title": "Exclude job titles containing", "type": "array", "description": "Drop jobs whose title contains any of these words.", "items": { "type": "string" } }, "maxApplicants": { "title": "Max applicants", "type": "integer", "description": "Only jobs with an exact applicant count at or below this. Jobs showing \"first 25\" are excluded because their real count is unknown." }, "requireSalaryInfo": { "title": "Must state pay", "type": "boolean", "description": "Only jobs that disclose a salary or an NHS pay band. Enables detail fetching.", "default": false }, "resumeKeywords": { "title": "CV or skill keywords", "type": "array", "description": "Paste your skills. Each job is scored on how many appear in the title and description, returned as keywordMatchScore with matched and unmatched lists. Enables detail fetching.", "items": { "type": "string" } }, "minKeywordScore": { "title": "Minimum match score", "minimum": 0, "maximum": 100, "type": "integer", "description": "Drop jobs scoring below this percentage against your keywords." }, "fetchDetails": { "title": "Always fetch full details", "type": "boolean", "description": "Fetch every job detail page for seniority, employment type, function, industries, description, applicant count and apply type. Turned on automatically when a filter needs it.", "default": false }, "proxyConfiguration": { "title": "Proxy configuration", "type": "object", "description": "Optional. The guest endpoints need no proxy, but one helps at high volume from a single IP." }, "underTenApplicants": { "title": "Under 10 applicants only", "type": "boolean", "description": "Uses LinkedIn own low-competition filter, applied server side so it costs no extra requests. Note LinkedIn does not reveal exact counts below 25, so results show \"first 25\" rather than the true figure.", "default": false }, "easyApplyOnly": { "title": "Easy Apply only", "type": "boolean", "description": "Only jobs you can apply to without leaving LinkedIn. Applied server side by LinkedIn.", "default": false }, "jobFunctionInclude": { "title": "Only these job functions", "type": "array", "description": "Keep only jobs whose LinkedIn job function matches, for example Engineering or Finance.", "items": { "type": "string" } }, "jobIndustryInclude": { "title": "Only these industries", "type": "array", "description": "Keep only jobs in these industries, named as LinkedIn labels them. Leave empty to accept every industry.", "items": { "type": "string" } }, "jobIndustryExclude": { "title": "Exclude these industries", "type": "array", "description": "Drop jobs in these industries, named as LinkedIn labels them. Applied after the include list, so an industry named in both is excluded.", "items": { "type": "string" } }, "salaryMin": { "title": "Minimum salary", "type": "integer", "description": "Minimum annual equivalent pay. Hourly and daily rates are annualised first so they are compared fairly." }, "salaryMax": { "title": "Maximum salary", "type": "integer", "description": "Upper bound on pay, as an annual equivalent in the currency the job advertises. Jobs that publish no salary are kept, because most listings omit it." }, "concurrency": { "title": "Requests in flight", "minimum": 1, "maximum": 10, "type": "integer", "description": "How many detail and company pages to fetch at once. Does not change how many requests are made, only how long the run takes.", "default": 6 }, "strictFilters": { "title": "Reject jobs a filter could not evaluate", "type": "boolean", "description": "By default a job is kept when a lookup fails, so a network problem is not mistaken for a filter decision. Turn this on to reject those instead.", "default": false } } }, "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 } } } } } } } } }}OpenAPI is a standard for designing and describing RESTful APIs, allowing developers to define API structure, endpoints, and data formats in a machine-readable way. It simplifies API development, integration, and documentation.
OpenAPI is effective when used with AI agents and GPTs by standardizing how these systems interact with various APIs, for reliable integrations and efficient communication.
By defining machine-readable API specifications, OpenAPI allows AI models like GPTs to understand and use varied data sources, improving accuracy. This accelerates development, reduces errors, and provides context-aware responses, making OpenAPI a core component for AI applications.
You can download the OpenAPI definitions for LinkedIn Jobs Scraper from the options below:
If you’d like to learn more about how OpenAPI powers GPTs, read our blog post.
You can also check out our other API clients: