---
title: "Ashby job board API: pull every posting from a board - JobsPipe"
description: "Ashby job board API: one keyless call returns a company's whole board, descriptions and pay included. How to read it, diff it, and read many boards."
canonical: https://jobspipe.dev/guides/ashby-api
date_published: 2026-10-29
date_modified: 2026-10-29
author: Dvir Atias
---

# Ashby job board API: every posting from one board

By [Dvir Atias](https://jobspipe.dev/about) · Updated Oct 29, 2026

A company’s Ashby board is one HTTP call away. The job board API returns every published posting on the board as JSON, full descriptions included, with pay when the company publishes it, and it needs no key. This guide is the practical side: the call, what to keep from the response, how to turn a snapshot into a feed, and what changes when one board becomes hundreds. For the API itself, keys, docs and rate limits, see the [Ashby source page](https://jobspipe.dev/sources/ashby).

## The short answer

The call is `GET https://api.ashbyhq.com/posting-api/job-board/{board}`, where `{board}` is the last part of the company’s careers address, `jobs.ashbyhq.com/{board}`. Add `includeCompensation=true` to get pay. The response is the whole board. Ashby documents the endpoint on its [public job posting API page](https://developers.ashbyhq.com/docs/public-job-posting-api).

## One board, one call

Request a board and this is the shape that comes back:

```
curl "https://api.ashbyhq.com/posting-api/job-board/acme?includeCompensation=true"

{
  "apiVersion": "1",
  "jobs": [
    {
      "id": "...",
      "title": "Senior Backend Engineer",
      "department": "Engineering",
      "team": "Platform",
      "location": "New York",
      "isRemote": false,
      "employmentType": "FullTime",
      "publishedAt": "2026-10-20T14:02:11.000Z",
      "jobUrl": "https://jobs.ashbyhq.com/acme/...",
      "applyUrl": "https://jobs.ashbyhq.com/acme/.../application",
      "descriptionHtml": "<p>What the role involves, in full.</p>",
      "compensation": {
        "summaryComponents": [ ... ],
        "compensationTiers": [ ... ]
      }
    }
  ]
}
```

Field names are Ashby’s; the values are illustrative. Keep four things from each posting. `id` is the key you diff on. `jobUrl` is the stable address of the posting. `descriptionHtml` is the full text, so there’s no detail request. And `compensation`, when present, is one of the few places in the applicant tracking world where pay arrives structured instead of buried in prose.

Two things are missing on purpose. The response never names the company: you supply it from the board you asked for. And it never says when a posting closed: a closed posting just isn’t in the next response.

## Turning a snapshot into a feed

The board API gives you the present. A feed needs the past too, so the reader keeps the previous response and compares. The loop is short:

```
for board in boards:
    now  = fetch(board)                     # the whole board, one call
    seen = store.ids(board)                 # ids from the last run
    new     = now.ids - seen                # appeared since last run
    closed  = seen - now.ids                # gone since last run
    store.upsert(board, now, closed_at=today for closed)
```

Run it once a day and you have `first_seen` and `closed_at` for every posting, which the API alone will never give you. Run it more often and you get closer to the hour a posting went up, at the price of more calls per board. Ashby publishes no rate limit for the endpoint, so pick a modest cadence and back off on errors.

## From one board to many

The loop above scales in lines of code, not in effort. Three problems grow with the list.

**Finding boards.** There’s no call that lists Ashby customers. Board names come from careers pages, apply links and job ads that point at jobs.ashbyhq.com, and new boards never announce themselves. Companies that embed the board on their own domain hide the name behind a custom careers page.

**Normalizing names.** The endpoint answered the same board for `ashby`, `Ashby` and `ASHBY` when we checked, so a list built from links in the wild will hold the same board under several spellings. Lower-case before you store, or the diff above counts one company twice.

**Normalizing records.** `location` is a string, `employmentType` is Ashby’s enum and compensation has Ashby’s shape. Fine for Ashby alone; a mapping job the moment a second applicant tracking system joins the pipeline, and each one has its own shape. Our note on [public versus gated ATS APIs](https://jobspipe.dev/blog/public-vs-gated-ats-apis) lists which vendors even offer a feed.

## When to use a unified API instead

If you need one company’s Ashby jobs, call the endpoint. It’s free, documented and complete. If you need Ashby postings as a slice of the market, a jobs API that already runs the loop above saves you the discovery, the diffing and the mapping. JobsPipe returns Ashby postings through `POST /v1/jobs/search`, alongside 30+ sources, in one record shape. The sandbox shows that shape with no key:

Try it without a key

```
curl -d '{"limit":3}' https://api.jobspipe.dev/v1/sandbox/jobs/search
```

Only `/v1/sandbox/*` needs no key.

With a free key, an Ashby-only search is one filter:

```
curl https://api.jobspipe.dev/v1/jobs/search \
  -H "Authorization: Bearer jp_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "source_or": ["ashby"],
    "job_title_or": ["backend engineer"],
    "job_country_code_or": ["US"],
    "posted_at_max_age_days": 14,
    "limit": 25
  }'
```

Each record carries the company name and domain the board API leaves out, `url` on jobs.ashbyhq.com, `date_posted`, `last_seen_at`, and `status` with `closed_at` once a posting goes, which is the diff above done for you. Pay lands in `min_annual_salary_usd` and `max_annual_salary_usd` when a range is published. Drop `source_or` to search every board at once. The free plan includes 1,000 free credits, one time.

## Sources

-   [Ashby public job posting API documentation](https://developers.ashbyhq.com/docs/public-job-posting-api)
-   [Ashby developer documentation](https://developers.ashbyhq.com/)

## FAQ

What is the Ashby job board API?+

The JSON behind a company's hosted careers page. GET api.ashbyhq.com/posting-api/job-board/<board> returns that company's published postings in one response, with the description of each posting inline. It's the public half of Ashby; the authenticated API for candidates and applications is a different surface and needs a customer's key.

Is the Ashby job board API paginated?+

No. One call returns the whole board as it stands at that moment. There's no cursor, no page size and no call that lists boards, so a reader that wants many companies loops over board names it already knows.

Does one call really include the job descriptions?+

Yes. Each posting carries descriptionHtml with the full text, so there's no second request per job. That's the main reason a board read is one call instead of dozens.

Is the Ashby board name case-sensitive?+

Not in our checks. The endpoint answered the same board for ashby, Ashby and ASHBY when we tried it, and Ashby's documentation doesn't state a rule either way. Normalize the name before you store it, or two spellings of one board will read as two companies and double every count.

How do I know when an Ashby posting closed?+

You don't, from the API. A closed posting simply stops appearing. The only way to date a close is to keep yesterday's board and diff it against today's, which is why a multi-board reader is a scheduler and a store rather than a script.

How do I read many Ashby boards at once?+

Either keep your own list of board names and loop over them, with normalization and a daily diff, or use a jobs API that already holds the boards. JobsPipe returns Ashby postings through POST /v1/jobs/search with source\_or set to ashby, with the company name attached and a status that flips to closed when a posting goes.

Related

[Source

The Ashby API itself: keys, documentation, rate limits and the JobsPipe record shape.

](https://jobspipe.dev/sources/ashby)[Guide

Which applicant tracking systems publish postings openly and which gate them.

](https://jobspipe.dev/blog/public-vs-gated-ats-apis)[Guide

One integration across applicant tracking systems instead of one per vendor.

](https://jobspipe.dev/blog/ats-api-integration)[Product

The JobsPipe jobs API: 30+ sources, one schema.

](https://jobspipe.dev/jobs-api)


---
Try it with no key: `curl -d '{"limit":3}' https://api.jobspipe.dev/v1/sandbox/jobs/search`. AI agents: the full machine-readable index of this site is https://jobspipe.dev/llms.txt?src=md-twin - API quickstart, MCP server, pricing. Free key (1,000 jobs to start): https://jobspipe.dev/signup