> ## Documentation Index
> Fetch the complete documentation index at: https://rocketyard.dev/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> These Actors run on the Apify platform and charge per result. Call one with POST https://api.apify.com/v2/acts/rocketyard~<actor-id>/run-sync-get-dataset-items and the header Authorization: Bearer <APIFY_TOKEN>, or connect Apify's MCP server at https://mcp.apify.com?tools=rocketyard/<actor-id>.

# Greenhouse vs Lever vs Ashby job board APIs: which fields each returns

> Field-by-field comparison of the free Greenhouse, Lever and Ashby job board APIs, with fill rates measured on real jobs from 29 company boards.

Greenhouse, Lever and Ashby all publish a free public API for job boards, with no key. They don't return the same fields, and companies don't fill them equally. We called all three on 2026-11-05, on 29 company boards and 8,406 open jobs, and counted how often each field had a value.

## The three job board APIs

| | Greenhouse Job Board API | Lever Postings API | Ashby Public Job Posting API |
| - | - | - | - |
| **Endpoint** | `boards-api.greenhouse.io/v1/boards/BOARD/jobs` | `api.lever.co/v0/postings/BOARD` | `api.ashbyhq.com/posting-api/job-board/BOARD` |
| **Documentation** | [developers.greenhouse.io](https://developers.greenhouse.io/job-board.html) | [github.com/lever/postings-api](https://github.com/lever/postings-api) | [developers.ashbyhq.com](https://developers.ashbyhq.com/docs/public-job-posting-api) |
| **API key** | None | None | None |
| **Add for full data** | `content=true`, `pay_transparency=true` | `mode=json` | `includeCompensation=true` |
| **Unknown board** | HTTP 404 | HTTP 404 | HTTP 404 |
| **Jobs measured** | 4,322 on 12 boards | 2,279 on 6 boards | 1,805 on 11 boards |

Lever's robots.txt asks for one second between requests.

## Which fields each API returns

Each cell shows where the API publishes the field and the share of jobs that had a value. These are the Actors' normalised field names, measured through their mapping.

| Field | Greenhouse | Lever | Ashby |
| - | - | - | - |
| `title` | `title`: 100% | `text`: 100% | `title`: 100% |
| `company` | `company_name`: 100% | `board page title`: 61.6% | `board page title`: 92.9% |
| `location` | `location.name`: 100% | `categories.location`: 100% | `location`: 100% |
| `country` | `offices[0].location`: 49.7% | `country`: 100% | `address.postalAddress.addressCountry`: 97.9% |
| `workplaceType` | `location.name ("Remote", "Hybrid")`: 30.2% | `workplaceType`: 100% | `workplaceType`: 77.4% |
| `employmentType` | `metadata["Employment Type"]`: 13.4% | `categories.commitment`: 98.9% | `employmentType`: 100% |
| `department` | `departments[].name`: 100% | `categories.department`: 86.4% | `department`: 100% |
| `team` | Not in the API | `categories.team`: 100% | `team`: 100% |
| `datePosted` | `first_published`: 100% | `createdAt`: 100% | `publishedAt`: 100% |
| `dateUpdated` | `updated_at`: 100% | Not in the API | Not in the API |
| `salaryMin` | `pay_input_ranges[0].min_cents`: 48.6% | `salaryRange.min`: 33.1% | `compensation.summaryComponents[Salary].minValue`: 61.2% |
| `salaryUnit` | `pay_input_ranges[0].title`: 45.5% | `salaryRange.interval`: 33.1% | `compensation.summaryComponents[Salary].interval`: 61.2% |
| `description` | `content`: 100% | `descriptionPlain`, `lists`, `additionalPlain`: 100% | `descriptionPlain`: 100% |
| `applyUrl` | `absolute_url`: 100% | `applyUrl`: 100% | `applyUrl`: 100% |
| `requisitionId` | `requisition_id`: 93.2% | Not in the API | Not in the API |

Some things to read from this:

* **Greenhouse has no workplace field.** The Actor sets `workplaceType` only when the location says Remote or Hybrid, which gives 30.2%. On Lever it was filled for every job.
* **Greenhouse employment type is company-defined.** It comes from custom `metadata`, so most boards don't have it: 13.4%.
* **Only Greenhouse has update dates and requisition IDs.** Lever and Ashby publish neither.
* **Lever and Ashby don't publish the company's name.** The Actors read it from the job board page. That page answered HTTP 404 for Veeva, Cursor and PostHog, so those jobs have no `company`.

The Actors don't map everything. Greenhouse's `metadata` (on 79% of jobs, with company-defined keys) and `education` (26.6%), and Lever's `salaryDescription` (13%), are in the raw APIs but not in the records.

## Salary depends on the company, not the platform

| Platform | Company | Open jobs | Jobs with a salary range |
| - | - | - | - |
| Greenhouse | Databricks | 926 | 52.3% |
| Greenhouse | Stripe | 761 | 0% |
| Greenhouse | Anthropic | 681 | 87.2% |
| Greenhouse | Cloudflare | 464 | 0% |
| Greenhouse | Datadog | 396 | 53.8% |
| Greenhouse | Coinbase | 278 | 91.7% |
| Greenhouse | GitLab | 243 | 42.8% |
| Greenhouse | Airbnb | 207 | 84.1% |
| Greenhouse | Reddit | 163 | 80.4% |
| Greenhouse | Figma | 145 | 64.8% |
| Greenhouse | Dropbox | 31 | 77.4% |
| Greenhouse | Discord | 27 | 100% |
| Lever | Veeva | 875 | 0% |
| Lever | Shield AI | 659 | 81.8% |
| Lever | Palantir | 309 | 0% |
| Lever | Zoox | 229 | 93.4% |
| Lever | Sonar | 121 | 1.7% |
| Lever | Spotify | 86 | 0% |
| Ashby | OpenAI | 813 | 79.6% |
| Ashby | Ramp | 171 | 96.5% |
| Ashby | Notion | 148 | 0% |
| Ashby | ElevenLabs | 145 | 0.7% |
| Ashby | Perplexity | 139 | 84.9% |
| Ashby | Cursor | 120 | 0% |
| Ashby | Cohere | 118 | 73.7% |
| Ashby | Vanta | 84 | 57.1% |
| Ashby | Linear | 31 | 41.9% |
| Ashby | Replit | 28 | 89.3% |
| Ashby | PostHog | 8 | 0% |

Overall: Greenhouse 48.6%, Lever 33.1%, Ashby 61.2%. These boards aren't a random sample, so read the per-company rows rather than the platform totals.

## Check it yourself

These count the jobs with a salary on one board, using the free APIs:

```bash theme={null}
curl -s "https://boards-api.greenhouse.io/v1/boards/discord/jobs?pay_transparency=true" | jq '[.jobs[] | select(.pay_input_ranges | length > 0)] | length'
curl -s "https://api.lever.co/v0/postings/zoox?mode=json" | jq '[.[] | select(.salaryRange)] | length'
curl -s "https://api.ashbyhq.com/posting-api/job-board/ramp?includeCompensation=true" | jq '[.jobs[] | select(.compensation.summaryComponents | map(select(.compensationType == "Salary")) | length > 0)] | length'
```

On 2026-11-05 those printed 27 of 27, 214 of 229 and 165 of 171.

## Free API or Actor?

If you read one platform from your own code, the free API is the right start. The Actors add one record format across the three platforms, so `salaryMin` means the same on each, and salaries in whole currency units, plain-text descriptions and ISO dates. They also add filters, many boards per run, a free error item per failed board, exports and Apify's schedules. Together they work as one ATS jobs API. See how to [export a Greenhouse board](https://rocketyard.dev/export-greenhouse-jobs-csv-json.md) or [track new roles daily](https://rocketyard.dev/track-new-jobs-daily.md).

> [card] [Run Greenhouse Jobs API & Scraper on Apify](https://apify.com/rocketyard/greenhouse-jobs-scraper)
>
> \$1.00 per 1,000 jobs, no subscription. You run it with your own Apify account.

> [card] [Run Lever Jobs API & Scraper on Apify](https://apify.com/rocketyard/lever-jobs-scraper)
>
> \$0.75 per 1,000 jobs, no subscription. You run it with your own Apify account.

> [card] [Run Ashby Jobs API & Scraper on Apify](https://apify.com/rocketyard/ashby-jobs-scraper)
>
> \$0.75 per 1,000 jobs, no subscription. You run it with your own Apify account.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.