{
  "openapi": "3.0.1",
  "info": {
    "title": "ATS Job Postings Scraper - 12 Platforms, Auto-Detect, No Key",
    "description": "Live job postings from Greenhouse, Lever, Ashby, Recruitee, Workable, Rippling, Pinpoint, Breezy, BambooHR, Personio, Eightfold and Taleo. Auto-detects each company's ATS. No API key, one schema.",
    "version": "1.0",
    "x-build-id": "ERL8zVr0aoLeWxkD6"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/maydit~ats-job-postings-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-maydit-ats-job-postings-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/maydit~ats-job-postings-scraper/runs": {
      "post": {
        "operationId": "runs-sync-maydit-ats-job-postings-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/maydit~ats-job-postings-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-maydit-ats-job-postings-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 (auto-detect ATS)",
            "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).",
            "items": {
              "type": "string"
            }
          },
          "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>.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "lever": {
            "title": "Lever companies",
            "type": "array",
            "description": "Known Lever slugs, e.g. 'spotify', 'palantir' - the path segment of https://jobs.lever.co/<slug>.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "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>.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "recruitee": {
            "title": "Recruitee companies",
            "type": "array",
            "description": "Known Recruitee subdomains, e.g. 'bunq' - the first label of https://<slug>.recruitee.com.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "workable": {
            "title": "Workable accounts",
            "type": "array",
            "description": "Known Workable account slugs, e.g. 'blueground' - the path segment of https://apply.workable.com/<slug>.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "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).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "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).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "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.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "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).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "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.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "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.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "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.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "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.",
            "default": false
          },
          "titleContains": {
            "title": "Title contains",
            "type": "string",
            "description": "Only jobs whose title contains this text (case-insensitive), e.g. 'engineer', 'sales'."
          },
          "locationContains": {
            "title": "Location contains",
            "type": "string",
            "description": "Only jobs whose location contains this text (case-insensitive), e.g. 'remote', '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.",
            "default": false
          },
          "maxResults": {
            "title": "Max results",
            "minimum": 1,
            "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.",
            "default": 2000
          },
          "maxRunSeconds": {
            "title": "Max run seconds",
            "minimum": 30,
            "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.",
            "default": 240
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}