The Mine Works
Browse on Apify
Greenhouse vs Lever vs Ashby: Which ATS Has the Best Public Job API?
← All posts
comparison June 9, 2025 · 6 min read

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

Try the scraper

The actor referenced in this article is live on Apify. Pay only for results delivered.

Open on Apify →

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 isRemote boolean 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

FeatureGreenhouseLeverAshby
Auth requiredNoneNoneNone
Description in listNo (2nd request)YesYes
Remote/hybrid fieldNoYesYes
Salary dataNoNoNo
PaginationNoLimit paramNo
Data formatJSONJSONJSON
Typical company slugCompany nameCompany nameCompany 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.

Related Actor

Try the scraper referenced in this article — live on Apify, pay only for results.

Open ats-jobs on Apify →