{
  "openapi": "3.0.1",
  "info": {
    "title": "LinkedIn Jobs Scraper and Indeed Scraper",
    "description": "LinkedIn Jobs scraper plus Indeed scraper in one run, $0.35 per 1,000 LinkedIn jobs and $0.10 per 1,000 Indeed jobs, full descriptions included, no account, no cookies: one table with title, company, location, remote or hybrid, posted date, salary, seniority, applicants and apply link.",
    "version": "0.1",
    "x-build-id": "bBXdwXyLK9nMAVhLr"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/agenttoolworks~linkedin-indeed-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-agenttoolworks-linkedin-indeed-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/agenttoolworks~linkedin-indeed-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-agenttoolworks-linkedin-indeed-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/agenttoolworks~linkedin-indeed-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-agenttoolworks-linkedin-indeed-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": "Clear Keywords to run only the start URLs below. What to search, as you would type it on LinkedIn or Indeed: a job title, a skill or a company (data engineer, nurse, python, Airbus). Set keywords, start URLs, or both (then both are searched and charged)."
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "A city, region or postcode (Paris, London, Berlin, 10001). Empty searches the whole country."
          },
          "country": {
            "title": "Country",
            "type": "string",
            "description": "Picks Indeed's country site (fr.indeed.com, uk.indeed.com...) and completes the location for LinkedIn. Pick one from the list, or type a two-letter code (IN) or an English country name (India, United Kingdom).",
            "default": "US"
          },
          "boards": {
            "title": "Job boards",
            "type": "array",
            "description": "Which boards the keywords search runs on. Both by default; each returns up to the maximum below. A start URL runs on its own board.",
            "items": {
              "type": "string",
              "enum": [
                "linkedin",
                "indeed"
              ],
              "enumTitles": [
                "LinkedIn Jobs",
                "Indeed"
              ]
            },
            "default": [
              "linkedin",
              "indeed"
            ]
          },
          "startUrls": {
            "title": "Start URLs: LinkedIn or Indeed searches, LinkedIn jobs",
            "type": "array",
            "description": "Clear Keywords to run only these URLs: otherwise the keywords above are searched, and charged, too. Paste searches from your browser's address bar, filters included: LinkedIn (linkedin.com/jobs/search?keywords=...&location=..., with f_TPR, f_AL, f_EA, f_C, geoId, distance, f_E, f_JT, f_WT) or Indeed (uk.indeed.com/jobs?q=...&l=..., with fromage, radius, jt, and sc for job type, remote or hybrid), or LinkedIn job pages (linkedin.com/jobs/view/...). currentJobId is ignored on a search URL: paste linkedin.com/jobs/view/<id> to read one job. Each URL is its own search with its own filters. Max jobs per board applies to each search, and a job two searches find is returned and charged once. A URL the Actor cannot read, or one with a filter it cannot apply (Indeed's experience level explvl, for one), is not searched, and the run summary says why.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "maxResultsPerBoard": {
            "title": "Max jobs per board",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Stop after this many jobs on each board, for each search (the keywords, and each start URL). You are charged per job returned. LinkedIn shows visitors at most 1,000 results per search (with some repeats); when that runs out, the Actor continues with narrower date windows of the same search.",
            "default": 100
          },
          "includeDescription": {
            "title": "LinkedIn: full description and details",
            "type": "boolean",
            "description": "Read each LinkedIn job's own page: full description, seniority, employment type, industries, applicant count and base pay when published. One light request per job; charged as a job with description. Off returns the search card only (title, company, location, date, link). Pasted LinkedIn job URLs follow it too: off, their rows carry the card fields and are charged as cards.",
            "default": true
          },
          "indeedDescriptions": {
            "title": "Indeed: full description",
            "type": "boolean",
            "description": "On (default), every Indeed row carries the job's full description. Off returns the same rows without it (salary, job type, remote or hybrid, posting date, apply link), lighter and charged as a job without description.",
            "default": true
          },
          "strictLocation": {
            "title": "Only this exact city",
            "type": "boolean",
            "description": "Both boards widen a city search to its area (a London search returns Teddington and Morden). On, only jobs whose location names the searched place are returned, and charged. Off by default. For the keywords search; a start URL carries its own filters (Indeed's radius=0, LinkedIn's distance=0).",
            "default": false
          },
          "datePosted": {
            "title": "Date posted",
            "enum": [
              "any",
              "24h",
              "3d",
              "week",
              "2weeks",
              "month"
            ],
            "type": "string",
            "description": "Only jobs posted within this window. For the keywords search; a start URL carries its own.",
            "default": "any"
          },
          "jobTypes": {
            "title": "Job type",
            "type": "array",
            "description": "Keep only these job types. Empty keeps all. Indeed applies it in its own search. LinkedIn's logged-out search ignores it, so the Actor reads each LinkedIn job's own page to check it: slower, and capped (LinkedIn stops once the job pages that do not match reach 10, or take about 5 seconds, per job asked, at least 300 pages and 2 minutes, and says so in the run summary). LinkedIn jobs that do not match are never charged. For the keywords search; a start URL carries its own (f_JT, jt).",
            "items": {
              "type": "string",
              "enum": [
                "fulltime",
                "parttime",
                "contract",
                "temporary",
                "internship",
                "volunteer"
              ],
              "enumTitles": [
                "Full-time",
                "Part-time",
                "Contract",
                "Temporary",
                "Internship",
                "Volunteer"
              ]
            }
          },
          "workplaceTypes": {
            "title": "Remote, hybrid or on-site",
            "type": "array",
            "description": "Keep only these workplace types. Empty keeps all. Indeed filters on its own remote and hybrid labels; LinkedIn shows visitors no workplace field, so a LinkedIn job counts as remote or hybrid when its title or location says so, and as on-site otherwise. For the keywords search; a start URL carries its own (f_WT, sc).",
            "items": {
              "type": "string",
              "enum": [
                "remote",
                "hybrid",
                "onsite"
              ],
              "enumTitles": [
                "Remote",
                "Hybrid",
                "On-site"
              ]
            }
          },
          "experienceLevels": {
            "title": "Experience level",
            "type": "array",
            "description": "Keep only these levels. Empty keeps all. LinkedIn's logged-out search ignores it, so the Actor reads each LinkedIn job's own page to check its seniority: slower, and capped (LinkedIn stops once the job pages that do not match reach 10, or take about 5 seconds, per job asked, at least 300 pages and 2 minutes, and says so in the run summary). LinkedIn jobs that do not match are never charged. Indeed is not searched when this is set: its search cannot filter by experience level, and rows that ignore your filter are neither delivered nor charged (the run summary says so). On Indeed an internship is a job type. For the keywords search; a start URL carries its own (f_E).",
            "items": {
              "type": "string",
              "enum": [
                "internship",
                "entry",
                "associate",
                "midsenior",
                "director",
                "executive"
              ],
              "enumTitles": [
                "Internship",
                "Entry level",
                "Associate",
                "Mid-Senior level",
                "Director",
                "Executive"
              ]
            }
          },
          "proxy": {
            "title": "Proxy",
            "enum": [
              "auto",
              "none",
              "datacenter",
              "residential"
            ],
            "type": "string",
            "description": "Automatic is what worked best in our tests: LinkedIn through Apify datacenter proxy, Indeed through Apify residential proxy in the searched country (Indeed refuses datacenter and cloud addresses). Override only to test.",
            "default": "auto"
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}