{
  "openapi": "3.0.1",
  "info": {
    "title": "LinkedIn Jobs Scraper — Remote Jobs, No Login | $0.50/1k",
    "description": "Scrape LinkedIn job postings without an account: title, company, location, date posted, salary, seniority, employment type, industries, applicants and the full description. Keyword, location, company and date filters.",
    "version": "0.1",
    "x-build-id": "i7LJpfcYcyHviY55x"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/glasswing~linkedin-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-glasswing-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/glasswing~linkedin-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-glasswing-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/glasswing~linkedin-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-glasswing-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": "Job titles or keywords",
            "type": "array",
            "description": "What you would type into LinkedIn's job search, one per line (e.g. `software engineer`, `registered nurse`, `sales manager`). Each keyword is a separate search in every location below; a job found by several searches is returned once. Leave empty to list every job in the locations.",
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Where to search, one per line, the way you would type it on LinkedIn: a country (`United States`, `Germany`), a region (`California, United States`) or a city (`London, England, United Kingdom`, `Berlin`). Each location is searched separately. Empty = worldwide.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "LinkedIn job-search URLs",
            "uniqueItems": true,
            "type": "array",
            "description": "Search result pages copied from your browser (https://www.linkedin.com/jobs/search/?keywords=...&location=...), from any country site; every filter in the URL is kept. Job pages (https://www.linkedin.com/jobs/view/...) and bare job ids work too. The example is skipped automatically as soon as you fill in keywords, locations or companies.",
            "default": [
              "https://www.linkedin.com/jobs/search/?keywords=software%20engineer&location=United%20States"
            ],
            "items": {
              "type": "string"
            }
          },
          "datePosted": {
            "title": "Date posted",
            "enum": [
              "any",
              "1h",
              "24h",
              "week",
              "month"
            ],
            "type": "string",
            "description": "Only jobs posted within this time. Applies to every search, pasted URLs included.",
            "default": "any"
          },
          "experienceLevel": {
            "title": "Experience level",
            "uniqueItems": true,
            "type": "array",
            "description": "LinkedIn's experience levels (the job page's \"Seniority level\"). Pick one or more; empty = all. LinkedIn's logged-out search does not apply this filter itself, so every job's page is checked and only matching jobs are saved (jobs that do not match are free). Needs the job details, which are then fetched even with the details switch off. With exactly one level chosen, its words (e.g. `entry level`) are added to the keyword search so LinkedIn ranks matching jobs first.",
            "items": {
              "type": "string",
              "enum": [
                "internship",
                "entry",
                "associate",
                "mid-senior",
                "director",
                "executive"
              ],
              "enumTitles": [
                "Internship",
                "Entry level",
                "Associate",
                "Mid-Senior level",
                "Director",
                "Executive"
              ]
            }
          },
          "jobType": {
            "title": "Job type",
            "uniqueItems": true,
            "type": "array",
            "description": "Employment types (the job page's \"Employment type\"). Pick one or more; empty = all. Checked on every job's page like Experience level: only matching jobs are saved and billed. With exactly one type chosen, its word (e.g. `part-time`) is added to the keyword search.",
            "items": {
              "type": "string",
              "enum": [
                "full-time",
                "part-time",
                "contract",
                "temporary",
                "internship",
                "volunteer",
                "other"
              ],
              "enumTitles": [
                "Full-time",
                "Part-time",
                "Contract",
                "Temporary",
                "Internship",
                "Volunteer",
                "Other"
              ]
            }
          },
          "workplaceType": {
            "title": "Workplace type",
            "uniqueItems": true,
            "type": "array",
            "description": "Remote, hybrid and/or on-site. LinkedIn's logged-out search ignores its own workplace filter and its public pages have no workplace field, so each job is classified from its location (\"United States (Remote)\"), a title tag (\"Engineer (Remote)\") or a fixed phrase in the description (\"this is a hybrid role\", \"fully remote\", \"on-site role\"); only jobs classified as one of the chosen types are saved (the output column `workplaceType`, with `workplaceTypeSource`). Jobs that state no workplace are left out. With exactly one of remote/hybrid chosen, its word is added to the keyword search so LinkedIn ranks matching jobs first. Needs the job details, which are then fetched even with the details switch off.",
            "items": {
              "type": "string",
              "enum": [
                "remote",
                "hybrid",
                "on-site"
              ],
              "enumTitles": [
                "Remote",
                "Hybrid",
                "On-site"
              ]
            }
          },
          "easyApply": {
            "title": "Easy Apply only",
            "type": "boolean",
            "description": "Only jobs you can apply to with LinkedIn Easy Apply (LinkedIn's `f_AL` filter, applied by LinkedIn's search).",
            "default": false
          },
          "under10Applicants": {
            "title": "Under 10 applicants only",
            "type": "boolean",
            "description": "Only jobs with fewer than 10 applicants so far (LinkedIn's `f_EA` filter, applied by LinkedIn's search). Good for applying early.",
            "default": false
          },
          "minSalary": {
            "title": "Minimum yearly salary",
            "minimum": 1,
            "type": "integer",
            "description": "Only jobs whose published pay range reaches this yearly amount, in the posting's own currency (hourly pay x 2,080, monthly x 12). Most postings publish no pay; they are left out when this is set. Checked on each job's page (LinkedIn's logged-out search ignores its salary filter)."
          },
          "distance": {
            "title": "Distance (miles)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Search radius around the location in miles (LinkedIn's `distance` filter; LinkedIn uses 5, 10, 25, 50 or 100). Only useful with a city in Locations."
          },
          "companyNames": {
            "title": "Companies (names)",
            "type": "array",
            "description": "Only jobs at these companies, one name per line (e.g. `Google`, `Microsoft`). Each name is matched to its LinkedIn company page (an exact name match first, else LinkedIn's top suggestion) and searched separately with your keywords and locations. A name LinkedIn does not know returns one free `not_found` row.",
            "items": {
              "type": "string"
            }
          },
          "companyIds": {
            "title": "Companies (LinkedIn company ids)",
            "type": "array",
            "description": "Numeric LinkedIn company ids (the `f_C` value in a LinkedIn search URL, e.g. `1441` for Google). Each id is searched separately with your keywords and locations.",
            "items": {
              "type": "string"
            }
          },
          "geoId": {
            "title": "LinkedIn geoId (optional)",
            "type": "string",
            "description": "LinkedIn's numeric place id (the `geoId` value in a LinkedIn search URL, e.g. `103644278` = United States). Use it when a location name is ambiguous; it applies to every keyword search."
          },
          "titleIncludes": {
            "title": "Title must contain",
            "type": "array",
            "description": "Keep only jobs whose title contains at least one of these words or phrases, one per line (whole words, case-insensitive: `java` does not match `JavaScript`). Checked on the search results, so skipped jobs cost nothing and do not count toward Maximum results.",
            "items": {
              "type": "string"
            }
          },
          "titleExcludes": {
            "title": "Title must not contain",
            "type": "array",
            "description": "Skip jobs whose title contains any of these words or phrases, one per line (e.g. `senior`, `intern`, `sales`). Whole words, case-insensitive.",
            "items": {
              "type": "string"
            }
          },
          "excludeCompanies": {
            "title": "Exclude companies",
            "type": "array",
            "description": "Skip jobs from these companies, one per line (e.g. staffing agencies). Matches whole words of the company name or its LinkedIn page name, case-insensitive: `Amazon` also skips `Amazon Web Services (AWS)`.",
            "items": {
              "type": "string"
            }
          },
          "fetchDescription": {
            "title": "Fetch full job details",
            "type": "boolean",
            "description": "On (default): one extra request per job adds the full description, seniority, employment type, job function, industries, applicant count, salary range (when LinkedIn shows it), Easy Apply and closed flags. Off: search-card data only (title, company, location, date, logo), about 10x fewer requests and faster.",
            "default": true
          },
          "includeDescriptionHtml": {
            "title": "Also keep the description as HTML",
            "type": "boolean",
            "description": "Adds `descriptionHtml` (LinkedIn's formatted description) next to the plain-text `descriptionText`. Only with full job details on.",
            "default": false
          },
          "maxItems": {
            "title": "Maximum results",
            "minimum": 1,
            "type": "integer",
            "description": "Stop after this many jobs have been saved, across all searches. Each saved job with status `ok` is one billable result. LinkedIn serves at most 1,000 jobs per search, so split big pulls by location, keyword or date posted.",
            "default": 20
          },
          "maxItemsPerSearch": {
            "title": "Maximum results per search",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Optional cap for each single search (one keyword in one location, or one pasted URL), so one broad search cannot use up Maximum results. Empty = no per-search cap (LinkedIn's own limit is 1,000)."
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy (datacenter) spreads the requests over many IPs so LinkedIn does not throttle the run. Residential proxies are not needed.",
            "default": {
              "useApifyProxy": true
            }
          },
          "onlyNewSinceLastRun": {
            "title": "Only jobs new since the last run",
            "type": "boolean",
            "description": "For scheduled runs: skip every job that an earlier run with this option (and the same store name below) already delivered, so each run returns and bills only new jobs. Skipped jobs cost nothing and do not count toward Maximum results. The delivered job ids are kept in a named key-value store on your Apify account.",
            "default": false
          },
          "seenJobsStoreName": {
            "title": "Memory store name",
            "type": "string",
            "description": "Named key-value store that remembers the delivered jobs (default `linkedin-jobs-seen`). Use a different name per monitor that must not share its memory, e.g. one per search. Lower-case letters, digits and dashes."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}