{
  "openapi": "3.0.1",
  "info": {
    "title": "Career Page Jobs Scraper - Greenhouse, Lever, Workday & ATS",
    "description": "Career page jobs scraper and ATS jobs scraper: scrape job postings from Greenhouse, Lever, Ashby, Workday + 13 more ATSs, live from company domains or career-page URLs, auto-detected. Salary, remote, new-job alerts. $1/1,000 jobs.",
    "version": "0.1",
    "x-build-id": "MOxWHcNmh8h5UaMQ5"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/tidytools~ats-career-site-jobs/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-tidytools-ats-career-site-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/tidytools~ats-career-site-jobs/runs": {
      "post": {
        "operationId": "runs-sync-tidytools-ats-career-site-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/tidytools~ats-career-site-jobs/run-sync": {
      "post": {
        "operationId": "run-sync-tidytools-ats-career-site-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 (career pages, websites or job board URLs)",
            "type": "array",
            "description": "Main input (fill this, or `sources`). One company per line: a job board URL (https://job-boards.greenhouse.io/airbnb, https://jobs.lever.co/leverdemo), a career page or website (stripe.com: the board is detected) or ats:slug (greenhouse:airbnb). 17 ATSs: Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable, Recruitee, Personio, Breezy HR, Teamtailor, BambooHR, Rippling, Pinpoint, Gem, JazzHR, Homerun, Freshteam. Invalid lines and companies without a readable board get a free error row.",
            "items": {
              "type": "string"
            }
          },
          "companyPreset": {
            "title": "Company list preset (optional)",
            "enum": [
              "ai-labs",
              "fintech",
              "developer-tools",
              "remote-first",
              "european-tech",
              "enterprise-workday"
            ],
            "type": "string",
            "description": "Add a ready-made list of companies whose job boards were checked to work. It is merged with Companies above (the same board is read once), so you can use a preset alone or add your own companies. Boards that close later get a free error row. Values: ai-labs, fintech, developer-tools, remote-first, european-tech, enterprise-workday."
          },
          "mode": {
            "title": "What to return",
            "enum": [
              "jobs",
              "detect"
            ],
            "type": "string",
            "description": "Jobs mode charges per job returned. Detection mode charges per company whose ATS was identified, and returns no job rows. Values: jobs = Jobs: one row per open job; detect = ATS detection only: one row per company (which ATS, board URL, job count, top departments and locations).",
            "default": "jobs"
          },
          "sources": {
            "title": "Extra sources: public remote-job feeds (optional)",
            "type": "array",
            "description": "Add jobs from public job feeds whose terms allow reuse with attribution. Same price per job and same filters as company jobs. Rows have source and attribution; link back to jobUrl when you republish them. Works with or without companies.",
            "items": {
              "type": "string",
              "enum": [
                "remoteok",
                "hackernews"
              ],
              "enumTitles": [
                "Remote OK (remoteok.com API, about 100 latest remote jobs)",
                "Hacker News: latest \"Ask HN: Who is hiring?\" thread (official HN API)"
              ]
            }
          },
          "maxJobsPerCompany": {
            "title": "Max jobs per company",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Stop taking jobs from one company after this many (after filters). 0 = all open jobs.",
            "default": 0
          },
          "maxJobs": {
            "title": "Max jobs (whole run)",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "Stop after this many jobs in total. You pay only for jobs returned: 10,000 jobs cost at most $10 on the Free plan.",
            "default": 10000
          },
          "descriptionFormat": {
            "title": "Job description",
            "enum": [
              "text",
              "html",
              "both",
              "none"
            ],
            "type": "string",
            "description": "Same price either way. Values: text = Plain text (descriptionText); html = HTML (descriptionHtml); both = Both; none = None (faster; Workday, SmartRecruiters, Rippling and BambooHR need one extra request per job for descriptions).",
            "default": "text"
          },
          "titleKeywords": {
            "title": "Job title contains (any of)",
            "type": "array",
            "description": "Keep jobs whose title contains at least one of these words or phrases (case-insensitive), e.g. engineer, data scientist. Whole words and their common forms match (engineer finds Engineering, java does not find JavaScript); use * for part of a word (*entwickler). Filtered jobs are not charged.",
            "items": {
              "type": "string"
            }
          },
          "excludeTitleKeywords": {
            "title": "Job title must not contain",
            "type": "array",
            "description": "Drop jobs whose title contains any of these, e.g. intern, senior (intern drops Intern and Internship, not International).",
            "items": {
              "type": "string"
            }
          },
          "locationKeywords": {
            "title": "Location contains (any of)",
            "type": "array",
            "description": "Keep jobs whose location, other locations or country contain one of these, e.g. London, Germany, US, Remote.",
            "items": {
              "type": "string"
            }
          },
          "departments": {
            "title": "Department or team contains (any of)",
            "type": "array",
            "description": "Keep jobs whose department or team contains one of these, e.g. Engineering, Sales.",
            "items": {
              "type": "string"
            }
          },
          "remoteOnly": {
            "title": "Remote jobs only",
            "type": "boolean",
            "description": "Keep jobs marked remote by the ATS or with \"remote\" in the location.",
            "default": false
          },
          "postedWithinDays": {
            "title": "Posted in the last N days",
            "minimum": 0,
            "maximum": 3650,
            "type": "integer",
            "description": "Keep jobs first published in the last N days. 0 = any date. Jobs without a publication date are dropped when this is set (Homerun feeds have no publication date; Workday gives \"Posted N Days Ago\"; JazzHR dates are the job's creation time).",
            "default": 0
          },
          "seniority": {
            "title": "Experience level (any of)",
            "type": "array",
            "description": "Keep jobs at these experience levels. The level (output field seniority) comes from the ATS's own level field where it has one (Personio, BambooHR, JazzHR), else an internship employment type, else words in the job title (Senior, Jr., Intern, Engineering Manager, Staff Engineer, VP, Engineer II...). A title without such words (\"Software Engineer\", \"Product Manager\") has no level and is dropped unless you tick the next option. Empty = all levels. Dropped jobs are not charged.",
            "items": {
              "type": "string",
              "enum": [
                "internship",
                "entry",
                "mid",
                "senior",
                "lead",
                "executive"
              ],
              "enumTitles": [
                "Internship / working student / apprenticeship",
                "Entry level / junior / graduate",
                "Mid level",
                "Senior",
                "Lead / manager / staff / principal",
                "Executive (director, head of, VP, C-level)"
              ]
            }
          },
          "includeUnknownSeniority": {
            "title": "Also keep jobs without a known experience level",
            "type": "boolean",
            "description": "With an experience level selected: also keep jobs whose level could not be derived (seniority null). Many titles name no level, so this keeps more jobs that may still fit.",
            "default": false
          },
          "minSalary": {
            "title": "Minimum salary",
            "minimum": 0,
            "type": "integer",
            "description": "Keep jobs whose stated salary reaches this amount (in the currency and period below), e.g. 100000 per year. Only jobs that state a salary are compared (from the ATS's pay fields or a range written in the description); see the option below for jobs without one. Empty or 0 = no salary filter. Dropped jobs are not charged. With this set, job descriptions are read even when Description format is None (to find salaries written there), which makes big runs slower but costs nothing extra."
          },
          "minSalaryCurrency": {
            "title": "Minimum salary currency",
            "type": "string",
            "description": "Three-letter currency code of the minimum salary, e.g. USD, EUR, GBP, CAD, INR. Salaries in other currencies are converted with built-in approximate exchange rates (see the next option).",
            "default": "USD"
          },
          "minSalaryPeriod": {
            "title": "Minimum salary period",
            "enum": [
              "year",
              "month",
              "week",
              "day",
              "hour"
            ],
            "type": "string",
            "description": "The period of the minimum salary. Salaries given for another period are compared as yearly amounts: hour x 2080, day x 260, week x 52, month x 12.",
            "default": "year"
          },
          "salaryMatch": {
            "title": "Salary must",
            "enum": [
              "overlap",
              "guaranteed"
            ],
            "type": "string",
            "description": "Values: overlap = the top of the job's salary range reaches your minimum (a 90,000-120,000 job passes a 100,000 minimum); guaranteed = the bottom of the range does (that job fails).",
            "default": "overlap"
          },
          "convertSalaryCurrency": {
            "title": "Compare salaries in other currencies (approximate rates)",
            "type": "boolean",
            "description": "On: a salary in another currency is converted with fixed approximate exchange rates (about 45 currencies, rounded rates of autumn 2026; can be some percent off) before comparing. The job's own salary fields are never converted. Off: only jobs in the minimum salary's currency are compared; others count as without a salary.",
            "default": true
          },
          "keepJobsWithoutSalary": {
            "title": "Keep jobs that state no salary",
            "type": "boolean",
            "description": "With a minimum salary: keep jobs whose salary is not stated (or has no period, or cannot be compared) instead of dropping them. Most job boards publish salaries only where the law requires it (US states, EU pay transparency), so dropping them removes most jobs.",
            "default": true
          },
          "excludeEvergreen": {
            "title": "Exclude talent pools and general applications",
            "type": "boolean",
            "description": "Skip likely evergreen postings such as Talent Community, General Application and Future Opportunities. Skipped jobs are not saved or charged. Off by default; returned job rows still include evergreen: true/false.",
            "default": false
          },
          "onlyNewJobs": {
            "title": "Only new jobs since the last run",
            "type": "boolean",
            "description": "Remember the jobs of every company and return only jobs that were not there on the previous run of the same monitor (the first run returns everything and becomes the baseline). Unchanged jobs are not output and not charged. Ideal for daily schedules.",
            "default": false
          },
          "reportClosedJobs": {
            "title": "Report closed jobs",
            "type": "boolean",
            "description": "With only-new-jobs on: add a free row (changeType \"closed\") for every job that disappeared since the last run.",
            "default": true
          },
          "monitorName": {
            "title": "Monitor name",
            "type": "string",
            "description": "Runs with the same name are compared with each other (letters, digits, dashes). Use different names for different company lists or filters. Default: \"default\"."
          },
          "guessBoards": {
            "title": "Guess the board when a website does not link it",
            "type": "boolean",
            "description": "If a company website does not link its job board, try boards named after the domain (e.g. stripe.com → greenhouse:stripe) on Greenhouse, Lever, Ashby, Workable, Recruitee, SmartRecruiters, Personio, Teamtailor, Pinpoint, BambooHR, Homerun and Gem, and accept one only when its company name or job texts match the domain.",
            "default": true
          },
          "dedupeAcrossBoards": {
            "title": "Remove the same job found on two boards",
            "type": "boolean",
            "description": "When the same company, title and location appear on two different boards or sources in one run (e.g. a company's own board and Remote OK), only the first is returned. Duplicates are free.",
            "default": true
          },
          "httpVia": {
            "title": "Career page requests from",
            "enum": [
              "auto",
              "backend",
              "direct",
              "vm"
            ],
            "type": "string",
            "description": "How company websites are read to find the job board. Job board APIs are read from Apify's network, except with \"Our second server only\": then career pages and job board API requests go through our second server (a different IP, for boards that refuse data-center networks); Workday searches (POST requests) still go from Apify's network.",
            "default": "auto"
          },
          "maxConcurrency": {
            "title": "Companies in parallel",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many companies are processed at the same time.",
            "default": 5
          },
          "companyTimeoutSecs": {
            "title": "Time limit per company (seconds)",
            "minimum": 30,
            "maximum": 3600,
            "type": "integer",
            "description": "A company that takes longer gets a timeout error row (not charged) so one slow board cannot hold the run.",
            "default": 600
          },
          "proxyConfiguration": {
            "title": "Proxy (optional)",
            "type": "object",
            "description": "Only used for requests sent from Apify's network. Apify proxy usage is billed to your Apify account. Not needed for the supported job boards."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}