ATS Jobs API — Greenhouse, Lever, Workday & 7 more | $1/1K
Pricing
from $1.00 / 1,000 jobs
ATS Jobs API — Greenhouse, Lever, Workday & 7 more | $1/1K
Paste any company careers URL and get its open jobs in one clean schema. Auto-detects 10 ATSs (Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable, Personio, Teamtailor, Pinpoint, Gem) via their official public job feeds, extracts salaries, and monitor mode returns only new jobs.
Pricing
from $1.00 / 1,000 jobs
Rating
0.0
(0)
Developer
Steadyrow
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 hours ago
Last modified
Categories
Share
ATS Jobs API — Greenhouse, Lever, Workday & 7 more ATSs
Paste a careers URL, get clean job data. $1 per 1,000 jobs.
This Actor pulls open positions straight from 10 applicant tracking systems (ATS) and returns them in one unified schema — no matter which ATS the company uses. It detects the ATS from the URL for you, extracts salary ranges, and has a monitor mode that returns only the jobs that are new since your last run.
- ✅ 10 ATSs, 1 schema — Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable, Personio, Teamtailor, Pinpoint, Gem
- ✅ Just paste a URL — board URLs, job URLs, company careers pages that embed an ATS,
ats:companyidentifiers, or a bare company name - ✅ Salary extraction — structured pay ranges from Ashby, Lever, Pinpoint and Greenhouse pay transparency, plus ranges parsed from the description (Workday, SmartRecruiters, Workable, Gem…)
- ✅ Monitor mode — schedule it daily and pay only for new jobs
- ✅ Official public job-board APIs and feeds — the endpoints and XML/RSS feeds the vendors publish for career sites and job boards. No browser, no proxies, no login → fast and reliable
- ✅ Filters — keywords, excluded words, location, remote, department, posted within N days
- ✅ Privacy-safe — no recruiter names or contact details; e-mail addresses inside descriptions are removed
What can I use it for?
- Job boards & aggregators — feed hundreds of company boards into your site with one schema
- Job alerts — run daily in monitor mode and push new roles to Slack, e-mail or a Google Sheet
- Sales intelligence — hiring signals: which companies are hiring for which teams, where, and at what pay
- Labor-market & salary research — compare roles, locations and pay ranges across companies
- AI agents — a clean, typed job feed your agent can call through the Apify API or MCP
Supported inputs
Put one source per line in Career pages or ATS boards. Mix ATSs freely.
| ATS | Paste any of these |
|---|---|
| Greenhouse | https://boards.greenhouse.io/airbnb, https://job-boards.greenhouse.io/figma, https://job-boards.eu.greenhouse.io/<company>, greenhouse:stripe |
| Lever | https://jobs.lever.co/spotify, https://jobs.eu.lever.co/<company>, lever:palantir |
| Ashby | https://jobs.ashbyhq.com/ramp, ashby:openai |
| Workday | https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite, https://wd3.myworkdaysite.com/recruiting/<tenant>/<site>, workday:nvidia.wd5/NVIDIAExternalCareerSite |
| SmartRecruiters | https://careers.smartrecruiters.com/BoschGroup, smartrecruiters:ServiceNow |
| Workable | https://apply.workable.com/european-dynamics/, https://apply.workable.com/katmai/j/<code>, workable:katmai |
| Personio | https://1komma5grad.jobs.personio.de, https://ottonova.jobs.personio.com, personio:ottonova |
| Teamtailor | https://sats.teamtailor.com/jobs, a Teamtailor career site on the company's own domain (e.g. https://careers.oatly.com/jobs), teamtailor:sats, teamtailor:careers.oatly.com |
| Pinpoint | https://impulsespace.pinpointhq.com, pinpoint:intermedia |
| Gem | https://jobs.gem.com/nominal, gem:function-health |
| Any | A company's own careers page (we look for the embedded ATS board), or just a name like openai (tried on Greenhouse, Ashby, Lever and SmartRecruiters — for the other ATSs use a URL or an ats: prefix) |
Job URLs work too — https://jobs.lever.co/spotify/<job-id> scrapes the whole Spotify board.
Input example
{"sources": ["https://boards.greenhouse.io/airbnb","https://jobs.lever.co/spotify","https://jobs.ashbyhq.com/ramp","https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite","https://careers.smartrecruiters.com/BoschGroup","https://apply.workable.com/european-dynamics/","https://1komma5grad.jobs.personio.de","https://sats.teamtailor.com/jobs","https://impulsespace.pinpointhq.com","https://jobs.gem.com/nominal"],"keywords": ["engineer", "data"],"excludeKeywords": ["intern"],"locations": ["United States", "Remote"],"remote": "any","postedWithinDays": 14,"maxItemsPerSource": 200,"includeDescription": true,"monitorMode": false}
| Field | What it does |
|---|---|
sources | Boards to scrape (see above). Required. |
keywords | Keep jobs whose title contains any of these words (whole word, case-insensitive). Set searchInDescription to also search the description. |
excludeKeywords | Drop jobs whose title contains any of these words. |
locations | Keep jobs whose location, any secondary location, or country contains one of these words. remote matches remote jobs. |
remote | any, remote_only, or exclude_remote. |
departments | Keep jobs whose department or team contains one of these strings. |
postedWithinDays | Only jobs posted in the last N days. |
maxItemsPerSource / maxItems | Limits per board / per run (0 = no limit). |
includeDescription / includeDescriptionHtml | Plain-text and/or HTML description. |
fetchGreenhouseSalary | Read Greenhouse pay-transparency ranges (one extra request per Greenhouse job without a salary in its text). |
monitorMode | Output only jobs not delivered in earlier runs. |
monitorStateName | Name of the store that remembers delivered jobs — use a different name per independent monitor. |
Output example
Every job has the same fields, whatever the ATS:
{"job_id": "ashby:ramp:34413f8d-26bf-4bbc-8ade-eb309a0e2245","ats": "ashby","company": "Ramp","company_board_id": "ramp","title": "Security Engineer, Cloud","department": "Engineering","team": "Backend","location": "New York, NY (HQ)","locations": ["New York, NY (HQ)", "Remote (Canada)", "Remote (US)", "Miami, FL"],"country": "USA","remote": true,"workplace_type": "hybrid","employment_type": "FULL_TIME","posted_at": "2026-04-07T17:12:35.753Z","updated_at": null,"salary_min": 211400,"salary_max": 290600,"salary_currency": "USD","salary_period": "YEAR","salary_source": "ats","description_text": "About Ramp\n\nRamp is building the smart infrastructure for finance teams…","apply_url": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application","source_url": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245","input": "https://jobs.ashbyhq.com/ramp","scraped_at": "2026-10-19T20:21:09.179Z"}
| Field | Notes |
|---|---|
job_id | Stable across runs: ats:board:job. |
remote | true when the job can be done remotely (Ashby "remote allowed", Workable "telecommuting", Lever/SmartRecruiters/Teamtailor/Pinpoint/Gem workplace type, or "Remote" in a location). null when the ATS does not say. |
workplace_type | remote, hybrid, onsite, or null when the ATS does not say. |
employment_type | FULL_TIME, PART_TIME, CONTRACT, TEMPORARY, INTERN, OTHER, or null. |
salary_* | salary_source is ats (structured field) or description (parsed from text); all null when no range is published. |
posted_at | First-published date (Workday and Workable: day precision). Pinpoint does not publish a date, so it is null there. |
A run summary (per board: listed / output / errors) is saved in the default key-value store as SUMMARY.
Monitor mode: only new jobs
- Turn on Monitor mode and save the input as a task.
- Add a schedule (e.g. every morning).
- The first run returns all matching jobs. Every later run returns only jobs you have not received yet — and you only pay for those.
Delivered job IDs are kept per board in a named key-value store (monitorStateName, default ats-jobs-monitor) for 90 days after a job was last seen. If you run several independent monitors on the same boards, give each task its own monitorStateName.
Pricing
Pay per event — you pay only for what you get:
| Event | Price |
|---|---|
| Job in the dataset | $0.001 ($1 per 1,000 jobs) |
| Actor start | $0.002 per run |
Examples: 1,000 jobs ≈ $1. A daily monitor on 20 boards that finds 30 new jobs a day ≈ $0.03 + $0.002 per day. Apify's free plan credits cover the first few thousand jobs every month. Set Maximum cost per run on the run to cap spending — the Actor stops cleanly at the limit.
Good to know
- Workday returns at most ~2,000 jobs per search. For very large Workday sites, add
keywords(they are sent to Workday's own search) to get past the cap. - Workday does not publish departments, so the
departmentsfilter removes Workday jobs. - Lever, Ashby, Workday, Pinpoint and Gem do not expose a display name for the company;
companyis derived from the board name (e.g.nvidia→Nvidia). Greenhouse, SmartRecruiters, Workable, Personio and Teamtailor return the real company name. - Personio feeds contain the description only when the company publishes it in its XML feed (often only part of the jobs); the other fields are always there. Personio has no country field.
- Teamtailor and Pinpoint feeds have no employment type; Pinpoint has no posting date, so
postedWithinDayscannot filter Pinpoint jobs (they are kept). - Workable short links (
apply.workable.com/j/<code>) do not name the company; we open the page to find the account, but pastingapply.workable.com/<account>is faster. - SmartRecruiters company IDs are case-sensitive (
BoschGroup, notboschgroup). An unknown ID is reported in the log and inSUMMARY. - Some company careers pages block automated requests. In that case paste the ATS board URL directly — we never try to bypass bot protection.
- Requests are rate-limited (about 4 per second per ATS host) to be a good citizen.
Is it legal?
The Actor reads public job postings through the ATS vendors' official public job-board APIs — the same endpoints that power the companies' own career pages. It does not log in, does not bypass any protection, and does not output personal data: recruiter names and contact details are never collected, and e-mail addresses inside job descriptions are replaced with [email removed]. You are responsible for how you use the data; if in doubt, consult a lawyer.
Feedback
Missing an ATS or a field? Open an issue on the Actor's Issues tab — requests are usually handled within a few days.