{
  "openapi": "3.0.1",
  "info": {
    "title": "Career Site Jobs API: Workday, Greenhouse, Lever, Ashby",
    "description": "Every open job from company career sites in one format: Workday, Greenhouse, Lever, Ashby, Workable, Recruitee and Personio. Give a website and it finds the job board. Pay ranges where published, a hiring summary per company, and on repeat runs only new, changed and closed jobs.",
    "version": "0.1",
    "x-build-id": "KmIWpmo65ZNjJqmZ8"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/fetchgrove~ats-career-jobs/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-fetchgrove-ats-career-jobs",
        "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/fetchgrove~ats-career-jobs/runs": {
      "post": {
        "operationId": "runs-sync-fetchgrove-ats-career-jobs",
        "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/fetchgrove~ats-career-jobs/run-sync": {
      "post": {
        "operationId": "run-sync-fetchgrove-ats-career-jobs",
        "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",
            "type": "array",
            "description": "One per line: a company website or domain (e.g. https://www.notion.com), a job-board URL (e.g. https://boards.greenhouse.io/airbnb, https://jobs.lever.co/spotify, https://jobs.ashbyhq.com/ramp, https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite, https://nycballet.bamboohr.com/careers, https://career.teamtailor.com/jobs), or ats:slug where ats is greenhouse, lever, ashby, workable, recruitee, personio, bamboohr or teamtailor (e.g. greenhouse:airbnb, bamboohr:nycballet, teamtailor:career; a Teamtailor career site on its own domain is teamtailor:{host}, e.g. teamtailor:jobs.tibber.com). Workday career sites: give the career-site URL (with or without a locale such as /en-US/) or workday:{tenant}.wd{N}/{site}, e.g. workday:nvidia.wd5/NVIDIAExternalCareerSite; a website that links to its Workday site is found too, but Workday sites are never guessed. Workday sites are read politely: robots.txt first (a site whose robots.txt disallows its career-site path or job-list path is skipped), at most one request per second per Workday host, no login or cookies, and a site that blocks the request (HTTP 403, a bot check, repeated 429) is reported as a free error item and not retried. Workday lists at most 2,000 jobs per site; Workday site ids are not case-sensitive (the site's own spelling is used in the output). A company website that links to its BambooHR or Teamtailor board is found too, including a Teamtailor career site on the company's own domain; BambooHR boards are never guessed. BambooHR and Teamtailor sites whose robots.txt (for the whole site or for its job pages) or response says Content-Signal ai-input=no or search=no (they ask automated AI tools not to use their content) are skipped as a free error item. A board named more than once, in any form (greenhouse:airbnb and https://boards.greenhouse.io/airbnb, a website and its board link, or a Teamtailor tenant and its career site's own domain such as teamtailor:tibber and https://tibber.com), is read and charged once. If empty, the run checks one example company (greenhouse:airbnb).",
            "items": {
              "type": "string"
            }
          },
          "includeDescription": {
            "title": "Include job descriptions",
            "type": "boolean",
            "description": "Add each job's description as plain text (HTML removed, at most 20,000 characters). Email addresses and phone numbers are removed. Workday sites need one extra request per returned job at one request per second (about 17 minutes for 1,000 jobs), so set Max jobs per company or filters to keep runs short; with descriptions on, Workday jobs also list every location and the exact posted date. BambooHR also needs one extra request per returned job (at most two a second per site), which adds each job's posted date and published pay.",
            "default": false
          },
          "onlyChanges": {
            "title": "Only new, changed and removed jobs",
            "type": "boolean",
            "description": "Incremental mode: return only jobs that are new on the board since your previous run with the same settings, jobs whose title, locations, department, pay, employment type or remote status changed, plus free markers for returned jobs that left the board. A job posted before your previous run is never reported as new. The first run with given filters returns every matching job as the baseline. Each filter set and each saved task keeps its own state, and full runs (this option off) keep theirs, so an occasional full export never hides a new job from your alerts. Jobs beyond Max jobs per company (or the free-plan cap) are simply not returned, and later runs do not return them either: raise the limit to get them all. State is kept in a key-value store named ats-jobs-state in your own account.",
            "default": false
          },
          "changedJobsOnly": {
            "title": "Changed jobs only (alias of onlyChanges)",
            "type": "boolean",
            "description": "Same as onlyChanges; either one switches incremental mode on. Meant for alerts without webhooks: schedule the actor (for example daily) with changedJobsOnly true, and each run's dataset holds only the company summaries plus jobs that are new on the board, changed or removed since the previous run with the same settings, so a run whose job items list is empty means nothing changed. Combine with filters to watch only the roles you care about; only jobs that pass the filters are returned or charged, and each filter set (and each saved task) keeps its own state, so its first run is a baseline. New or changed jobs beyond Max jobs per company are not returned later; raise the limit if you need every one."
          },
          "maxJobsPerCompany": {
            "title": "Max jobs per company",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Maximum job items returned per company (1–5,000). Filters apply first, so the limit counts matching jobs (a job whose posted date is only on its own page counts once that date passes). In incremental mode, new or changed jobs beyond the limit are not returned by later runs either.",
            "default": 1000
          },
          "filters": {
            "title": "Filters",
            "type": "object",
            "description": "Free filters, applied before any job is returned or charged. Fields combine with AND; inside a list, any item may match. The company summary still counts every open job (openJobs) and adds matchingJobs. Example: {\"titleKeywords\": [\"engineer*\"], \"locations\": [\"United Kingdom\"], \"postedAfter\": \"30 days\"}.",
            "properties": {
              "titleKeywords": {
                "title": "Title keywords",
                "type": "array",
                "description": "Keep jobs whose title contains any of these words or phrases. Case-insensitive, whole words: \"engineer\" matches \"Senior Engineer\" and \"Engineers\" but not \"Engineering\"; end a keyword with * to match word starts (\"engineer*\" also matches \"Engineering\"). Spaces and hyphens are interchangeable (\"full stack\" matches \"Full-Stack\"). Chinese, Japanese and Korean keywords match anywhere in the title (\"工程师\" matches \"高级软件工程师\"). German compound words are not split: \"entwickler\" does not match \"Softwareentwickler\", so give the compound itself.",
                "editor": "stringList",
                "items": {
                  "type": "string"
                }
              },
              "excludeTitleKeywords": {
                "title": "Exclude title keywords",
                "type": "array",
                "description": "Drop jobs whose title contains any of these words or phrases (same matching as Title keywords), e.g. senior, staff, intern.",
                "editor": "stringList",
                "items": {
                  "type": "string"
                }
              },
              "locations": {
                "title": "Locations",
                "type": "array",
                "description": "Keep jobs with any location containing any of these (case-insensitive). Country names and codes match places in that country written in other ways: \"United Kingdom\", \"UK\" or \"GB\" match \"London, UK\", \"Edinburgh, Scotland\" and \"London\"; \"United States\" or \"US\" match \"Austin, TX\", \"US-CA\" and \"Remote - USA\"; \"Germany\" matches \"München\" and \"Walldorf, DE\". A country name never matches part of another place: \"India\" does not match \"Indianapolis, IN\", \"Mexico\" not \"New Mexico\", \"Ireland\" not \"Northern Ireland\". Other text, such as a city or \"Remote\", matches as written. Workday jobs listed with several locations are matched on the main location in their link; when that does not decide, the job's own page is read (one request per second).",
                "editor": "stringList",
                "items": {
                  "type": "string"
                }
              },
              "remoteOnly": {
                "title": "Remote only",
                "type": "boolean",
                "description": "Keep only jobs the board marks as remote (or whose location says remote). For Workday jobs listed with several locations, the job's own page decides.",
                "editor": "checkbox"
              },
              "postedAfter": {
                "title": "Posted on or after",
                "type": "string",
                "description": "Keep jobs posted on or after this date (YYYY-MM-DD), or within a period before the run starts, such as 7 days, 2 weeks or 3 months. Posted dates without a time count by whole days, so \"1 day\" keeps jobs posted yesterday. Workday jobs shown as \"Posted 30+ Days Ago\" are left out by any cut-off within the last 30 days. With descriptions on, BambooHR jobs and Workday jobs without a listed date are judged by the posting date on their own page, read before they are returned; a job that turns out older is neither returned nor charged and does not count toward Max jobs per company. A date that does not exist, such as 2026-02-30, stops the run before anything is charged.",
                "editor": "datepicker",
                "dateType": "absoluteOrRelative"
              },
              "includeUndated": {
                "title": "Keep jobs without a posted date",
                "type": "boolean",
                "description": "With Posted on or after: keep jobs whose board gives no posted date. Without descriptions, BambooHR jobs count as undated, and Workday \"Posted 30+ Days Ago\" jobs count as undated only for cut-offs more than 30 days back. With descriptions on, those jobs are judged by the date on their own page instead, and this setting decides only for a job whose page gives no date either. Default true.",
                "editor": "checkbox",
                "default": true
              },
              "departments": {
                "title": "Departments",
                "type": "array",
                "description": "Keep jobs whose department or team contains any of these words or phrases (case-insensitive, whole words, * for word starts), e.g. Engineering, Sales. Workday sites give no department, so this filter matches none of their jobs; use Title keywords for them.",
                "editor": "stringList",
                "items": {
                  "type": "string"
                }
              }
            },
            "additionalProperties": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}