{
  "openapi": "3.0.1",
  "info": {
    "title": "LinkedIn Jobs Scraper — Search, Company Jobs & Job Details",
    "description": "Scrape LinkedIn job postings with the exact posting date, employer logo and LinkedIn URL, apply links, seniority, job function, industries, applicant count and structured salary. Search by keyword, list every open job at up to 10 companies, or batch full details for up to 20 job ids.",
    "version": "1.0",
    "x-build-id": "gtRShvtSqqNXVukOx"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/sian.agency~linkedin-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-sian.agency-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/sian.agency~linkedin-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-sian.agency-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/sian.agency~linkedin-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-sian.agency-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": {
          "operation": {
            "title": "🎯 What do you want to scrape?",
            "enum": [
              "search",
              "companyJobs",
              "jobDetails"
            ],
            "type": "string",
            "description": "Pick one operation per run. Search Jobs and Company Jobs both page LinkedIn 10 jobs at a time; Job Details refreshes up to 20 known job ids in a single call.",
            "default": "search"
          },
          "query": {
            "title": "🔑 Search keyword",
            "type": "string",
            "description": "Job title, skill or free-text phrase to search for, exactly as you would type it into LinkedIn's own keyword box. Required by Search Jobs. Optional for Company Jobs, where it narrows the results to matching postings within the selected companies — leave it empty there to get the company's whole job list.",
            "default": "software engineer"
          },
          "location": {
            "title": "📍 Location",
            "type": "string",
            "description": "Free-text location, written the way LinkedIn writes it: \"United States\", \"London, United Kingdom\", \"Berlin, Germany\". Works worldwide with no geo id. LinkedIn ignores a search radius when the location is free text, so pair Geo ID with Radius if you need a radius.",
            "default": "United States"
          },
          "geoId": {
            "title": "🌐 LinkedIn Geo ID",
            "pattern": "^[0-9]{3,20}$",
            "type": "string",
            "description": "LinkedIn's own numeric location id, for example 102571732 (New York City) or 103644278 (United States). Take it from the geoId= parameter of a linkedin.com/jobs search URL. Required if you want Radius to take effect; LinkedIn has no geo-id lookup on this surface."
          },
          "radiusKm": {
            "title": "📏 Radius (km)",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Search radius in kilometres around the Geo ID, converted to the miles LinkedIn expects. Needs Geo ID — a radius with a free-text location is rejected, because LinkedIn silently ignores it."
          },
          "datePosted": {
            "title": "🗓️ Date posted",
            "enum": [
              "all",
              "today",
              "3days",
              "week",
              "month"
            ],
            "type": "string",
            "description": "Freshness window, applied by LinkedIn itself rather than filtered afterwards, so it does not cost extra pages. Maps exactly onto LinkedIn's own windows: 24 hours, 72 hours, 7 days, 30 days.",
            "default": "all"
          },
          "employmentTypes": {
            "title": "💼 Employment types",
            "uniqueItems": true,
            "type": "array",
            "description": "Keep only these employment types. Pick any combination; leave empty for every type. LinkedIn ignores its own job-type filter on the logged-out surface, so this is applied after fetching: it over-fetches up to 3x the pages to refill the results, which costs more to run and returns fewer rows than an unfiltered run.",
            "items": {
              "type": "string",
              "enum": [
                "FULLTIME",
                "PARTTIME",
                "CONTRACTOR",
                "INTERN"
              ],
              "enumTitles": [
                "🕐 Full-time",
                "🕑 Part-time",
                "📝 Contract",
                "🎓 Internship"
              ]
            }
          },
          "seniorityLevels": {
            "title": "📈 Seniority levels",
            "uniqueItems": true,
            "type": "array",
            "description": "Keep only these seniority levels, in LinkedIn's own vocabulary. Pick any combination; leave empty for every level. Applied after fetching with the same extra cost as Employment types. Deliberately LinkedIn's wording rather than a years-of-experience number, because there is no honest mapping from \"Mid-Senior level\" to a year count.",
            "items": {
              "type": "string",
              "enum": [
                "Internship",
                "Entry level",
                "Associate",
                "Mid-Senior level",
                "Director",
                "Executive",
                "Not Applicable"
              ],
              "enumTitles": [
                "🎓 Internship",
                "🌱 Entry level",
                "📗 Associate",
                "📘 Mid-Senior level",
                "📙 Director",
                "🏛️ Executive",
                "➖ Not Applicable"
              ]
            }
          },
          "remoteOnly": {
            "title": "🏠 Remote jobs only",
            "type": "boolean",
            "description": "Keep only postings carrying an explicit remote marker. Best-effort and deliberately low-recall: LinkedIn's logged-out payload has no workplace-type field, so this matches wording in the title or location. It under-returns rather than over-returns, and many queries return few or no rows with it on.",
            "default": false
          },
          "companyIds": {
            "title": "🏢 Company IDs",
            "type": "array",
            "description": "Used by Company Jobs. LinkedIn numeric company ids, up to 10, combined as OR. Every job this actor returns carries its employer's id as linkedinCompanyId, so \"more jobs at this company\" is one follow-up run. LinkedIn ranks the union by relevance, so a small company paired with a large one can be missing from the first page.",
            "items": {
              "type": "string"
            }
          },
          "companies": {
            "title": "🔗 Company slugs or URLs",
            "type": "array",
            "description": "Used by Company Jobs. LinkedIn company vanity slugs or company page URLs, up to 10 — \"microsoft\", \"/company/microsoft\" and the full URL all work. Each one is resolved to an id live, which adds one extra lookup per slug. An unknown slug fails the whole run, which is the fastest way to catch a typo.",
            "items": {
              "type": "string"
            }
          },
          "jobIds": {
            "title": "📋 Job IDs",
            "type": "array",
            "description": "Used by Job Details. Up to 20 job ids per call, as returned in the jobId field of any search. The raw numeric LinkedIn posting id (jobUid) is accepted too. Duplicates are collapsed before the 20 cap applies. An id LinkedIn has taken down is simply absent from the results rather than returned as an empty shell.",
            "items": {
              "type": "string"
            }
          },
          "includeDetails": {
            "title": "📖 Fetch full job details",
            "type": "boolean",
            "description": "Open each job's detail page to fill the fields a search card cannot carry: full description, employment type, salary, seniority level, job function, industries, applicant count and the employer's LinkedIn company id. Turn it off for a roughly 3x faster, card-only run. It is forced back on whenever Employment types or Seniority levels are in use.",
            "default": true
          },
          "sortBy": {
            "title": "↕️ Sort by",
            "enum": [
              "relevance",
              "date"
            ],
            "type": "string",
            "description": "Date sorts the jobs inside this run's results newest-first. It cannot re-rank LinkedIn's result set, because LinkedIn ignores its own sort on the logged-out surface — pair it with Date posted, or with a larger result cap, for a genuinely fresh list.",
            "default": "relevance"
          },
          "maxResults": {
            "title": "🔢 Max jobs",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Upper bound on jobs returned by Search Jobs and Company Jobs. LinkedIn serves 10 per page and caps any single result set at 1000, so this is rounded up to whole pages. Job Details ignores it and returns one row per job id you supply.",
            "default": 50
          },
          "country": {
            "title": "🌍 Country code",
            "pattern": "^[A-Za-z]{2}$",
            "type": "string",
            "description": "Two-letter country code. It picks which country the request is made from and fills in the country on a posting whose own location does not name one. It is not the geography filter — use Location or Geo ID for that.",
            "default": "us"
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}