Greenhouse vs Lever vs Ashby: Which ATS Has the Best Public Job API?
Greenhouse, Lever, and Ashby all expose public job board APIs with no authentication. A field-by-field comparison of what each returns, their limits, and how to pull all three into one dataset.
The actor referenced in this article. 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 (checked against Linear’s live board, October 2026):
{
"apiVersion": 1,
"jobs": [
{
"id": "d3bc1ced-3ce4-4086-a050-555055dbb1ff",
"title": "Senior / Staff Fullstack Engineer",
"department": "Product",
"team": "Engineering",
"employmentType": "FullTime",
"location": "Europe",
"secondaryLocations": [],
"publishedAt": "2021-04-27T20:13:45.158+00:00",
"isListed": true,
"isRemote": true,
"workplaceType": "Remote",
"address": { "postalAddress": { "addressCountry": "European Union" } },
"jobUrl": "https://jobs.ashbyhq.com/linear/d3bc1ced-...",
"applyUrl": "https://jobs.ashbyhq.com/linear/d3bc1ced-.../application",
"descriptionHtml": "<p>...</p>",
"descriptionPlain": "At Linear, we are building...",
"shouldDisplayCompensationOnJobPostings": false,
"compensation": { "compensationTierSummary": null }
}
]
}
Add ?includeCompensation=true to fill the compensation object, which
carries the posted salary bands where the employer publishes them.
applicationFormDefinition is not in the public API
A common search is for applicationFormDefinition on jobs.ashbyhq.com,
usually by someone trying to read the application form’s questions before
building an integration. That field is not in the posting API response
above. It belongs to Ashby’s authenticated API, which needs the employer’s
own key, so there is no way to pull a company’s form schema from the
public board. What the public endpoint gives you for the form is
applyUrl, the page a candidate applies on.
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 descriptionPlain as empty 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.jobs?.length > 0) return { ats: 'ashby', jobs: data.jobs };
}
} 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.
Explore the scraper referenced in this article: inputs, outputs, and pricing, then run it on Apify.
How to Aggregate Job Postings from 500+ Companies Using Public ATS APIs
Greenhouse, Lever and Ashby expose public job board APIs with no auth. Build one aggregator that pulls from all three, dedupes, and flags new roles.
Building a Job Market Intelligence Dashboard with Free ATS Data
How to build a real-time hiring dashboard that tracks roles, skills demand, and company hiring velocity using public Greenhouse, Lever, and Ashby APIs.
How to Monitor Competitor Job Postings to Predict Their Strategy
Job postings are the most honest signal of a competitor's roadmap. Track their ATS boards automatically and turn hiring data into strategy.
Recruitment Automation: Building a Job Intelligence Pipeline with Free ATS Data
How to use the public Greenhouse, Lever and Ashby APIs to build automated job monitoring and salary benchmarking for recruiting teams.