ATS Jobs API - Greenhouse, Lever, Ashby, Workday & More
Pricing
from $2.00 / 1,000 results
ATS Jobs API - Greenhouse, Lever, Ashby, Workday & More
Job postings from 8 ATSs via official public endpoints: Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Recruitee, Teamtailor, Personio. Delta mode returns only NEW jobs since the last run, with webhook alerts. No API keys needed.
Pricing
from $2.00 / 1,000 results
Rating
0.0
(0)
Developer
Starsurfer
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
a day ago
Last modified
Categories
Share
ATS Jobs API — Greenhouse, Lever, Ashby, Workday & More Job Postings Scraper
Pull clean, structured job postings straight from company career sites — a job board API and job scraper built on each ATS's official public endpoints, not fragile HTML scraping. Point it at any careers page and get normalized JSON back. Built-in delta mode returns only jobs that are new since your last run (new job alerts without duplicates), and an optional webhook pings your endpoint the moment new jobs appear.
No API keys. No LLM costs. No proxies needed.
Supported applicant tracking systems
| ATS | What to provide | Endpoint used |
|---|---|---|
| Greenhouse | Board URL, e.g. https://boards.greenhouse.io/stripe | Official Job Board API |
| Lever | Board URL, e.g. https://jobs.lever.co/spotify (EU boards supported) | Official Postings API |
| Ashby | Board URL, e.g. https://jobs.ashbyhq.com/ramp | Official Job Posting API |
| Workday | Careers URL, e.g. https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite | Official CXS JSON API |
| SmartRecruiters | Careers URL or smartrecruiters:CompanyId | Official public Posting API |
| Recruitee | Careers URL or recruitee:tenant | Official public offers API |
| Teamtailor | Careers URL or teamtailor:tenant | Official jobs feed |
| Personio | Careers URL or personio:tenant | Official public jobs feed |
Mix any number of companies across all eight systems in a single run — one unified schema for scraping Greenhouse jobs, Lever postings, Ashby boards, Workday careers pages, and more.
Why this actor
- Delta mode (the killer feature). The actor remembers every job it has seen per company. Each run returns only new postings — perfect for job alerts, lead generation (new roles = hiring signal = budget), talent-market intelligence, or feeding a job board or aggregator without duplicates.
- Webhook alerts. Give it a URL (Zapier, Make, n8n, Slack-compatible bridge, your own API) and it POSTs the full list of new jobs whenever there are any. Silent when nothing changed — no noise.
- Official endpoints only. These are the same JSON/XML feeds the career sites themselves use. No brittle CSS selectors, no headless browsers, no anti-bot arms race — which means it's fast, cheap, and stable.
- Normalized output. One consistent schema across all eight ATSs:
title,company,url,location,department,employmentType,postedAt,description, and more.
Input example
{"sources": ["https://boards.greenhouse.io/stripe","https://jobs.lever.co/spotify","https://jobs.ashbyhq.com/ramp","https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite","https://jobs.smartrecruiters.com/Bosch","recruitee:framestore","teamtailor:statsperform","personio:demo"],"deltaMode": true,"webhookUrl": "https://hooks.example.com/new-jobs"}
Schedule it (hourly/daily) in the Apify console and you have a zero-maintenance new-jobs monitor.
Output example
{"ats": "greenhouse","company": "stripe","id": "7954688","title": "Account Executive, AI Sales","url": "https://stripe.com/jobs/search?gh_jid=7954688","location": "San Francisco, CA","department": "Sales","postedAt": "2026-06-02T08:58:57-04:00","firstSeenAt": "2026-07-19T14:00:00.000Z","source": "greenhouse:stripe","isNew": true}
Delta mode details
- First run of a source seeds the memory and returns all current jobs (flagged
isFirstRun). By default the webhook does not fire on a first run (enablewebhookOnFirstRunif you want it). - Subsequent runs return only postings whose ID wasn't seen before. Removed/filled jobs are dropped from memory automatically (and counted in the run summary as
removedJobs). - A run with zero new jobs pushes a single
isSummary: trueheartbeat item, so you can tell "no new jobs" apart from "run failed". - State lives in a named key-value store in your Apify account (
ats-jobs-api-stateby default). Use differentstateStoreNamevalues to run independent watchlists. - Turn
deltaModeoff to get a full snapshot of every job on every run.
Webhook payload
{"event": "ats-jobs.new-jobs","actorRunId": "...","timestamp": "2026-07-19T14:00:00.000Z","totalNewJobs": 3,"sources": [{ "source": "greenhouse:stripe", "totalJobs": 524, "newJobs": 3, "removedJobs": 1, "ok": true }],"newJobs": [ { "...": "same objects as the dataset" } ]}
Delivery is retried 3× with backoff. A run summary is always saved to the SUMMARY key of the run's key-value store.
Common use cases
- Job alerts for candidates: watch dream companies across Greenhouse, Lever, Ashby and Workday, get pinged the hour a role opens.
- Sales/lead intelligence: new job postings are the classic hiring signal — new engineering roles at a target account mean budget and growth.
- Recruiting & talent mapping: track competitors' hiring by department and location over time.
- Job boards & aggregators: clean, deduplicated, ATS-agnostic job feed with zero scraping infrastructure.
- Market research: hiring velocity by company, geography, or function.
FAQ
Does it need API keys or logins? No. All eight ATSs expose public listing feeds for their hosted career sites; this actor reads those directly.
How fresh is the data? As fresh as your schedule — the feeds are live. Hourly schedules work fine and stay cheap because delta mode only bills for new results.
Which ATS is a company on? Look at their careers page URL: boards.greenhouse.io/x → Greenhouse, jobs.lever.co/x → Lever, jobs.ashbyhq.com/x → Ashby, *.myworkdayjobs.com → Workday, and so on. Paste the URL — the actor auto-detects the system.
A company's careers page isn't on one of these eight — will it work? Not yet. The actor tells you exactly which sources it couldn't parse in the run summary. More ATSs may be added — leave a request in the Issues tab.
What if an ATS changes its endpoint? The actor is tested daily by an automated run across all eight systems. If a feed breaks, it gets fixed — that's the point of using one actor instead of maintaining your own scraper.
Also by signalgrove: AI Search Rank Tracker — monitor how your brand ranks in ChatGPT and Gemini answers (GEO/AI visibility).