BYTETOOLS

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.

No API key requiredCORS enabledHTTPSFree tier

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
curl 'https://api.ashbyhq.com/posting-api/job-board/ashby'
JavaScript (fetch)
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);
Python (requests)
import requests

res = requests.get("https://api.ashbyhq.com/posting-api/job-board/ashby", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200 (truncated)
{
  "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": {
            "postalAddres

Parameters

ParameterTypeRequiredDescription
(job board name)pathRequiredThe company's Ashby board name, taken from its careers URL. ashby
includeCompensationqueryOptionalSet 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

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.