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 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 returns the same 30 fields, so both drop into one table with the other systems Dodo Data reads.