{
  "openapi": "3.0.1",
  "info": {
    "title": "Career Site Jobs Scraper: Workday, Greenhouse, Lever",
    "description": "Get open jobs live from career sites of companies you name, as JSON. Input: company names or careers/job-board URLs. Output: one normalized record per job (title, location, remote, salary, seniority, apply URL) from 17 ATS incl. Workday, Greenhouse, Lever. New/closed jobs feed.",
    "version": "1.0",
    "x-build-id": "CXZI8xrOlG7t8GQa5"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/catalyst-labs~career-site-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-catalyst-labs-career-site-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/catalyst-labs~career-site-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-catalyst-labs-career-site-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/catalyst-labs~career-site-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-catalyst-labs-career-site-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",
        "required": [
          "companies"
        ],
        "properties": {
          "companies": {
            "title": "Companies",
            "minItems": 1,
            "type": "array",
            "description": "Required. Companies to get open jobs for, one per entry. Each entry can be: a company name (\"Stripe\"), a careers page (\"https://www.notion.so/careers\"), a job-board URL (\"https://jobs.ashbyhq.com/ramp\", \"https://intel.wd1.myworkdayjobs.com/External\") or \"platform:slug\" (\"lever:palantir\"). Workday and Oracle need a URL. Guessed boards are checked against the company name; mismatches are reported, not charged.",
            "items": {
              "type": "string"
            }
          },
          "platforms": {
            "title": "Platforms to try for auto-detection",
            "type": "array",
            "description": "Only used when an entry is a plain company name: which ATS to try. Leave empty to try all guessable ATS in order of market share. URLs and \"platform:slug\" entries ignore this. Example: [\"greenhouse\", \"lever\"].",
            "items": {
              "type": "string",
              "enum": [
                "greenhouse",
                "lever",
                "ashby",
                "workable",
                "recruitee",
                "smartrecruiters",
                "workday",
                "oracle",
                "personio",
                "bamboohr",
                "breezy",
                "teamtailor",
                "gem",
                "rippling",
                "pinpoint",
                "jobvite",
                "jazzhr"
              ],
              "enumTitles": [
                "Greenhouse",
                "Lever",
                "Ashby",
                "Workable",
                "Recruitee",
                "SmartRecruiters",
                "Workday (URL only)",
                "Oracle Recruiting Cloud (URL only)",
                "Personio",
                "BambooHR",
                "Breezy HR",
                "Teamtailor",
                "Gem",
                "Rippling",
                "Pinpoint",
                "Jobvite",
                "JazzHR"
              ]
            }
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Keep jobs whose title contains ANY of these words (case-insensitive). Example: [\"engineer\", \"data\"]. Set searchInDescription to true to also match the description.",
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Exclude title keywords",
            "type": "array",
            "description": "Drop jobs whose title contains any of these words. Example: [\"intern\", \"senior\"].",
            "items": {
              "type": "string"
            }
          },
          "searchInDescription": {
            "title": "Search keywords in descriptions",
            "type": "boolean",
            "description": "Also match keywords inside the job description (whole-word match, so \"go\" won't match \"Google\"). Descriptions are fetched for matching but only included in the output when \"Include job description\" is on. Slower on platforms that need one request per job (SmartRecruiters, Workday, Oracle, BambooHR, Rippling).",
            "default": false
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Keep jobs whose location, city, country or ISO country code contains ANY of these. Example: [\"London\", \"Germany\", \"US\", \"Remote\"]. \"Remote\" also matches jobs flagged remote.",
            "items": {
              "type": "string"
            }
          },
          "departments": {
            "title": "Departments / teams",
            "type": "array",
            "description": "Keep jobs whose department or team contains ANY of these. Example: [\"Engineering\", \"Sales\"].",
            "items": {
              "type": "string"
            }
          },
          "remoteOnly": {
            "title": "Remote jobs only",
            "type": "boolean",
            "description": "Keep only jobs flagged remote (from the ATS remote/workplace field, or \"Remote\" in the location).",
            "default": false
          },
          "postedSince": {
            "title": "Posted since",
            "type": "string",
            "description": "Keep jobs posted after this date. Absolute (\"2026-10-01\") or relative (\"7 days\", \"24 hours\", \"2 weeks\"). Platforms without a posted date use the last-updated date."
          },
          "includeDescription": {
            "title": "Include job description",
            "type": "boolean",
            "description": "Add descriptionText and descriptionHtml to each job (emails, phone numbers and named recruiters removed) and extract salary from the text. Slower on SmartRecruiters, Workday, Oracle, BambooHR and Rippling (one extra request per job).",
            "default": false
          },
          "maxJobs": {
            "title": "Max jobs (total)",
            "minimum": 0,
            "type": "integer",
            "description": "Cost cap: stop after this many jobs across all companies (each job is one billed result). 0 = no total limit. Example: 50.",
            "default": 0
          },
          "maxJobsPerCompany": {
            "title": "Max jobs per company",
            "minimum": 0,
            "type": "integer",
            "description": "Cost cap: at most this many jobs per company (each job is one billed result). Default 100. Set 0 to get every open job (large Workday/Oracle boards can have 5,000+). In monitoring modes, jobs beyond the cap show up as new in later runs, so use 0 there.",
            "default": 100
          },
          "monitorMode": {
            "title": "Monitoring mode",
            "enum": [
              "off",
              "new",
              "changes"
            ],
            "type": "string",
            "description": "off (default) = return all matching jobs. new = only jobs not returned in earlier runs with the same stateKey (the first run is the baseline and returns everything). changes = new jobs plus a record with changeType \"removed\" for each previously returned job that has closed. Use with a schedule.",
            "default": "off"
          },
          "onlyNewSinceLastRun": {
            "title": "Only new jobs since last run (legacy)",
            "type": "boolean",
            "description": "Same as monitoring mode \"new\". Kept for backwards compatibility.",
            "default": false
          },
          "stateStoreName": {
            "title": "State store name",
            "type": "string",
            "description": "Named key-value store that keeps seen job IDs between runs.",
            "default": "career-jobs-state"
          },
          "stateKey": {
            "title": "Monitor ID",
            "type": "string",
            "description": "Use different IDs to keep separate watch lists (e.g. one per client or alert).",
            "default": "default"
          },
          "maxConcurrency": {
            "title": "Max concurrent companies",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many companies to fetch in parallel (1-10). Keep it low to be polite.",
            "default": 4
          },
          "detailConcurrency": {
            "title": "Concurrent detail requests per board",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Parallel per-job detail requests (descriptions, exact dates) on platforms that need them (1-20).",
            "default": 8
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 5,
            "maximum": 120,
            "type": "integer",
            "description": "Per-request timeout. Failed requests are retried up to 3 times with backoff.",
            "default": 30
          },
          "verifyCompanyName": {
            "title": "Verify company name on guessed boards",
            "type": "boolean",
            "description": "When a board was found by guessing a slug from a name or domain, check that the board's company name matches. Mismatches are skipped (status uncertain_match, nothing charged). Turn off only if you know your names are exact slugs.",
            "default": true
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}