Jobs, Greenhouse, Lever, Ashby
Greenhouse, Lever and Ashby job board APIs, and when a scraper is worth it
Greenhouse, Lever and Ashby each publish a free job board API: no key, one company per call. If you need one company's jobs, use them; the calls are below. A scraper earns its keep when you want hundreds of companies in one format, Workday and eight more systems in the same run, filters, and a daily list of what changed. That costs $1.50 per 1,000 jobs.
- Free endpoints first
- One schema, 12 systems
- Lever US and EU
- $1.50 per 1,000 jobs
The free endpoints
We called each of these on October 6, 2026 without any key or login and got a full board back:
| System | Endpoint | Notes |
|---|---|---|
| Greenhouse | https://boards-api.greenhouse.io/v1/boards/{board}/jobs | Add ?content=true for descriptions. Stripe's board returned 727 jobs |
| Lever | https://api.lever.co/v0/postings/{company}?mode=json | EU-hosted companies use api.eu.lever.co. Palantir's returned 314 |
| Ashby | https://api.ashbyhq.com/posting-api/job-board/{org}?includeCompensation=true | Compensation when the company shows it. OpenAI's returned 823 |
curl -s "https://boards-api.greenhouse.io/v1/boards/stripe/jobs?content=true" | jq '.jobs | length'
curl -s "https://api.lever.co/v0/postings/palantir?mode=json" | jq 'length'
curl -s "https://api.ashbyhq.com/posting-api/job-board/openai" | jq '.jobs | length'When the free endpoints are enough
One or a few known companies, all on the same system, and a developer happy to map the fields: use them. They are documented by the vendors, fast, and free. The board name is in the company's job links (job-boards.greenhouse.io/stripe, jobs.lever.co/palantir, jobs.ashbyhq.com/openai).
When a scraper is worth it
| You need | Free endpoints | ATS Jobs Scraper |
|---|---|---|
| Many companies | One call per company; you find each board name | A list of names, URLs or careers pages in one run; names are resolved for you |
| One format | Three schemas (dates in different shapes, compensation in different objects) | One row shape across 12 systems |
| Workday and others in the same run | Separate code per system | Workday, Phenom, Workable, Recruitee, BambooHR, Jobvite, Breezy HR, Personio and Rippling too |
| Lever EU and Greenhouse EU | You track which host each company uses | Both regions read; region says which |
| Filters | Filter after download | Keywords, locations, countries, remote, departments, posted within N days, salary only; filtered jobs free |
| Only what changed | Store snapshots and diff them yourself | monitorMode: new and removed jobs with dates |
One schema across 12 systems
Every row has the same fields whichever system it came from: company, title, department, location, country, workplaceType, employmentType, createdAt, the description, jobUrl and applyUrl. Pay is parsed into salaryMin, salaryMax, salaryCurrency and salaryInterval where Lever, Greenhouse, Ashby, Recruitee or Rippling boards publish it.
Monitoring
monitorMode turns a scheduled run into a change feed: the first run saves every current job as new (the baseline), and later runs save only jobs that appeared (new, with firstSeenAt) or closed (removed, with removedDetectedAt). A job is reported as removed only after its board was read completely and the job itself is gone, so a temporary outage never looks like a wave of closed jobs. See hiring signals for a daily setup.
What it costs
$0.0015 per job on every plan, no start fee. Two hundred Greenhouse, Lever and Ashby companies with about 50 jobs each is 10,000 jobs: $15.00. Other Actors for these three systems cost about the same: bovi/greenhouse-lever-ashby-job-scraper lists $0.0015 per job on Free plus $0.00005 per run, and fantastic-jobs/greenhouse-jobs-api lists $2.00 per 1,000 on Free and Starter and $1.20 on Scale and Business (2026-10-15). Pick on coverage and fields, not price: ours adds Workday and the long-tail systems in the same schema.
Ask for it from ChatGPT, Claude or Cursor
The ATS Jobs Scraper works as a tool in ChatGPT, Claude, Cursor and VS Code through Apify's hosted MCP server. Add this URL as a custom connector and sign in with your Apify account; runs bill to that account. Then ask in plain English, for example "compare the open engineering roles at Stripe, Palantir and OpenAI by location".
https://mcp.apify.com/?tools=fetch-actor-details,yugenox/ats-jobs-scraperclaude mcp add --transport http yugenox-jobs "https://mcp.apify.com/?tools=fetch-actor-details,yugenox/ats-jobs-scraper"The AI setup guide walks through each client.
Run it from code
A Greenhouse, a Lever and an Ashby board in one run, engineering jobs only: billed only for the jobs that match.
// Save as run.mjs, then: npm i apify-client && APIFY_TOKEN=... node run.mjs
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('yugenox/ats-jobs-scraper').call({
companies: [
"greenhouse:stripe",
"lever:palantir",
"ashby:openai"
],
keywords: [
"engineer"
],
includeDescription: "none"
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const item of items) console.log(item.ats, item.company, item.title, item.location);import os
from apify_client import ApifyClient # pip install apify-client
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("yugenox/ats-jobs-scraper").call(run_input={
"companies": ["greenhouse:stripe", "lever:palantir", "ashby:openai"],
"keywords": ["engineer"],
"includeDescription": "none",
})
if run is None:
raise RuntimeError("Run did not finish")
for item in client.dataset(run.default_dataset_id).iterate_items():
print(item.get("ats"), item.get("company"), item.get("title"), item.get("location"))# Small jobs: runs the Actor and returns the rows in one call (up to 5 minutes).
curl -X POST "https://api.apify.com/v2/acts/yugenox~ats-jobs-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"companies":["greenhouse:stripe","lever:palantir","ashby:openai"],"keywords":["engineer"],"includeDescription":"none"}'Not affiliated with Workday, Inc., Greenhouse, Lever, Ashby or any other applicant tracking system vendor, or with any employer named on this page. Workday is a trademark of Workday, Inc.
Questions people ask
Is the Greenhouse job board API free?
Yes. boards-api.greenhouse.io answered with no key or login on October 6, 2026, one company per call. The same is true of Lever's postings API and Ashby's posting API.
Does Lever have an EU endpoint?
Yes. Companies hosted in Lever's EU region use api.eu.lever.co and jobs.eu.lever.co. The Actor reads both regions and marks EU boards in the region field.
How do I find a company's board name?
Open one of its job links: job-boards.greenhouse.io/
Is a scraper cheaper than the free APIs?
No: the free APIs cost nothing. You pay the scraper for many companies in one schema, other systems in the same run, filters and change tracking.
Do I get salaries?
When the company publishes pay on Greenhouse, Lever or Ashby, it comes back parsed into minimum, maximum, currency and interval, with the original text kept.
Run it on your own data
Open the ATS Jobs Scraper on Apify, list your companies and press Start. You pay per job from your own Apify account.
Last updated 2026-10-06.