Tools / ATS Jobs Openings Scraper – 10 ATS Platforms, One Schema

ATS Jobs Openings Scraper – 10 ATS Platforms, One Schema

Live job postings from any company's Greenhouse, Ashby, Lever, Recruitee, Workable, SmartRecruiters or Workday career board, normalized into one schema with city/region/country, remote status and salary wherever the board publishes it — including Greenhouse boards, where the pay range is printed in the posting rather than exposed as an API field (139 of 166 live airbnb postings carry one). Don't know which ATS a company uses? Leave it out and the Actor auto-detects the platform from the slug alone. Filter by title, location, department or team, posting-date window or a keyword in the full description text; watch mode returns only the postings that are new since your last run.

Give it a list of companies as {"ats": "auto|greenhouse|ashby|lever|recruitee|workable|smartrecruiters|workday", "slug": "..."} and it pulls every live posting straight from each company's own career-board API — no browser, no login. Omit ats or set it to "auto" and it tries all 6 non-Workday platforms for that slug and keeps whichever one is real — you only need to know the company, not the ATS. Seven ATSes normalized into one schema — the only one of these seven to also include Recruitee. Hand-typed board locations are normalized into city/region/country, so you can group or filter by country without writing a location parser — neither Greenhouse nor Workday publishes usable structured geography, and the same normaliser fills country on 95% of 1,914 live Greenhouse postings and on 100% of Workday postings once descriptions are fetched (35% from the cheap list call alone). Measured on 800 live Workday postings, locationKeyword: "United States" matched 0 of them before and matches 89 now; on Greenhouse the same filter matches a posting whose own text only reads "San Francisco, CA". Greenhouse returns only the leaf department, and on 76% of 1,909 live postings that leaf is a nested internal name, so department used to report an internal cost-centre code: one Stripe board showed 191 distinct “departments”. Since 0.1.36 the board's department tree is resolved once per company, so department is the real top-level department (191 → 4 on Stripe, 44 → 13 on Databricks, 29 → 3 on Airbnb), team is the sub-team it sits under (filled on 76% of Greenhouse postings, previously always empty) and departmentPath is the whole chain. departmentKeyword matches any level of that chain, so a filter written against either the top-level name or the leaf keeps working. Supports titleKeyword/titleExcludeKeyword, locationKeyword/locationExcludeKeyword, hasSalary/minSalary/maxSalary, remoteOnly and postedAfter filters applied before you're charged — a salary floor costs you nothing on the postings it rejects. Companies that have moved off an ATS (common for Lever) are skipped with a warning instead of failing the run. No start fee.

Run it

Pay-per-result on Apify, no FetchSmith account needed. Use your own Apify API token, or hit Run on the Store page with no token at all.

curl -X POST "https://api.apify.com/v2/acts/fetchsmith~ats-jobs-scraper/run-sync-get-dataset-items?clean=true" \
  -H "Authorization: Bearer YOUR_APIFY_TOKEN" -H "Content-Type: application/json" \
  -d '{"companies": [{"ats": "greenhouse", "slug": "airbnb"}, {"ats": "ashby", "slug": "ramp"}, {"ats": "smartrecruiters", "slug": "ElasticBandCompany"}], "maxJobsPerCompany": 25, "maxResults": 75}'

Returns the rows as JSON when the run finishes. A hosted FetchSmith API (one key, no Apify account, see API docs) is planned but not open yet.

Output fields

company atsSource jobId title department team departmentPath employmentType workplaceType isRemote location secondaryLocations country region city salaryMin salaryMax salaryCurrency salaryInterval publishedAt updatedAt jobUrl applyUrl descriptionHtml descriptionText scrapedAt watchEvent previousHasSalary

Sample output

{
  "atsSource": "greenhouse",
  "city": "London",
  "company": "airbnb",
  "country": "United Kingdom",
  "department": "2. Business",
  "departmentPath": [
    "2. Business",
    "Sales \u0026 Partnerships",
    "Business Development"
  ],
  "isRemote": false,
  "jobUrl": "https://careers.airbnb.com/positions/8184174?gh_jid=8184174",
  "location": "London, United Kingdom",
  "region": "England",
  "salaryCurrency": "GBP",
  "salaryInterval": "year",
  "salaryMax": 54000,
  "salaryMin": 46000,
  "team": "Business Development",
  "title": "Account Manager"
}

Guides

Only publicly accessible pages are read. Respect the source site's terms when using the data.