{
  "openapi": "3.0.1",
  "info": {
    "title": "LinkedIn Job Postings Scraper - Salary, Company, Easy Apply",
    "description": "4646 unique jobs from one keyword, 4.65 times LinkedIn's 1000-job search ceiling. Scrape LinkedIn job postings with the full job description, 47 fields per posting, no login. Employment type, seniority and workplace filters are applied here, because LinkedIn ignores 8 of its own URL parameters.",
    "version": "0.1",
    "x-build-id": "TmBTnZvyd48CUdvlS"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/snow_leo_data~linkedin-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-snow_leo_data-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/snow_leo_data~linkedin-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-snow_leo_data-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/snow_leo_data~linkedin-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-snow_leo_data-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": {
          "mode": {
            "title": "What to scrape",
            "enum": [
              "search",
              "jobs",
              "company"
            ],
            "type": "string",
            "description": "Search - walk LinkedIn job search by keyword and location. Job URLs - open exactly the postings you list. Company - jobs of one employer by numeric LinkedIn company id.",
            "default": "search"
          },
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "Job titles or keywords. Each term is a separate search with its own 1000-row ceiling, so three terms reach three times as far as one.",
            "default": [
              "python developer"
            ],
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Locations spelled as LinkedIn spells them: 'United States', 'Berlin, Germany', 'Greater London Area'. A place LinkedIn does not know is NOT refused - it silently answers with jobs from somewhere else, so keep the location check on.",
            "default": [
              "United States"
            ],
            "items": {
              "type": "string"
            }
          },
          "distance": {
            "title": "Radius in miles",
            "type": "integer",
            "description": "Radius around the location. LinkedIn honours this one: measured on nurse jobs in Chicago, 5 miles returned Chicago only, 25 miles reached Oak Brook and Deerfield, 100 miles reached Milwaukee. Leave empty for LinkedIn's default."
          },
          "geoIds": {
            "title": "Geo IDs (optional)",
            "type": "array",
            "description": "LinkedIn numeric geo ids, for example 103644278 for the United States. Used instead of the location text when you already know the id.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "searchUrls": {
            "title": "LinkedIn search URLs",
            "type": "array",
            "description": "Paste LinkedIn job-search URLs. The query string is unpacked into the fields below - keyword, location, geo id, radius, freshness, Easy Apply. Parameters LinkedIn accepts but ignores (f_JT, f_WT, f_E, f_SB, sortBy) are named in the run report instead of being forwarded as a filter that does nothing.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "jobUrls": {
            "title": "Job URLs or IDs",
            "type": "array",
            "description": "Used in 'Job URLs or IDs' mode. Accepts a full /jobs/view/ address or the bare job id.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "skipJobIds": {
            "title": "Job IDs to skip",
            "type": "array",
            "description": "Job ids you already have. They are never fetched and never charged for.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "companyUrls": {
            "title": "Company IDs",
            "type": "array",
            "description": "Used in 'One company' mode. LinkedIn's guest search filters by NUMERIC company id only - a company slug is ignored by the source, so this Actor rejects it loudly instead of returning the whole search.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "freshness": {
            "title": "Posted within",
            "enum": [
              "any",
              "past-hour",
              "past-4-hours",
              "past-12-hours",
              "past-24-hours",
              "past-3-days",
              "past-week",
              "past-month"
            ],
            "type": "string",
            "description": "The only date filter LinkedIn's guest search really honours. With 'Go past the 1000-row ceiling' on, this becomes the widest rung of the freshness ladder.",
            "default": "any"
          },
          "beyondCeiling": {
            "title": "Go past the 1000-row ceiling",
            "type": "boolean",
            "description": "One LinkedIn query can never return more than 1000 jobs - start=1000 is HTTP 400. This walks a ladder of freshness windows, each with its own thousand. Measured on one query: 1000 rows without it, 1910 with the first extra rung alone.",
            "default": true
          },
          "maxItems": {
            "title": "Maximum results",
            "minimum": 0,
            "type": "integer",
            "description": "How many rows you want. It limits what is DELIVERED, not what is crawled - filters this Actor applies after download would otherwise empty the result. Kept at 25 by default so a first run finishes in about a minute; raise it for a full pull.",
            "default": 25
          },
          "maxItemsPerQuery": {
            "title": "Maximum results per query",
            "minimum": 0,
            "type": "integer",
            "description": "A quota per search term and location, so one broad keyword cannot eat the whole order and turn a five-keyword run into a one-keyword scrape. 0 means no per-query quota.",
            "default": 0
          },
          "easyApplyOnly": {
            "title": "Easy Apply only",
            "type": "boolean",
            "description": "Asks LinkedIn itself for on-site applications (f_AL). This one the source honours: overlap with the unfiltered search was 0 of 30.",
            "default": false
          },
          "under10Applicants": {
            "title": "Under 10 applicants only",
            "type": "boolean",
            "description": "Asks LinkedIn for postings with fewer than ten applicants (f_EA). Honoured by the source: overlap with the unfiltered search was 1 of 10.",
            "default": false
          },
          "includeDescription": {
            "title": "Open the job page",
            "type": "boolean",
            "description": "Fetch the full posting: description, employment type, seniority, job function, industries, pay range and applicant count. One extra request per job. Turned on automatically when a filter needs a field that only the job page carries.",
            "default": true
          },
          "descriptionFormat": {
            "title": "Description format",
            "enum": [
              "text",
              "html",
              "markdown",
              "all",
              "none"
            ],
            "type": "string",
            "description": "Plain text is the default. HTML keeps the employer's markup, markdown keeps headings, bold and bullets. 'All three' returns every form; 'none' drops the description field entirely.",
            "default": "text"
          },
          "extractContacts": {
            "title": "Pull contacts out of the description",
            "type": "boolean",
            "description": "Emails, phone numbers and links the employer wrote into the posting text.",
            "default": false
          },
          "employmentTypes": {
            "title": "Employment type",
            "type": "array",
            "description": "Full-time, Part-time, Contract, Temporary, Internship, Volunteer, Other. LinkedIn's guest search IGNORES its own f_JT parameter, so this Actor applies the filter on the job page instead.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "seniorityLevels": {
            "title": "Seniority level",
            "type": "array",
            "description": "Internship, Entry level, Associate, Mid-Senior level, Director, Executive, Not Applicable. Also ignored by the source (f_E) and applied here.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "workplaceTypes": {
            "title": "Workplace type",
            "type": "array",
            "description": "Remote, Hybrid, On-site. LinkedIn does not give a guest a workplace field at all and ignores f_WT, so this is read from the location and the title, and every row says in workplace_signal where the answer came from.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "applyType": {
            "title": "Apply route",
            "enum": [
              "any",
              "easy-apply",
              "external"
            ],
            "type": "string",
            "description": "Easy Apply means the application form is on LinkedIn. External means a form on the employer's own site - and LinkedIn does not show a guest that address, so apply_url stays the LinkedIn job page.",
            "default": "any"
          },
          "titleIncludes": {
            "title": "Title must contain one of",
            "type": "array",
            "description": "Keep only jobs whose title contains one of these. A job with no title is kept - absence of data is not a mismatch.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "titleExcludes": {
            "title": "Drop titles containing",
            "type": "array",
            "description": "Drop jobs whose title contains any of these, for example 'senior' or 'intern'.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "descriptionIncludes": {
            "title": "Description must contain one of",
            "type": "array",
            "description": "Needs the job page, so it turns 'Open the job page' on by itself.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "companyIncludes": {
            "title": "Company must contain one of",
            "type": "array",
            "description": "Keep only jobs whose employer name contains one of these.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "locationContains": {
            "title": "Location must contain",
            "type": "string",
            "description": "Keep only jobs whose location text contains this, for example 'CA' or 'Greater London'.",
            "default": ""
          },
          "salaryMin": {
            "title": "Minimum salary",
            "type": "integer",
            "description": "Only 2 job pages in 30 publish a pay range, so by default a job with no published pay PASSES this filter - absence of data is not a mismatch. Use 'Require a published salary' to drop them."
          },
          "salaryMax": {
            "title": "Maximum salary",
            "type": "integer",
            "description": "Drop jobs whose pay range starts above this. Jobs with no published pay are kept."
          },
          "requireSalary": {
            "title": "Require a published salary",
            "type": "boolean",
            "description": "Drops every job without a pay range. Measured: that is about 28 of every 30 postings.",
            "default": false
          },
          "requirePoster": {
            "title": "Only jobs with a named job poster",
            "type": "boolean",
            "description": "Keep only postings that name the recruiter who opened them, with a link to their LinkedIn profile. Measured: 4 job pages in 24 carry one. Included in the row price - the nearest competitor charges $0.02 extra per job for this.",
            "default": false
          },
          "postedAfter": {
            "title": "Posted after (YYYY-MM-DD)",
            "type": "string",
            "description": "Keep only jobs posted on or after this date (YYYY-MM-DD). The check runs on the posting date LinkedIn prints on the card.",
            "default": ""
          },
          "postedBefore": {
            "title": "Posted before (YYYY-MM-DD)",
            "type": "string",
            "description": "Keep only jobs posted on or before this date (YYYY-MM-DD).",
            "default": ""
          },
          "verifyLocation": {
            "title": "Check that the location is the one you asked for",
            "type": "boolean",
            "description": "LinkedIn answers an unknown place with jobs from elsewhere and no warning. This drops those rows and names the reason instead of handing you another country.",
            "default": true
          },
          "onlyNew": {
            "title": "Monitor mode: only new and changed jobs",
            "type": "boolean",
            "description": "Remembers what was delivered in earlier runs and returns only postings that are new or have changed. Every row carries change_type NEW / UPDATED / UNCHANGED and changed_fields.",
            "default": false
          },
          "emitUnchanged": {
            "title": "Also return unchanged jobs",
            "type": "boolean",
            "description": "In monitor mode, also return jobs that have not changed since the last run. Off by default, so you pay only for what is new.",
            "default": false
          },
          "compact": {
            "title": "Compact rows",
            "type": "boolean",
            "description": "17 key fields instead of the full set - for agents and spreadsheets.",
            "default": false
          },
          "dropEmptyFields": {
            "title": "Drop empty fields",
            "type": "boolean",
            "description": "Remove null and empty fields from every row - smaller payloads for agents.",
            "default": false
          },
          "concurrency": {
            "title": "Parallel job pages",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "How many job pages to open at once. LinkedIn answers HTTP 429 after roughly twenty fast requests, so the client keeps an even pace no matter what is set here.",
            "default": 4
          },
          "inputDatasetId": {
            "title": "Job IDs from another dataset",
            "type": "string",
            "description": "Dataset id of another Actor run to take job ids from.",
            "default": ""
          },
          "jobIdField": {
            "title": "Field holding the job id in that dataset",
            "type": "string",
            "description": "Name of the field holding the job id inside that dataset.",
            "default": "job_id"
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}