Greenhouse vs Lever vs Ashby: Which ATS Has the Best Public Job API?
All three major ATS platforms expose public job board APIs with no authentication. Here is a direct technical comparison of what each returns and how to
The actor referenced in this article is live on Apify. Pay only for results delivered.
Greenhouse, Lever, and Ashby are three of the most widely used applicant tracking systems in the technology industry. All three expose public job board APIs — no API key, no OAuth, no headers required. You can query the job postings for any company using these ATSes with a single GET request.
TL;DR: Greenhouse, Lever, and Ashby all provide zero-auth public job APIs. Lever includes descriptions and remote/hybrid field in the list response (no second request needed). Greenhouse requires a second request per job for descriptions. Ashby has a first-class
isRemoteboolean and is growing fast among funded startups. None include salary data in structured fields.
This is one of the most useful and underutilized public APIs in recruiting tech. Here is a complete comparison of what each ATS returns and how to use it.
Greenhouse Public API
Endpoint pattern: https://boards-api.greenhouse.io/v1/boards/{company_slug}/jobs
The company_slug is typically the company’s subdomain on Greenhouse. Stripe is stripe, Airbnb is airbnb, Notion is notion.
curl https://boards-api.greenhouse.io/v1/boards/stripe/jobs
Response structure:
{
"jobs": [
{
"id": 4567890,
"title": "Senior Software Engineer",
"location": {"name": "San Francisco, CA"},
"updated_at": "2025-05-15T10:23:00.000Z",
"absolute_url": "https://boards.greenhouse.io/stripe/jobs/4567890",
"departments": [{"id": 1, "name": "Engineering"}],
"offices": [{"id": 2, "name": "San Francisco"}]
}
]
}
Getting job descriptions: The list endpoint does not include descriptions. You need a second request per job:
curl https://boards-api.greenhouse.io/v1/boards/stripe/jobs/4567890
This returns the full job description as HTML in the content field.
What Greenhouse does well: Structured department and office taxonomy, consistent company slugs, reliable uptime. Greenhouse is the most mature of the three APIs.
Limitations: No salary data. Location is a single string, not a structured address. No remote/hybrid/office indicator in the base response.
Lever Public API
Endpoint pattern: https://api.lever.co/v0/postings/{company_slug}?mode=json&limit=200
curl "https://api.lever.co/v0/postings/netflix?mode=json&limit=200"
Response structure:
[
{
"id": "abc123-def456",
"text": "Staff Machine Learning Engineer",
"categories": {
"team": "AI Platform",
"location": "Los Angeles, CA",
"workplaceType": "hybrid",
"department": "Engineering"
},
"description": "<p>Full job description HTML</p>",
"descriptionPlain": "Full job description as plain text",
"hostedUrl": "https://jobs.lever.co/netflix/abc123-def456",
"createdAt": 1715789000000
}
]
What Lever does well: Lever includes the job description directly in the listing response — no second request required. It also includes workplaceType (remote/hybrid/in-person) in the categories object, which Greenhouse does not. The descriptionPlain field is especially useful for text processing pipelines.
Limitations: IDs are UUIDs, not sequential integers — harder to detect new postings without timestamps. The limit=200 parameter is required; default without it returns only 25 postings.
Ashby Public API
Endpoint pattern: https://api.ashbyhq.com/posting-api/job-board/{company_slug}
Ashby is newer and used by many high-growth startups. Companies like Linear, Figma (partially), and Rippling use Ashby.
curl https://api.ashbyhq.com/posting-api/job-board/linear
Response structure:
{
"organization": {
"name": "Linear",
"jobBoard": {
"url": "https://jobs.ashbyhq.com/linear"
}
},
"jobPostings": [
{
"id": "job_abc123",
"title": "Product Designer",
"teamName": "Design",
"locationName": "Remote",
"employmentType": "FullTime",
"isRemote": true,
"jobDescription": "<p>Description HTML</p>",
"applicationFormDefinition": {...},
"publishedDate": "2025-05-20T00:00:00.000Z"
}
]
}
What Ashby does well: isRemote is a first-class boolean field. Employment type is a structured enum. The organization metadata is useful for enrichment. Ashby is growing quickly and covers many of the best-funded startups.
Limitations: The API sometimes returns jobDescription as null for jobs that redirect to an external application form. Some company slugs are hard to discover without first finding their job board URL.
Auto-Detection: How to Handle All Three
When you are building a job aggregator, you usually know a company name but not which ATS they use. The detection pattern is simple — try Greenhouse first (largest), then Lever, then Ashby:
async function getJobs(companySlug) {
// Try Greenhouse
try {
const res = await fetch(`https://boards-api.greenhouse.io/v1/boards/${companySlug}/jobs`);
if (res.ok) {
const data = await res.json();
if (data.jobs?.length > 0) return { ats: 'greenhouse', jobs: data.jobs };
}
} catch {}
// Try Lever
try {
const res = await fetch(`https://api.lever.co/v0/postings/${companySlug}?mode=json&limit=200`);
if (res.ok) {
const data = await res.json();
if (data.length > 0) return { ats: 'lever', jobs: data };
}
} catch {}
// Try Ashby
try {
const res = await fetch(`https://api.ashbyhq.com/posting-api/job-board/${companySlug}`);
if (res.ok) {
const data = await res.json();
if (data.jobPostings?.length > 0) return { ats: 'ashby', jobs: data.jobPostings };
}
} catch {}
return null;
}
Side-by-Side Comparison
| Feature | Greenhouse | Lever | Ashby |
|---|---|---|---|
| Auth required | None | None | None |
| Description in list | No (2nd request) | Yes | Yes |
| Remote/hybrid field | No | Yes | Yes |
| Salary data | No | No | No |
| Pagination | No | Limit param | No |
| Data format | JSON | JSON | JSON |
| Typical company slug | Company name | Company name | Company name |
Using the Managed Aggregator
Building this detection logic for hundreds of companies, handling pagination, normalizing schemas across three ATSes, and scheduling regular updates is the operational overhead our ATS Jobs scraper eliminates:
from apify_client import ApifyClient
client = ApifyClient('YOUR_API_TOKEN')
run = client.actor('themineworks/ats-jobs').call(run_input={
'companies': ['stripe', 'notion', 'linear', 'figma', 'vercel'],
'maxJobsPerCompany': 50,
'includeDescription': True,
})
Output is a unified schema regardless of which ATS each company uses: {ats, company_slug, title, location, remote, department, url, description, publishedAt}.
Frequently Asked Questions
How do you find a company’s Greenhouse, Lever, or Ashby slug?
Company slugs are typically the company’s name in lowercase — stripe, notion, airbnb. You can find the slug by visiting their careers page URL: boards.greenhouse.io/{slug}, jobs.lever.co/{slug}, or jobs.ashbyhq.com/{slug}. If you only know the company name, try all three APIs sequentially — the one that returns results identifies both the ATS and the correct slug.
Do Greenhouse, Lever, and Ashby job board APIs require any authentication?
No. All three provide completely public APIs with no API keys, OAuth tokens, or custom headers required. These APIs are intentionally public — companies want their job postings discoverable and indexable by job aggregators. A single curl or fetch call with no headers returns full structured job listings.
Which ATS is most widely used among technology companies?
Greenhouse is most widely adopted among established technology companies — Stripe, Airbnb, Shopify, Dropbox, and hundreds of others. Lever is popular with mid-market tech companies. Ashby is growing fastest among funded startups and now covers companies like Linear, Rippling, and many Series A and B companies.
How do you detect which ATS a company uses?
Try the APIs in order — Greenhouse first (largest network), then Lever, then Ashby. If all three return empty results, the company may use Workday, Workable, iCIMS, or a custom career page. The company’s job board URL is usually the fastest indicator: look for greenhouse.io, lever.co, or ashbyhq.com in the domain.
Does any ATS job board API include structured salary data?
None of the three — Greenhouse, Lever, or Ashby — include salary information in structured fields in their public job board APIs. Where companies choose to disclose salary ranges, the information typically appears only within the full job description HTML text rather than as dedicated fields.
Try the scraper referenced in this article — live on Apify, pay only for results.
Open ats-jobs on Apify →Firecrawl vs RAG Crawler: Pricing, Output Quality, and When to Use Each
Firecrawl charges per page on a subscription. RAG Crawler charges per page crawled on pay-per-result. Here is a direct comparison of output, pricing, and failure handling.
PACER vs CourtListener: Accessing US Court Records Without Paying $0.10 Per Page
PACER charges $0.10 per page for federal court documents. CourtListener is free for opinions and some dockets. Here is what each covers, what they do not, and when to use both.
pytrends vs Google Trends API in 2025: Which Actually Works on Cloud Servers?
pytrends works from residential IPs but fails consistently on cloud servers. Here is a direct comparison of reliability, data coverage, and cost for production use cases.