# Ashby's public job posting API: what one request returns, and five things to handle

> Source: <https://dev.to/dododata/ashbys-public-job-posting-api-what-one-request-returns-and-five-things-to-handle-1i7g>
> Published: 2026-11-14 13:04:11+00:00

More than two thousand companies hire through Ashby, and every Ashby job board is also a public JSON API. Ashby publishes it so that a company's jobs can be shown anywhere; it needs no key for reading. One request per company returns the whole board. We built a search on it this autumn; this is what the API gives you, measured on 14 November 2026 on two boards, OpenAI (838 open jobs) and Notion (166).

```
https://api.ashbyhq.com/posting-api/job-board/<board>?includeCompensation=true
```

`<board>` is the company's board name, the same word that appears in its job links (`jobs.ashbyhq.com/openai/...`). A board name that does not exist returns HTTP 404, so a typo fails loudly.

There is no paging. All 838 of OpenAI's jobs arrived in one response, under a `jobs` key next to an `apiVersion`.

Each job has `id`, `title`, `department`, `team`, `employmentType`, `location`, `secondaryLocations`, `address`, `isRemote`, `workplaceType`, `publishedAt`, `isListed`, `jobUrl`, `applyUrl`, `descriptionHtml`, `descriptionPlain`, `shouldDisplayCompensationOnJobPostings` and, if you ask for it, `compensation`.

Two things are easier here than on Greenhouse's API, which we wrote up the same week. The description comes twice, as HTML and as plain text, and `descriptionPlain` was filled on all 1,004 jobs of the two boards, so there is no HTML to reduce. And every job states an employment type: `FullTime` on 837 of OpenAI's 838 jobs and `Contract` on one; `FullTime`, `Intern` and `Contract` on Notion's.

The only date is `publishedAt`. There is no update date, so to notice that a posting changed you compare it with what you read last time. 62 of OpenAI's 838 open jobs were published before 2026, the oldest in 2023, and are still listed.

Without `includeCompensation=true` the `compensation` key is absent from every job on both boards. With it, the key is on every job, filled on 663 of OpenAI's 838 and on none of Notion's 166. `shouldDisplayCompensationOnJobPostings` tells you which to expect before you look: it was true on exactly those 663 jobs and false on every Notion job.

A filled `compensation` holds, among other keys, a short display string and a list, `summaryComponents`:

```
{
  "scrapeableCompensationSalarySummary": "$207K - $285K",
  "summaryComponents": [
    { "compensationType": "Salary", "interval": "1 YEAR", "currencyCode": "USD", "minValue": 207000, "maxValue": 285000 },
    { "compensationType": "EquityCashValue", "interval": "1 YEAR", "currencyCode": "USD", "minValue": null, "maxValue": null }
  ]
}
```

On OpenAI's board 663 jobs carried a `Salary` component, 653 an `EquityCashValue` component (every one with empty values, as above) and 29 a `Commission` component. The order is not fixed: `Salary` was the first component on 301 of the 663 jobs, equity on 359 and commission on 3. So do not take the first one. Pick the component whose `compensationType` is `Salary`, and read its `interval`: most are `1 YEAR`, but 3 salary components on that board were `1 HOUR` (one of them 57 to 70 dollars), and 57 an hour is not a salary of 57. The currency was filled on every salary component and missing on 13 equity and commission components.

`isRemote` does not mean remote
On OpenAI's board `isRemote` was true on 579 jobs. 19 of them were marked `Remote` in `workplaceType`; the other 560 were marked `Hybrid`. Notion: 95 true, 1 `Remote` and 94 `Hybrid`. We read the twelve largest other Ashby boards in our index the same day to see whether that was a habit of two companies: across all fourteen, every one of the 2,210 jobs marked `Hybrid` had `isRemote` set to true.

So filter on `workplaceType` (`Remote`, `Hybrid`, `OnSite`), not on the flag. And keep "not stated" apart from "on-site": `workplaceType` was null on 231 of OpenAI's 838 jobs and 71 of Notion's 166, and `isRemote` was null on the same jobs.

`location` is one string as the employer typed it: "San Francisco" on OpenAI's board, "San Francisco, California" on Notion's, and one Notion value that ends in a space on 21 jobs. The other places a job is open in are in `secondaryLocations`, which was filled on 167 of OpenAI's 838 jobs and 41 of Notion's 166. Match a city against `location` alone and you miss those.

For the country, `address.postalAddress.addressCountry` is more useful than the location text: it was filled on 837 of OpenAI's 838 jobs and on all 166 of Notion's. It is still the employer's spelling, so one search of ours returned both "United States" and "USA".

The API answers for a board you name; it does not tell you which boards exist. To search across companies you need the list first. We built ours from public web data, the Common Crawl URL index, which records the Ashby job links that appear across the web, and confirmed each candidate by reading its board.

[Ashby Jobs API](https://apify.com/dododata/ashby-jobs-api) on Apify Store does the above for every board at once: a daily index of 53,738 open jobs from 2,352 companies that hire through Ashby (14 November 2026), searched by title, place, workplace type, employment type and date, with the full text read live from each employer's board at search time. Type "product manager" and press Start: on 14 November that returned 100 of the 1,725 matching jobs (newest first, at most 10 per company) from 68 companies in 29 seconds on our machine, 60 of them with a pay range. $2.50 per 1,000 jobs.

For one company's board read live from its URL, our [Ashby Jobs Scraper](https://apify.com/dododata/ashby-jobs-scraper) returns the same 30 fields, so both drop into one table with the other systems Dodo Data reads.
