{
  "openapi": "3.0.1",
  "info": {
    "title": "Job Scraper for Greenhouse, Lever, Ashby, Workday & 10 More ATS",
    "description": "Job postings from company career sites via the public APIs of 13 applicant tracking systems: Greenhouse, Lever, Ashby, Workday, BambooHR and more. Input career-page URLs, plain domains like stripe.com, or search 23,725 verified live boards. Returns title, location, remote, salary, apply URL.",
    "version": "1.0",
    "x-build-id": "UhYfX7k8jvRPNF2Ei"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/firstpartydata~ats-job-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-firstpartydata-ats-job-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/firstpartydata~ats-job-scraper/runs": {
      "post": {
        "operationId": "runs-sync-firstpartydata-ats-job-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/firstpartydata~ats-job-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-firstpartydata-ats-job-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": {
          "companies": {
            "title": "Companies (URLs, domains, or names)",
            "type": "array",
            "description": "Which employers to read. Three forms, mixed freely: (1) an ATS board URL such as https://job-boards.greenhouse.io/stripe or https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite; (2) a plain company domain such as stripe.com, usually easiest since the domain is tried against every platform so you need not know which ATS a company uses; (3) a bare name such as stripe. Leave empty and set useBuiltInCorpus to search the bundled board list instead.",
            "items": {
              "type": "string"
            }
          },
          "useBuiltInCorpus": {
            "title": "Search the built-in company list",
            "type": "boolean",
            "description": "Read the bundled list of verified live job boards, in addition to any companies given above. Use this for market-wide questions such as who is hiring Rust developers. Use the companies field instead when you already know which employers you care about. COVERAGE.md lists exactly which companies are in the bundled list.",
            "default": false
          },
          "corpusSample": {
            "title": "How many boards from the built-in list",
            "minimum": 0,
            "type": "integer",
            "description": "How many of the bundled boards to read, largest employers first. 250 covers about 40% of all bundled postings, 500 about 53%, 1000 about 65% and 2000 about 77%, so a small number goes a long way. Set 0 for every board, which is 23,725 of them and will not finish inside a default run timeout. This applies whenever the bundled list is read, which is when you switch on the built-in list and also when you name no companies at all.",
            "default": 500
          },
          "atsPlatforms": {
            "title": "ATS platforms",
            "type": "array",
            "description": "Which applicant tracking systems to read. Narrowing this speeds up runs. Ashby, Lever, Recruitee and Pinpoint publish structured salary. SmartRecruiters, BambooHR, Rippling and Workday carry descriptions only on a second per-posting request, made when includeDescriptions is on. Breezy and Personio return no description at all.",
            "items": {
              "type": "string",
              "enum": [
                "greenhouse",
                "lever",
                "ashby",
                "workable",
                "recruitee",
                "smartrecruiters",
                "workday",
                "teamtailor",
                "breezy",
                "personio",
                "bamboohr",
                "pinpoint",
                "rippling"
              ],
              "enumTitles": [
                "Greenhouse",
                "Lever",
                "Ashby",
                "Workable",
                "Recruitee",
                "SmartRecruiters",
                "Workday",
                "Teamtailor",
                "Breezy",
                "Personio",
                "BambooHR",
                "Pinpoint",
                "Rippling"
              ]
            },
            "default": [
              "greenhouse",
              "lever",
              "ashby",
              "workable",
              "recruitee",
              "smartrecruiters",
              "workday",
              "teamtailor",
              "breezy",
              "personio",
              "bamboohr",
              "pinpoint",
              "rippling"
            ]
          },
          "keywords": {
            "title": "Keywords (title or description)",
            "type": "array",
            "description": "Keep only postings containing at least one of these, case-insensitively, in the job title or description. Example: kubernetes, terraform. Descriptions are only searched when includeDescriptions is on; with it off this matches titles only.",
            "items": {
              "type": "string"
            }
          },
          "keywordsMatchAll": {
            "title": "Require every keyword",
            "type": "boolean",
            "description": "When on, a posting must contain all of the keywords rather than any one of them.",
            "default": false
          },
          "titleInclude": {
            "title": "Job title must contain",
            "type": "array",
            "description": "Keep only postings whose title contains one of these, case-insensitively. Narrower and more reliable than keywords because it ignores the description. Example: engineer, developer.",
            "items": {
              "type": "string"
            }
          },
          "titleExclude": {
            "title": "Job title must NOT contain",
            "type": "array",
            "description": "Drop postings whose title contains any of these. Useful for stripping out seniority levels or non-target roles. Example: intern, manager, director.",
            "items": {
              "type": "string"
            }
          },
          "location": {
            "title": "Location contains",
            "type": "array",
            "description": "Keep only postings whose location text contains one of these, case-insensitively. Matches the raw location string as the employer wrote it, so prefer a city or country name over a postal code. Example: Berlin, Germany.",
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "title": "Country",
            "type": "array",
            "description": "ISO code or country name. \"US\", \"United States\" and \"GB\" all work. Most boards publish a structured country; Greenhouse, Pinpoint, Rippling and BambooHR do not, so it is read off the location string instead. \"Hawthorne, CA\" and \"Seoul, South Korea\" resolve; \"London\" and \"Tbilisi, Georgia\" stay unknown rather than being guessed. How much of a board resolves depends heavily on the board: most Greenhouse boards resolve 94-100%, but one large employer writing locations as internal store codes resolves 3%. Rows resolved this way are marked countryInferred, so you can exclude them. Personio publishes neither and will not match.",
            "items": {
              "type": "string"
            }
          },
          "workplaceTypes": {
            "title": "Work arrangement",
            "type": "array",
            "description": "Keep only postings with this work arrangement, as the vendor stated it. Lever, Recruitee, Pinpoint and Ashby publish it on nearly every posting; SmartRecruiters and Workable on a small minority; Workday has the field but fills it in on well under 1% of postings. Greenhouse, Breezy, BambooHR, Rippling, Personio and Teamtailor do not publish it at all, and their postings are excluded rather than guessed at. Use this rather than remoteOnly when you want Hybrid.",
            "items": {
              "type": "string",
              "enum": [
                "Remote",
                "Hybrid",
                "OnSite"
              ],
              "enumTitles": [
                "Remote",
                "Hybrid",
                "On-site"
              ]
            },
            "default": []
          },
          "remoteOnly": {
            "title": "Remote roles only",
            "type": "boolean",
            "description": "Keep only postings that are definitely remote. Hybrid roles are excluded. Postings where the employer did not state a work arrangement have isRemote = null and are also excluded, because guessing would be wrong more often than right.",
            "default": false
          },
          "withSalaryOnly": {
            "title": "Only jobs with published pay",
            "type": "boolean",
            "description": "Keep only postings with a published pay range, and only when it carries actual numbers. A compensation field reading \"Competitive\" does not count. Ashby, Lever, Recruitee and Pinpoint publish pay as a structured field; elsewhere a range is read from the description only when it is explicitly currency-marked. Measured share of postings that carry one: Greenhouse, Lever, Recruitee and Ashby around half, Workable a little under, BambooHR about a quarter, and Pinpoint, Breezy, Rippling, SmartRecruiters and Workday in the single digits. Teamtailor and Personio publish none and will not match.",
            "default": false
          },
          "postedWithinDays": {
            "title": "Posted within the last N days",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only postings published in the last N days. 0 disables the filter. On a scheduled daily feed set this to 1 or 2, which turns a whole-market run into just the new rows. Postings from boards that publish no date cannot satisfy this and are dropped.",
            "default": 0
          },
          "onlyNewOrChanged": {
            "title": "Only new or changed jobs (incremental)",
            "type": "boolean",
            "description": "Return only postings that are new, or whose title, location, pay, work arrangement or description has changed since the last run with the same settings. Unchanged rows are skipped and not billed, which is what makes a daily feed cheap. The first run has no history, so it returns everything and establishes the baseline. Each returned row gains a changeType field of new or changed.",
            "default": false
          },
          "stateKey": {
            "title": "Incremental state name",
            "type": "string",
            "description": "Names the history that incremental mode reads and writes. Leave blank and one is derived from your settings, so two differently-filtered feeds never contaminate each other. Set it explicitly only if you want two runs to deliberately share a history.",
            "default": ""
          },
          "includeDescriptions": {
            "title": "Include full job descriptions",
            "type": "boolean",
            "description": "Return the full job description as both HTML and plain text. Turn this OFF when you only need to know which companies are hiring for what. It is much faster and cheaper. On SmartRecruiters, BambooHR, Rippling and Workday this switch also controls a second request per posting, which is the only way to get a description and, on BambooHR and Rippling, the posting date.",
            "default": true
          },
          "maxItems": {
            "title": "Maximum jobs to return",
            "minimum": 0,
            "type": "integer",
            "description": "Hard ceiling on results, so an over-broad filter cannot produce a surprise bill. The run stops as soon as it is reached. 0 means no limit. Set that only with a narrow filter in place.",
            "default": 1000
          },
          "maxPerCompany": {
            "title": "Maximum jobs from any one job board",
            "minimum": 0,
            "type": "integer",
            "description": "Stops a single large board filling the whole result. Leave at 0 and a market-wide run with a ceiling spreads it over at least 40 boards on its own: without that, the bare default returned 1,000 rows from one or two companies, because one Greenhouse board arrives in a single page and takes the whole ceiling. Counted per board, not per employer, so a company that runs two boards can return twice this. It is never applied when you name companies yourself, or when \"maxItems\" is 0.",
            "default": 0
          },
          "concurrency": {
            "title": "Parallel boards",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many job boards to read at once. The default suits most runs. Workable and Personio rate-limit aggressively and are internally capped below this regardless of what you set.",
            "default": 20
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}