{
  "openapi": "3.0.1",
  "info": {
    "title": "LinkedIn Jobs Scraper — Filter-Based, No Login",
    "description": "Scrape LinkedIn jobs from public guest pages with friendly filters — no URL building, no login. Complete public job + company data, dedup + repost detection, a 1000-result-cap workaround, and an incremental \"new jobs since last run\" monitor. Excludes recruiter personal data by design.",
    "version": "1.0",
    "x-build-id": "KGwMRokJGKkqrrrEM"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapesage~linkedin-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapesage-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/scrapesage~linkedin-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapesage-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/scrapesage~linkedin-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapesage-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": "Keywords",
            "type": "string",
            "description": "Job title / keywords. Supports boolean operators in UPPERCASE and \"exact phrases\", e.g. python AND django, \"product manager\", developer NOT senior."
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "Plain-text location, e.g. \"United States\", \"London\", \"Berlin\". Works on its own; pair it with a Geo ID for precision."
          },
          "geoId": {
            "title": "Geo ID (optional)",
            "type": "string",
            "description": "Numeric LinkedIn geo id (the tail of urn:li:geo:<id>). Overrides location precision. Examples: United States 103644278, United Kingdom 101165590, Worldwide 92000000, London 102257491, San Francisco Bay Area 90000084."
          },
          "datePosted": {
            "title": "Date posted",
            "enum": [
              "any",
              "pastHour",
              "past24h",
              "pastWeek",
              "pastMonth"
            ],
            "type": "string",
            "description": "How recently the job was posted.",
            "default": "any"
          },
          "workplaceType": {
            "title": "Workplace type",
            "type": "array",
            "description": "On-site, remote, and/or hybrid. Select any combination.",
            "items": {
              "type": "string",
              "enum": [
                "onsite",
                "remote",
                "hybrid"
              ],
              "enumTitles": [
                "On-site",
                "Remote",
                "Hybrid"
              ]
            },
            "default": []
          },
          "jobType": {
            "title": "Job type",
            "type": "array",
            "description": "Employment type. Select any combination.",
            "items": {
              "type": "string",
              "enum": [
                "fulltime",
                "parttime",
                "contract",
                "temporary",
                "internship",
                "volunteer",
                "other"
              ],
              "enumTitles": [
                "Full-time",
                "Part-time",
                "Contract",
                "Temporary",
                "Internship",
                "Volunteer",
                "Other"
              ]
            },
            "default": []
          },
          "experienceLevel": {
            "title": "Experience level",
            "type": "array",
            "description": "Seniority. Select any combination.",
            "items": {
              "type": "string",
              "enum": [
                "internship",
                "entry",
                "associate",
                "midsenior",
                "director",
                "executive"
              ],
              "enumTitles": [
                "Internship",
                "Entry level",
                "Associate",
                "Mid-Senior level",
                "Director",
                "Executive"
              ]
            },
            "default": []
          },
          "salaryBucket": {
            "title": "Minimum salary (USD)",
            "enum": [
              "any",
              "40k",
              "60k",
              "80k",
              "100k",
              "120k",
              "140k",
              "160k",
              "180k",
              "200k"
            ],
            "type": "string",
            "description": "Filter to jobs that publicly state at least this base salary. US-market oriented; sharply reduces result counts because most postings don't expose salary.",
            "default": "any"
          },
          "companyIds": {
            "title": "Company IDs (optional)",
            "type": "array",
            "description": "Restrict to specific companies by numeric LinkedIn company id (f_C). One id per line.",
            "items": {
              "type": "string"
            }
          },
          "distanceMiles": {
            "title": "Distance (miles)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Search radius around the location/geo id. Common values: 10, 25, 50, 100."
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "relevance",
              "date"
            ],
            "type": "string",
            "description": "Relevance (LinkedIn default) or most recent first. Incremental mode always uses most-recent internally.",
            "default": "relevance"
          },
          "searchUrls": {
            "title": "Search URLs",
            "type": "array",
            "description": "Raw LinkedIn public job-search URLs, one per line.",
            "items": {
              "type": "string"
            }
          },
          "scrapeJobDetails": {
            "title": "Scrape job detail pages",
            "type": "boolean",
            "description": "Fetch each job's detail page for the full description, criteria (seniority, employment type, job function, industries), apply URL, applicant count, salary, and validity dates. One extra request per job. Turn off for a faster, card-only run.",
            "default": true
          },
          "scrapeCompanyDetails": {
            "title": "Scrape company details",
            "type": "boolean",
            "description": "Also fetch each company's public page for business data (website, description, employee count/range, industries, HQ address, followers). Extra requests. Company data only — never personal data.",
            "default": false
          },
          "maxJobs": {
            "title": "Max jobs (overall)",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on total job results across all searches. Leave empty for no overall cap. Prefilled to 100 so the example/automated run finishes fast — raise it (or clear it) for a full pull."
          },
          "maxJobsPerSearch": {
            "title": "Max jobs per search",
            "minimum": 1,
            "type": "integer",
            "description": "Cap per individual search (per city/window when splitting). Leave empty for no per-search cap."
          },
          "splitByLocation": {
            "title": "Split by location (per city)",
            "type": "boolean",
            "description": "Break a country-wide search into per-city searches. Requires a Split country below.",
            "default": false
          },
          "splitCountry": {
            "title": "Split country",
            "enum": [
              "US",
              "GB",
              "CA",
              "DE",
              "IN",
              "AU",
              "FR",
              "NL",
              "IE",
              "ES"
            ],
            "type": "string",
            "description": "Country whose major cities are used when 'Split by location' is on."
          },
          "splitByDateWindow": {
            "title": "Split by date window",
            "type": "boolean",
            "description": "Alternative cap workaround: run the search across several recency windows (24h / week / month) and dedupe. Note: LinkedIn's date filter is cumulative, so this mainly improves fresh-first coverage rather than guaranteeing >1000 — location split is the reliable lever.",
            "default": false
          },
          "incrementalMode": {
            "title": "Incremental mode",
            "type": "boolean",
            "description": "Only return jobs not seen on a previous run (matched by Monitor key).",
            "default": false
          },
          "monitorKey": {
            "title": "Monitor key",
            "type": "string",
            "description": "A stable name for this monitor (e.g. \"react-devs-london\"). State (seen job ids + watermarks) persists across runs under this key. Required when Incremental mode is on."
          },
          "firstRunLookback": {
            "title": "First-run lookback",
            "enum": [
              "past24h",
              "pastWeek",
              "pastMonth"
            ],
            "type": "string",
            "description": "On the very first run of a monitor, how far back to seed. Subsequent runs return only new jobs.",
            "default": "pastWeek"
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Parallel requests. 12 is tested safe on Residential; raise toward 20 only if blocks stay at zero in the run summary.",
            "default": 12
          },
          "maxRequestsPerMinute": {
            "title": "Max requests per minute",
            "minimum": 1,
            "maximum": 300,
            "type": "integer",
            "description": "Global rate limit. 240 is tested block-free on Residential and ~4x faster than a polite crawl; lower it if you ever see blocks, raise toward 300 if you don't.",
            "default": 240
          },
          "searchConcurrency": {
            "title": "Parallel searches",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "How many searches to run at once when you split by location/date. Each search is still paged completely; running several in parallel fills the request-rate budget instead of stacking end-to-end. Has no effect on a single (un-split) search. The global rate limit above is the real ceiling, so 4 is plenty; lower it to 1 if parallel runs draw blocks.",
            "default": 4
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxy settings. Apify Residential is strongly recommended — datacenter IPs get blocked by LinkedIn almost immediately.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          },
          "debugDumpDetailHtml": {
            "title": "Dump one raw detail-page HTML (debug)",
            "type": "boolean",
            "description": "Diagnostic only. Saves the raw HTML of the first job-detail page to the run's key-value store under DEBUG_DETAIL_HTML, so selector coverage can be checked against real markup. Leave off for normal runs.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}