Ashby Job Board API
Free ATS job board API with no key: Ashby-hosted roles with structured secondary locations, departments, teams and employment type. Tested example included.
Endpoint tested and returned HTTP 200 on 2026-08-21
What is the Ashby Job Board API?
Ashby's posting API returns a company's public job board as JSON with no key. Each role gives its title, department, team, employment type and primary location, plus a structured list of secondary locations with proper postal address components.
Ashby is the newer entrant among applicant tracking systems, and it shows in the data model. Where older boards hand you a single free-text location string, Ashby returns `secondaryLocations` as an array of objects, each with a `postalAddress` containing separate country, region and locality fields — actual structured geography rather than a string you have to guess at.
That matters most for the increasingly common role advertised as "Remote - European Union" with a specific list of countries the company can actually employ in. The primary `location` gives you the headline, and `secondaryLocations` gives you the real answer, which is exactly the distinction a job seeker cares about. Departments and teams also arrive as separate fields rather than one concatenated string, so faceting works without parsing. Some address components come back as empty strings rather than null, so test for emptiness rather than existence.
Quick facts
- Base URL
https://api.ashbyhq.com/posting-api/job-board- Authentication
- No API key for the public job board. Ashby's full hiring API, covering candidates and interviews, requires an API key.
- Rate limit
- No published limit for the public board. Cache per company.
- Pricing
- Free.
- CORS
- Enabled — callable directly from browser JavaScript
- Official docs
- Read the docs
How to use the Ashby Job Board API
Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.
1. Fetch a company's Ashby job board
GET https://api.ashbyhq.com/posting-api/job-board/ashby
curl 'https://api.ashbyhq.com/posting-api/job-board/ashby'const res = await fetch("https://api.ashbyhq.com/posting-api/job-board/ashby");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);import requests
res = requests.get("https://api.ashbyhq.com/posting-api/job-board/ashby", timeout=20)
res.raise_for_status()
print(res.json()){
"jobs": [
{
"id": "7458d4e9-da2e-47bd-98cb-adfda43d42b2",
"title": "Engineering Manager - EU",
"department": "Engineering",
"team": "EMEA Engineering",
"employmentType": "FullTime",
"location": "Remote - European Union",
"secondaryLocations": [
{
"location": "Spain",
"address": {
"postalAddress": {
"addressRegion": "Spain",
"addressCountry": "Spain",
"addressLocality": "Spain"
}
}
},
{
"location": "Italy",
"address": {
"postalAddress": {
"addressRegion": "",
"addressCountry": "Italy",
"addressLocality": ""
}
}
},
{
"location": "Germany",
"address": {
"postalAddress": {
"addressCountry": "Germany",
"addressLocality": ""
}
}
},
{
"location": "Switzerland",
"address": {
"postalAddress": {
"addressRegion": "",
"addressCountry": "Switzerland",
"addressLocality": ""
}
}
},
{
"location": "Denmark",
"address": {
"postalAddress": {
"addressRegion": "",
"addressCountry": "Denmark",
"addressLocality": ""
}
}
},
{
"location": "Norway",
"address": {
"postalAddresParameters
| Parameter | Type | Required | Description |
|---|---|---|---|
(job board name) | path | Required | The company's Ashby board name, taken from its careers URL. ashby |
includeCompensation | query | Optional | Set true to include compensation ranges where the employer publishes them. true |
Response fields
jobsarray- Published roles on the board.
jobs[].idstring- Posting UUID.
jobs[].titlestring- Job title as published.
jobs[].department / teamstring- Organisational placement as two separate fields — `Engineering` and `EMEA Engineering` in the captured example.
jobs[].employmentTypestring- `FullTime`, `PartTime`, `Intern`, `Contract` or `Temporary`.
jobs[].locationstring- Primary location as a display string, for example `Remote - European Union`.
jobs[].secondaryLocationsarray- Additional eligible locations, each with a `location` label and an `address.postalAddress` holding separate `addressCountry`, `addressRegion` and `addressLocality` fields.
jobs[].jobUrl / applyUrlstring- Public posting page and the direct application link.
jobs[].isRemoteboolean- Whether the role is remote, where the employer has flagged it.
jobs[].publishedAtstring- ISO 8601 publication timestamp.
jobs[].descriptionHtml / descriptionPlainstring- Full job description in both markup and plain text.
What you can build with the Ashby Job Board API
- Build a careers page that shows every country a remote role covers
- Filter roles by employment type and department without string parsing
- Aggregate postings across companies using Ashby
- Map hiring locations from structured address components
Common errors and how to fix them
404
The board name is wrong or the board is not published.
Fix: Take it from the company's Ashby careers URL. Unpublished boards are not exposed.
Empty strings in address fields
Ashby serialises unset components as `""` rather than null.
Fix: Test for empty strings as well as null before rendering an address line.
No compensation data
Ranges are opt-in per employer and off by default.
Fix: Add `includeCompensation=true`, and accept that many employers publish nothing.
Location contradicts secondaryLocations
The primary location is a marketing label; the secondary list is the operational reality.
Fix: Show the primary string as the headline but use `secondaryLocations` for any eligibility filtering.
Ashby Job Board API — frequently asked questions
Is the Ashby job board API free?
Yes, public with no key. Ashby's full hiring API, which covers candidates and interviews, requires an API key and is a separate product.
How do I find a company's Ashby board name?
It is the segment after `jobs.ashbyhq.com/` in their careers URL, and that segment is what this endpoint takes.
What are secondaryLocations for?
They list every additional place a role can be filled, each with structured country, region and locality fields. For remote roles scoped to particular countries, this is the field that actually answers the question.
Can I get salary ranges?
Sometimes. Pass `includeCompensation=true` and you will get ranges for employers who publish them, which many do not.
Tools that pair with this API
JobPosting Schema Generator
Generate JobPosting JSON-LD structured data for Google Jobs with salary, location, remote options and employment type. Free, with required-field warnings.
Salary to Hourly Calculator
Convert an annual salary to an hourly wage or an hourly rate back to a yearly salary, with monthly, weekly and daily pay equivalents. Free and private.
Strip HTML Tags
Remove all HTML tags and convert markup to clean plain text. Decode HTML entities and keep line breaks for block elements like paragraphs and headings.
Ashby Job Board is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.