PlainRows

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:

ATSPublic endpointTitle / date fieldsWhat to know
Greenhouseboards-api.greenhouse.io/v1/boards/<board>/jobstitle, first_published, updated_atDepartment and description only with ?content=true, pay ranges only with &pay_transparency=true.
Leverapi.lever.co/v0/postings/<site>?mode=jsontext, createdAt (milliseconds)Team, location and commitment under categories; EU boards live on api.eu.lever.co.
Ashbyapi.ashbyhq.com/posting-api/job-board/<name>title, publishedAtCompensation only with ?includeCompensation=true.
SmartRecruitersapi.smartrecruiters.com/v1/companies/<id>/postingsname, releasedDatePaged by 100; the description needs one more call per job.
WorkdayPOST <company>.wd<N>.myworkdayjobs.com/wday/cxs/<company>/<site>/jobstitle, 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.

DataToolPrice per job (Starter plan)
Every open job of each company, one format for seven ATSATS 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

When one normalized feed is simpler

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.