Ashby Job Board API

Read Ashby job postings from any jobs.ashbyhq.com board as structured JSON. Ashby is the ATS behind the careers pages of many of the fastest-growing companies, including OpenAI, Ramp, Notion, Linear and Cerebras, and its boards publish something rare: structured compensation. Every job row carries the employer's own salary range as flat numeric columns next to an equity flag, so pay analysis needs no parsing and no model guessing. Give it company names rather than slugs and it resolves them to the boards those companies actually run, returns clear not-found rows with did-you-mean suggestions for the misses, and can sweep a bundled directory of 2,700 plus verified boards to map who hires through Ashby at all.

MEDIAN LAGon demand
PARAMETERS10
TOTAL USERS3
MONTHLY ACTIVE2
TOTAL RUNS63
RATINGno ratings yet
LAST MODIFIED2026-08-27
PUBLISHED2026-08

Input parameters

PARAMETERTYPEREQDEFAULTDESCRIPTION
companies string[] no Company names, board slugs, or jobs.ashbyhq.com URLs, mixed freely. Plain names are matched to their board automatically, so 'Black Semiconductor' finds blacksemiconductor, and a miss returns a not-found row with did-you-mean suggestions. Empty sweeps the bundled directory instead.
outputMode enum no jobs jobs · urlsOnly · companiesOnly. Full records, the cheap link index, or the company discovery directory.
titleKeywords string[] no Keep only jobs whose title contains any of these. All filters run before billing, so a filtered job costs nothing.
employmentTypes string[] no FullTime, PartTime, Intern, Contract or Temporary. Uses the board's own employment type field.
remoteOnly boolean no false Keep only jobs the employer marks remote, using the board's own flag rather than text guessing.
publishedAfter string no A window like 24h or 7d, or an ISO date. Only postings published on or after the cutoff come back, which turns a daily schedule into a new-roles feed with no state to manage.
includeDescriptionMarkdown boolean no true The posting converted to clean Markdown, the format AI pipelines ingest without cleanup. HTML and plain-text variants are separate toggles.
includeCompanyData boolean no false Enrich each row from its public job page with the hiring company's real name, website and logo, the countries remote applicants may live in, the application deadline when set, and the direct-apply flag. One extra page request per job. — drives your bill
maxJobs integer no 100 Hard ceiling on rows across the whole run, the main cost control. 0 means unlimited. — drives your bill
maxCompanies integer no 25 Cap on companies processed in discovery sweeps. — drives your bill

Worked examples

Basic — two boards, engineering roles only
{
  "companies": ["cerebras", "ramp"],
  "titleKeywords": ["engineer"],
  "maxJobs": 25
}
Salary table — comp-displaying boards, pay as numbers
{
  "companies": ["ramp", "openai", "deel"],
  "maxJobs": 100
}
Companies that use Ashby — the live directory, largest boards first
{
  "outputMode": "companiesOnly",
  "maxCompanies": 100
}
Check a prospect list — plain names in, boards or not-found rows out
{
  "companies": ["Black Semiconductor", "Morse Micro", "Ramp"],
  "outputMode": "companiesOnly"
}
New postings daily — the shape to put on a schedule
{
  "companies": ["openai", "notion", "linear"],
  "publishedAfter": "25h",
  "maxJobs": 200
}
POWER-USER TIP
Read the salary columns before parsing anything — Employers that display pay publish structured ranges, and those arrive as flat salaryMin, salaryMax, salaryCurrency and salaryPeriod columns with an offersEquity flag. On comp-displaying boards the coverage is high; OpenAI showed 641 of 753 postings with structured pay when surveyed. A null salaryMin means the employer chose not to display pay, not that parsing failed.
POWER-USER TIP
Company names beat slugs as input — The resolver tries slug spellings automatically and, on a miss, returns an in-band not-found row with the closest known slugs as did-you-mean suggestions. Feed it the prospect list as you know it and read the error rows as answers, not failures.
POWER-USER TIP
There is no changed-jobs feed, by design — Ashby publishes only a posting date, no update timestamp, anywhere on its public surface. publishedAfter therefore gives you a truthful new-postings feed, and nothing pretends to detect edits. Pipelines that need edit detection should diff snapshots on their side.

Tasks

Saved runs with the inputs already filled in — each one a standalone page and a working configuration example.

Request a task →

Code

curl

curl -X POST "https://api.apify.com/v2/acts/johnvc~ashby-job-board-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"companies":["cerebras","ramp"],"titleKeywords":["engineer"],"maxJobs":25}'

Python

from apify_client import ApifyClient

client = ApifyClient("APIFY_TOKEN")
run = client.actor("johnvc/ashby-job-board-scraper").call(
    run_input={
        "companies": ["ramp", "openai"],
        "maxJobs": 50,
    }
)
for job in client.dataset(run.default_dataset_id).iterate_items():
    print(job.get("title"), "-", job.get("compensationSummary"), job.get("applyUrl"))

What people use it for

Alternatives