{
  "openapi": "3.0.1",
  "info": {
    "title": "LinkedIn Jobs Scraper",
    "description": "Scrape LinkedIn jobs from keywords and locations or search URLs, no login needed. Get full descriptions, seniority, employment type, industries, declared salary, real posting dates, applicant counts, recruiter cards and company profiles. Schedule it to return only new jobs. $0.60 per 1,000 jobs.",
    "version": "1.0",
    "x-build-id": "mCq8vHVULSDXE1xcp"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/boncross~linkedin-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-boncross-linkedin-jobs-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/boncross~linkedin-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-boncross-linkedin-jobs-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/boncross~linkedin-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-boncross-linkedin-jobs-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": {
          "keywords": {
            "title": "Search keywords",
            "type": "array",
            "description": "One search per entry, for example \"paralegal\" or \"compliance analyst\". Results are deduplicated across searches. Leave this empty if you give start URLs instead.",
            "items": {
              "type": "string"
            }
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "The default location, written as you would type it into LinkedIn, such as \"London, United Kingdom\". Ignored when the locations list is set."
          },
          "locations": {
            "title": "Locations (multiple)",
            "type": "array",
            "description": "Optional list. Every keyword runs against each of these and the results are deduplicated. Splitting a country into its cities is how you get past LinkedIn's ceiling of about 1,000 results per search.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "distance": {
            "title": "Search radius (miles)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Radius around the location in miles, as on LinkedIn. 0 uses LinkedIn's default.",
            "default": 0
          },
          "startUrls": {
            "title": "Start URLs (advanced)",
            "type": "array",
            "description": "Optional. Paste full LinkedIn job-search URLs. Date-posted, company, Easy Apply and under-10-applicants filters are kept. The experience, job-type and workplace filters LinkedIn dropped are turned into keyword terms.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "maxResultsPerSearch": {
            "title": "Max results per search",
            "minimum": 10,
            "maximum": 1000,
            "type": "integer",
            "description": "Ceiling per keyword or URL. The search stops earlier when LinkedIn runs out of matches for your window. LinkedIn serves at most about 1,000 per search.",
            "default": 100
          },
          "maxItems": {
            "title": "Maximum results for the whole run",
            "minimum": 0,
            "type": "integer",
            "description": "A run-wide ceiling across every target. The per-target limit above applies to each one separately, so ten targets at 50 each returns 500; set this to cap the total. Zero means no run-wide limit. Rows that report an input the actor could not resolve are not counted here and are never charged for.",
            "default": 0
          },
          "datePosted": {
            "title": "Date posted",
            "enum": [
              "past24h",
              "pastWeek",
              "pastMonth",
              "any"
            ],
            "type": "string",
            "description": "Only return jobs posted within this window. It is sent to LinkedIn as a real filter, so you do not pay for stale results.",
            "default": "past24h"
          },
          "postedWithinHours": {
            "title": "Posted within the last N hours",
            "minimum": 0,
            "maximum": 720,
            "type": "integer",
            "description": "A finer window than the presets: 6 for a run every six hours, 1 for hourly. Overrides date posted when set. LinkedIn honours any number of hours.",
            "default": 0
          },
          "sortBy": {
            "title": "Sort",
            "enum": [
              "date",
              "relevance"
            ],
            "type": "string",
            "description": "Most recent first, or the order LinkedIn returned. LinkedIn no longer sorts the public job search, so \"Most recent\" is applied to the results after they are collected: it orders what the run fetched, it cannot change which jobs LinkedIn selects.",
            "default": "date"
          },
          "experienceLevels": {
            "title": "Experience level",
            "type": "array",
            "description": "Experience level. Since August 2026 LinkedIn no longer filters on this, so it is added to your search terms instead. That steers results strongly but is not exact, and it narrows the pool. For exact results pair it with \"Seniority levels\" below.",
            "items": {
              "type": "string",
              "enum": [
                "internship",
                "entry",
                "associate",
                "mid-senior",
                "director",
                "executive"
              ],
              "enumTitles": [
                "Internship",
                "Entry level",
                "Associate",
                "Mid-Senior level",
                "Director",
                "Executive"
              ]
            },
            "default": []
          },
          "jobTypes": {
            "title": "Job type",
            "type": "array",
            "description": "Job type. Since August 2026 LinkedIn no longer filters on this, so it is added to your search terms instead. That steers results strongly but is not exact, and it narrows the pool. For exact results pair it with \"Employment types\" below.",
            "items": {
              "type": "string",
              "enum": [
                "full-time",
                "part-time",
                "contract",
                "temporary",
                "internship",
                "volunteer",
                "other"
              ],
              "enumTitles": [
                "Full-time",
                "Part-time",
                "Contract",
                "Temporary",
                "Internship",
                "Volunteer",
                "Other"
              ]
            },
            "default": []
          },
          "workplaceTypes": {
            "title": "Workplace type",
            "type": "array",
            "description": "Workplace type. Since August 2026 LinkedIn no longer filters on this, so it is added to your search terms instead. In testing this raised remote roles from about 1 in 9 to about 11 in 15, but it is not exact and it narrows the pool.",
            "items": {
              "type": "string",
              "enum": [
                "on-site",
                "remote",
                "hybrid"
              ],
              "enumTitles": [
                "On-site",
                "Remote",
                "Hybrid"
              ]
            },
            "default": []
          },
          "under10Applicants": {
            "title": "Under 10 applicants only",
            "type": "boolean",
            "description": "LinkedIn's own \"under 10 applicants\" filter, applied as a real URL filter.",
            "default": false
          },
          "easyApply": {
            "title": "Easy Apply only",
            "type": "boolean",
            "description": "LinkedIn's own Easy Apply filter, applied as a real URL filter.",
            "default": false
          },
          "companyIds": {
            "title": "Company IDs",
            "type": "array",
            "description": "Optional numeric LinkedIn company ids to restrict the search to. Applied as a real URL filter. If you do not know the ids, use Company names above instead.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "companyNames": {
            "title": "Company names",
            "type": "array",
            "description": "Company names to restrict the search to, e.g. \"Monzo\". Each is resolved to the numeric LinkedIn id that the company filter needs, so you do not have to find ids yourself. The run log shows what every name resolved to, and lists the other candidates it matched, because names are not unique. Resolution costs one lookup per name and is paced, so keep the list short.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "seniorityLevelsFilter": {
            "title": "Keep only these seniority levels",
            "type": "array",
            "description": "A real filter on the seniority label printed on the job page (Internship, Entry level, Associate, Mid-Senior level, Director, Executive, Not Applicable). It runs after the detail fetch, so those jobs are still charged as details.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "employmentTypesFilter": {
            "title": "Keep only these employment types",
            "type": "array",
            "description": "Filter on the employment-type label from the job page (Full-time, Part-time, Contract, Temporary, Internship, Volunteer, Other). Runs after the detail fetch.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxApplicants": {
            "title": "Max applicants",
            "minimum": 0,
            "type": "integer",
            "description": "Drop jobs with more applicants than this, for example 25. Finer than LinkedIn's under-10 toggle. Runs after the detail fetch.",
            "default": 0
          },
          "minAnnualSalary": {
            "title": "Minimum annual salary",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only jobs whose declared yearly pay reaches this. Needs \"Fetch job details\" on. A job that states no pay, or only an hourly or daily rate, is kept rather than dropped.",
            "default": 0
          },
          "titleInclude": {
            "title": "Title must contain (any of)",
            "type": "array",
            "description": "Optional, case-insensitive. Jobs whose title contains none of these are dropped before the detail page is fetched, so you are not charged a detail for them.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "titleExclude": {
            "title": "Title must not contain",
            "type": "array",
            "description": "Optional, case-insensitive. Handy for cutting agency noise, for example \"recruitment consultant\" or \"sales\".",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "companyExclude": {
            "title": "Exclude companies",
            "type": "array",
            "description": "Case-insensitive substrings matched against the company name before the detail fetch, so these cost only the scan rate.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "descriptionInclude": {
            "title": "Description must contain (any of)",
            "type": "array",
            "description": "Case-insensitive substrings the full description must contain. Runs after the detail fetch.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "descriptionExclude": {
            "title": "Description must not contain",
            "type": "array",
            "description": "Case-insensitive substrings that drop a job, for example \"security clearance\" or \"driving licence\". Runs after the detail fetch.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeStaffingAgencies": {
            "title": "Exclude staffing agencies",
            "type": "boolean",
            "description": "Needs company details switched on. Drops jobs whose company industry is Staffing and Recruiting.",
            "default": false
          },
          "fetchDetails": {
            "title": "Fetch job details",
            "type": "boolean",
            "description": "Fetch each job's page for the full description, seniority, employment type, industries and pay when the employer states it. Turn it off for a cheap listing-only run.",
            "default": true
          },
          "fetchFullJobPage": {
            "title": "Read the full job page",
            "type": "boolean",
            "description": "Reads each job's full LinkedIn page instead of the short advert. The columns are the same; the difference is the seniority level, which names a real level on far more jobs (in a London check of 1,100 jobs, \"Not Applicable\" fell from 580 to 125). Runs are about 45% slower. Declared pay is included either way. Needs \"Fetch job details\" on.",
            "default": false
          },
          "scrapeCompany": {
            "title": "Scrape company details",
            "type": "boolean",
            "description": "Also fetch each unique company's public LinkedIn page for description, website, industry, size, headquarters, type, founding year and specialities. One extra request per company rather than per job, cached within the run.",
            "default": false
          },
          "maxNewJobs": {
            "title": "Max jobs to return",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many jobs have been returned. 0 means no cap.",
            "default": 0
          },
          "dedupStoreName": {
            "title": "Only new jobs (dedup store name)",
            "type": "string",
            "description": "Name a key-value store, for example \"linkedin-seen\", and the actor remembers every job id it has returned. On later runs those jobs are skipped before the detail fetch, so a scheduled run gives you only what is new.",
            "default": ""
          },
          "companyCacheDays": {
            "title": "Company cache (days)",
            "minimum": 0,
            "maximum": 365,
            "type": "integer",
            "description": "With a dedup store set, company details fetched within this many days are reused rather than fetched again.",
            "default": 30
          },
          "geoId": {
            "title": "LinkedIn geo ID (advanced)",
            "type": "string",
            "description": "LinkedIn's numeric location id, such as 102257491 for London. More precise than the location text. Ignored when the locations list has more than one entry.",
            "default": ""
          },
          "maxConcurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many requests run at once across the whole run. The default is the fastest level measured clean; lower it only if a run reports refusals or errors.",
            "default": 8
          },
          "delayMs": {
            "title": "Delay between requests (ms)",
            "minimum": 0,
            "maximum": 20000,
            "type": "integer",
            "description": "Extra pause before each request, jittered by about 30 percent either way. The run already keeps to a request rate measured safe for LinkedIn, so the default is 0; raise it only if a run reports refusals.",
            "default": 0
          },
          "restartAttempt": {
            "title": "Restart attempt (internal)",
            "type": "integer",
            "description": "Set by the actor when it restarts itself in a fresh container after being refused. Leave it alone.",
            "default": 0
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}