Greenhouse, Lever, Ashby and Workday jobs in one JSON format
You want the open jobs of a list of companies: for a niche job board, hiring signals for sales, or a job alert. Most of these companies publish their jobs through an applicant tracking system (ATS) that has a free public API. The catch is that every ATS answers in its own format.
The public job board APIs, side by side
All five endpoints below answer without a key (checked on 2026-10-12), but the same job looks different in each:
| ATS | Public endpoint | Title / date fields | What to know |
|---|---|---|---|
| Greenhouse | boards-api.greenhouse.io/v1/boards/<board>/jobs | title, first_published, updated_at | Department and description only with ?content=true, pay ranges only with &pay_transparency=true. |
| Lever | api.lever.co/v0/postings/<site>?mode=json | text, createdAt (milliseconds) | Team, location and commitment under categories; EU boards live on api.eu.lever.co. |
| Ashby | api.ashbyhq.com/posting-api/job-board/<name> | title, publishedAt | Compensation only with ?includeCompensation=true. |
| SmartRecruiters | api.smartrecruiters.com/v1/companies/<id>/postings | name, releasedDate | Paged by 100; the description needs one more call per job. |
| Workday | POST <company>.wd<N>.myworkdayjobs.com/wday/cxs/<company>/<site>/jobs | title, postedOn ("Posted 3 Days Ago") | Not a documented API: the endpoint the careers site itself calls. 20 jobs per page, 2,000 at most per site; country, employment type and description need one more call per job. The server number and site name cannot be guessed from the company name. |
So a script that covers several ATS needs one parser per ATS, a way to find which ATS (and which board name) a company uses, and something to remember which jobs it has already seen.
One format for all of them
ATS Job Postings reads those same public endpoints (plus Recruitee and Workable) and returns one row per job in a single format:
title, department, team, locations, isRemote, employmentType,
salaryMin / salaryMax / salaryCurrency when the company publishes them, postedAt in UTC,
applyUrl and the full description as plain text.
- Give careers page URLs, plain company names (
stripe,ramp) or company websites (sourcegraph.com): the ATS is detected for you. For a website, the homepage and one careers page are read to find the job board link; a page that links several companies' boards is skipped, not guessed. - Filter by title keywords, location, department, remote only or posting date for free: filtered-out jobs are not billed.
- With Only new jobs on a daily schedule, each run returns and bills only jobs it has never delivered.
| Data | Tool | Price per job (Starter plan) |
|---|---|---|
| Every open job of each company, one format for seven ATS | ATS Job Postings | $0.0012 per job returned |
Example: 200 companies with 30 open jobs each, 6,000 jobs, cost about $7.20 for the first full pull; with Only new jobs, the daily runs after that only bill the new postings. Companies not found and boards without jobs are free.
When to call the ATS APIs yourself
- All your companies use the same ATS and you already know their board names: one parser is little work, and the API is free.
- You need a field we do not keep, such as Greenhouse custom questions or Lever's raw lists.
When one normalized feed is simpler
- Your list mixes Greenhouse, Lever, Ashby, Workday and others, or you only have company names or websites.
- You want new jobs only, from n8n, Make, Zapier, Google Sheets or an AI agent (MCP), without hosting a database of seen jobs.
Companies that publish jobs only on LinkedIn or Indeed are not in an ATS feed: Google Jobs Scraper covers those by search.
Competitor facts checked on 2026-10-12 from the linked pages; prices change, check them before you decide.