{
  "title": "ATS Job Postings Scraper",
  "type": "object",
  "schemaVersion": 1,
  "properties": {
    "companies": {
      "title": "Company board slugs or URLs",
      "type": "array",
      "description": "Company slugs - the Actor tries all twelve ATS platforms (Greenhouse, Lever, Ashby, Recruitee, Workable, then Rippling, Breezy HR, Pinpoint, BambooHR, Personio, Eightfold, Oracle Taleo) and finds where each company hosts its jobs; the match is reported in the ats column. A slug is the identifier from the company's careers URL - usually the lowercase company name ('stripe', 'spotify', 'ramp'), but on Rippling, BambooHR and Taleo it can differ from the name, so copy it from a posting link (see the per-platform fields). A full board or posting URL on any of the twelve platforms also works and skips detection. Pre-filled with the sample 'stripe', 'spotify', 'ramp': clear it when you only use the per-platform fields below, so that only what you list is scraped (a run that names no company at all scrapes the three sample companies).",
      "editor": "stringList",
      "prefill": [
        "stripe",
        "spotify",
        "ramp"
      ],
      "sectionCaption": "1 · Choose companies",
      "sectionDescription": "Use supported board slugs or URLs. Clear sample companies when using only direct platform lists."
    },
    "titleContains": {
      "title": "Job title contains",
      "type": "string",
      "description": "Only jobs whose title contains this text (case-insensitive), e.g. 'engineer', 'sales'.",
      "editor": "textfield",
      "example": "engineer",
      "sectionCaption": "2 · Filter and size the output",
      "sectionDescription": "These settings apply across the run, not separately to every company."
    },
    "locationContains": {
      "title": "Location contains",
      "type": "string",
      "description": "Only jobs whose location contains this text (case-insensitive), e.g. 'remote', 'new york'.",
      "editor": "textfield",
      "example": "new york"
    },
    "remoteOnly": {
      "title": "Remote only",
      "type": "boolean",
      "description": "Keep only jobs that can be worked fully remotely: the source ATS marks them remote, or one of their listed locations is a remote one (e.g. 'US - Remote'). Hybrid and on-site postings with no remote location are dropped - on Ashby the posting's workplace type and locations decide, because Ashby's own remote flag is also set on hybrid roles. Postings where the ATS publishes no remote flag are dropped, not kept - on Greenhouse, Personio and Taleo, which have no remote field, the flag is inferred from the location text, so prefer 'Location contains: remote' there.",
      "editor": "checkbox",
      "default": false
    },
    "includeDescription": {
      "title": "Include job descriptions",
      "type": "boolean",
      "description": "Attach the full job description (as clean text, capped at 5,000 chars) to each posting. Increases output size. On Greenhouse, Lever, Ashby, Recruitee, Workable and Pinpoint the description comes with the list at no extra request; on Rippling, Breezy HR, BambooHR, Eightfold, Oracle Taleo and description-less Personio boards it costs one extra request per posting (about 0.3-0.7 s each), and on Rippling, Breezy HR, BambooHR and Taleo it is also what fills the posted date, employment type or pay range that those lists do not carry.",
      "editor": "checkbox",
      "default": false
    },
    "maxResults": {
      "title": "Maximum postings across all companies",
      "type": "integer",
      "description": "Hard cap on the total number of postings written across the whole run, not per company. Companies are processed in order, so a cap below the combined total will cut off the companies at the end of your list (the log names them and SUMMARY.maxResultsReached is true) - raise it (or split the run) if you are scraping many large boards.",
      "editor": "number",
      "default": 2000,
      "minimum": 1
    },
    "maxRunSeconds": {
      "title": "Run time budget (seconds)",
      "type": "integer",
      "description": "Wall-clock budget for this run, in seconds. When it is reached the Actor stops cleanly and finishes successfully with the rows it already collected, instead of being killed mid-run. Most boards cost one request per company per platform tried; auto-detection tries up to twelve platforms for a company (cheapest first), so a company on a later platform costs a few seconds of misses before its hit. Eightfold boards page 10 postings per request and Taleo 25, so a board with thousands of postings is a multi-minute run - raise this (and the run timeout in Run options) for those and for any deliberately large job.",
      "editor": "number",
      "default": 240,
      "minimum": 30
    },
    "greenhouse": {
      "title": "Greenhouse board tokens",
      "type": "array",
      "description": "Known Greenhouse board tokens (skips auto-detection), e.g. 'stripe', 'gitlab' - the path segment of https://boards.greenhouse.io/<token> or https://job-boards.greenhouse.io/<token>.",
      "editor": "stringList",
      "default": [],
      "example": [
        "stripe",
        "gitlab"
      ],
      "sectionCaption": "3 · Optional direct platform lists",
      "sectionDescription": "Skip detection when you know the board platform. These entries are combined with Companies."
    },
    "lever": {
      "title": "Lever companies",
      "type": "array",
      "description": "Known Lever slugs, e.g. 'spotify', 'palantir' - the path segment of https://jobs.lever.co/<slug>.",
      "editor": "stringList",
      "default": [],
      "example": [
        "spotify",
        "palantir"
      ]
    },
    "ashby": {
      "title": "Ashby organizations",
      "type": "array",
      "description": "Known Ashby org slugs, e.g. 'ramp', 'linear', 'openai' - the path segment of https://jobs.ashbyhq.com/<slug>.",
      "editor": "stringList",
      "default": [],
      "example": [
        "ramp",
        "openai"
      ]
    },
    "recruitee": {
      "title": "Recruitee companies",
      "type": "array",
      "description": "Known Recruitee subdomains, e.g. 'bunq' - the first label of https://<slug>.recruitee.com.",
      "editor": "stringList",
      "default": [],
      "example": [
        "bunq",
        "channable"
      ]
    },
    "workable": {
      "title": "Workable accounts",
      "type": "array",
      "description": "Known Workable account slugs, e.g. 'blueground' - the path segment of https://apply.workable.com/<slug>.",
      "editor": "stringList",
      "default": [],
      "example": [
        "blueground",
        "ferryhopper"
      ]
    },
    "rippling": {
      "title": "Rippling boards",
      "type": "array",
      "description": "The first path segment of the board URL https://ats.rippling.com/<slug>/jobs - e.g. https://ats.rippling.com/chess/jobs -> \"chess\" (lowercase; slugs are free-form and not always the company name: \"foundant-careers\", \"daversa-partners-jobs-external\"). A job link https://ats.rippling.com/<slug>/jobs/<uuid> works too. The board list gives title, department, locations and url; posted date, employment type, team and pay range come from the per-job detail call, so they are filled only when includeDescription is on (one extra request per posting).",
      "editor": "stringList",
      "default": [],
      "example": [
        "chess",
        "pythian",
        "foundant-careers"
      ]
    },
    "breezy": {
      "title": "Breezy HR boards",
      "type": "array",
      "description": "The subdomain of the career site https://<slug>.breezy.hr - e.g. https://embraer.breezy.hr/ -> \"embraer\"; a posting link such as https://embraer.breezy.hr/p/4658211f5c93-a-p-technician works too. The list gives title, department, employment type, every location with the platform's remote/hybrid flag, posted date and url. Pay is published on the list only as display text (\"$150,000 - $180,000 / year\"), which is not parsed; the description and a structured salary range (where the employer set one) come from the posting page, so they are filled only when includeDescription is on (one extra request per posting).",
      "editor": "stringList",
      "default": [],
      "example": [
        "embraer",
        "plat4mation",
        "kimmel-associates"
      ]
    },
    "pinpoint": {
      "title": "Pinpoint boards",
      "type": "array",
      "description": "The first label of the careers-site host https://<slug>.pinpointhq.com - e.g. https://nypl.pinpointhq.com/en/postings/bfc3f14e-... -> \"nypl\". Any URL on that host works too. One request returns the whole board including descriptions, workplace type, employment type and the structured pay band (min/max/currency, as published per year or per hour). Pinpoint publishes no posted date, so postedAt is always null for these rows. Careers sites on a custom domain cannot be detected; pass the pinpointhq.com slug.",
      "editor": "stringList",
      "default": [],
      "example": [
        "nypl",
        "groupo",
        "weoneil"
      ]
    },
    "bamboohr": {
      "title": "BambooHR boards",
      "type": "array",
      "description": "The subdomain of the hosted careers page https://<slug>.bamboohr.com/careers - e.g. https://401auto.bamboohr.com/careers -> \"401auto\"; a job link https://<slug>.bamboohr.com/careers/<id> works too. Most BambooHR customers embed the board on their own website, so take the subdomain from a posting's Apply or \"Link to This Job\" URL rather than guessing the company name (a wrong guess is reported as not on BambooHR). The list gives title, department, location, workplace type and employment type; the description, posted date and the employer's free-text pay line come from the per-job detail call, so they are filled only when includeDescription is on (one extra request per posting).",
      "editor": "stringList",
      "default": [],
      "example": [
        "401auto",
        "canopy",
        "atomic"
      ]
    },
    "personio": {
      "title": "Personio career pages",
      "type": "array",
      "description": "The first host label of the career page https://<slug>.jobs.personio.de/ (or .jobs.personio.com) - e.g. https://apheris.jobs.personio.de/ -> \"apheris\", https://dfb.jobs.personio.de/ -> \"dfb\"; a posting link https://<slug>.jobs.personio.de/job/<id> works too. Both hosts are tried. The feed gives title, department, office(s), employment type + schedule, posted date and url; descriptions come from the feed when the company publishes them there, otherwise from the posting page (one extra request per posting, includeDescription on). Personio publishes no workplace flag (remote is read from the office text) and no salary.",
      "editor": "stringList",
      "default": [],
      "example": [
        "apheris",
        "dfb",
        "ottonova"
      ]
    },
    "eightfold": {
      "title": "Eightfold boards",
      "type": "array",
      "description": "The subdomain of the careers site https://<tenant>.eightfold.ai/careers - e.g. https://micron.eightfold.ai/careers -> \"micron\"; a job link https://micron.eightfold.ai/careers/job/43322836 works too. Companies that front the site with their own domain (careers.micron.com, talent.bayer.com) still have an eightfold.ai tenant: look for \"<tenant>.eightfold.ai\" in that page's links. Boards page 10 postings per request and the platform allows about 420 requests per 5 minutes per IP, so the Actor paces itself (100 requests at full speed, then 0.8 per second): boards up to ~1,000 postings finish in under a minute, Micron (2,959) takes about 4.5 minutes and Lockheed Martin (5,173) about 9.5 - raise maxRunSeconds for those; a run cut short keeps the newest postings. Descriptions cost one extra request per posting on most tenants. Employment type and salary are not published; the platform's \"remote_local\" work option (remote within the listed country or region) is reported as remote.",
      "editor": "stringList",
      "default": [],
      "example": [
        "amdocs",
        "symetra",
        "app"
      ]
    },
    "taleo": {
      "title": "Oracle Taleo career sections",
      "type": "array",
      "description": "The tenant is the first label of the career-site host: https://hdr.taleo.net/careersection/ex/jobsearch.ftl -> \"hdr\". The default career section is found automatically; when a company uses a non-default section add its code from the URL (\"temple/tu_ex_staff\"), or paste the whole careersection URL. The list gives title, locations, posting date (where the tenant shows one; Temple only publishes it on the job page) and url; description and schedule (Full-time / Part-time) come from the per-job page and are filled only when includeDescription is on (one 75-270 KB page per posting). Legacy joblist.ftl-only sections are not supported. Department, team, workplace type and pay are not published by Taleo lists and stay empty.",
      "editor": "stringList",
      "default": [],
      "example": [
        "hdr",
        "massanf",
        "temple"
      ]
    }
  },
  "description": "Build a watchlist of supported employer boards, add job filters and review the result caps. Missing postings in a bounded run do not establish that a job has closed."
}
