The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Ashby Jobs listing page.
A Python and MCP quick-start for the Ashby job board API on Apify. Scrape Ashby jobs from any Ashby-hosted board, find companies that use Ashby, check whether a company has a board at all, and get the employer's own published salary ranges on every row, all without an API key or a login.
Ashby is the ATS behind the careers pages of many of the fastest-growing companies, including OpenAI, Ramp, Notion, Linear, and Cerebras. This Actor reads the public API that powers every jobs.ashbyhq.com board live at run time, so every row reflects what the employer's board says right now, not what an index remembered last week. Give it company names, board slugs, or URLs, or give it nothing and let it sweep a bundled directory of 2,700+ verified boards.
The Ashby job board API takes company names ("Black Semiconductor"), board slugs (cerebras), or any jobs.ashbyhq.com URL, and returns structured job rows: title, companyName, department, team, employmentType, workplaceType, isRemote, location, countriesDerived, datePublished, compensationSummary, flat salaryMin / salaryMax / salaryCurrency / salaryPeriod columns, an offersEquity flag, and the description as Markdown by default. Set publishedAfter to a window like 25h and only postings added since then come back, which is how the "Track New Ashby Job Postings Daily" task turns a schedule into a new-roles feed with zero state. Switch outputMode to companiesOnly and you get one row per company hiring through Ashby with a live open-jobs count, the fastest way to find companies that use Ashby. Filters run before billing, so a filtered job costs nothing.
Prerequisites: Python 3.11 or newer, uv, and a free Apify API token from apify.com.
Each example is a separate flag:
Every example asks for a small number of rows on purpose. You pay per row delivered, so confirm the shape of the data first, then raise maxJobs.
Live, not indexed. One request per board against the public API means every row is what the employer's board says right now. No stale index, no ghost jobs.
Salary data on the base row. Ashby employers publish structured compensation. Every job row carries the raw structure (salaryRaw), a normalized range (salaryDerived), flat salaryMin / salaryMax / salaryCurrency / salaryPeriod columns ready for CSV, per-tier ranges (salaryTiers), and an offersEquity flag.
Company checking with did-you-mean. Type a company name the way you know it; the Actor matches it to its board slug automatically, and a miss returns a clear not-found row with the closest known slugs.
Discovery built in. A bundled directory of 2,700+ verified Ashby boards powers companiesOnly mode and empty-input sweeps. Nobody else combines the directory and the live reader in one tool.
New postings without state. Every Ashby job carries the employer's own publish timestamp, so publishedAfter: "25h" on a daily schedule is a complete new-roles feed. No seen-lists, no delta stores.
Pay for exactly what you receive. No start fee, no minimum. The base job record is one event, salary data included; Markdown, HTML, text, the company-data enrichment, and the run report are add-ons billed only on rows that carry them.
Ready-made configurations with their own Store landing pages:
Schedule tip. Save your input as a Task in the Apify Console, set publishedAfter to 25h, and schedule it daily. From then on the dataset only ever contains postings added since the last run, so the pipeline stays current without anyone touching it.
Basic, matching the default run:
Advanced, remote roles with the company-data enrichment and a report:
Every parameter is optional.
| Parameter | Type | Default | Description |
|---|---|---|---|
companies | array | ["cerebras"] | Company names, board slugs, or any board, embed, or single-job URL, mixed freely. Empty sweeps the bundled directory. |
startUrls | array | empty | Same values in URL-list form; merged with companies. |
outputMode | string | jobs | jobs for full records, urlsOnly for the cheap index, companiesOnly for discovery. |
discoveryQuery | string | empty | Text match over the company directory for discovery and sweeps. |
verifyCompanies | boolean | true | Live-probe each discovered company; dead boards are never billed. |
titleKeywords | array | empty | Keep jobs whose title contains any of these. Runs before billing. |
departments | array | empty | Keep jobs in matching departments or teams. |
locationKeywords | array | empty | Keep jobs in matching locations or addresses. |
employmentTypes | array | empty | Keep only these types: FullTime, PartTime, Intern, Contract, Temporary. |
remoteOnly | boolean | false | Keep only jobs the board marks as remote. |
publishedAfter | string | empty | New postings: 24h, 7d, 2w, or an ISO date. |
includeDescriptionMarkdown | boolean | true | Add the description as Markdown (paid add-on). |
includeDescriptionHtml | boolean | false | Add the original HTML (paid add-on). |
includeDescriptionText | boolean | false | Add the board's plain text (paid add-on). |
includeCompanyData | boolean | false | Enrich rows from the job page: company website, logo, remote-eligibility countries, deadline, direct-apply (paid add-on). |
report | string | none | Write a Markdown or HTML run report to the key-value store (paid add-on). |
maxCompanies | integer | 25 | Cap on companies in sweeps and discovery. |
maxJobsPerCompany | integer | 0 | Per-board cap, 0 means all. |
maxJobs | integer | 100 | Whole-run cap, the main cost control. |
maxConcurrency | integer | 5 | Parallel discovery and enrichment requests. |
proxyConfiguration | object | direct | Optional Apify Proxy settings; direct connections work. |
A full job record:
A discovered company row:
Under the hood it reads the same public endpoint a scraper would. What you get is an API: structured JSON on demand, filters, stable field names, and no HTML unless you ask for it. If you have been maintaining your own scrape of Ashby boards, this is the version where someone else maintains the parser.
The domain where Ashby hosts its customers' public job boards; every company on Ashby gets a page at jobs.ashbyhq.com/companyname. Paste any of those URLs into this Actor, board or single job, and it returns the structured data behind the page.
No. Ashby's authenticated APIs are for employers. This Actor uses only the public job posting layer, so there is nothing to sign up for.
Set outputMode to companiesOnly. You get one row per company with its board slug, a live open-jobs count, and the board URL. The --example companies script does exactly this, and --example check verifies a specific list of names.
It is on the base row. Employers that display compensation publish structured ranges; those arrive as flat salaryMin / salaryMax / salaryCurrency / salaryPeriod columns plus offersEquity, with the raw structure in salaryRaw. The --example salary script prints a pay table.
Set publishedAfter to a window like 24h or an ISO date. The Actor uses the employer's own publish timestamps, so there is no state to manage between runs.
Clone this repo, run uv sync, put your Apify token in .env, and run the example. The rows() helper shows the whole pattern: call the Actor, then iterate the dataset.

Cowork is the desktop app's automation mode. To give it the Ashby Job Board API as a tool, add the Apify MCP server as a connector.
claude_desktop_config.json directly).
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.jsonDownload the desktop app and start a free trial: https://claude.ai/referral/uIlpa7nPLg More help: https://docs.apify.com/platform/integrations/claude-desktop

Claude Code is the command-line tool. Add the Actor's MCP server with one command:
To use a token instead of browser OAuth:
Then verify with claude mcp list, or run /mcp inside a session. Ask Claude Code to call the Ashby Job Board API.
Try Claude Code free: https://claude.ai/referral/uIlpa7nPLg Claude Code MCP docs: https://code.claude.com/docs/en/mcp

On claude.ai you add Apify as a connector, then enable just this Actor's tool.
johnvc/ashby-job-board-scraper.https://mcp.apify.com/?tools=actors,docs,johnvc/ashby-job-board-scraper, using OAuth when prompted.Open Claude on the web: https://claude.ai

Cursor reads MCP servers from a project file at .cursor/mcp.json.
.cursor/mcp.json:New to Cursor? Get it here: https://cursor.com/referral?code=XQP4VBLI3NNX

ChatGPT connects to the Apify MCP server through Developer mode (available on ChatGPT Pro, Plus, Business, Enterprise, and Education plans).
https://mcp.apify.com/?tools=actors,docs,johnvc/ashby-job-board-scraperMore help: https://docs.apify.com/platform/integrations/mcp
Made with care by johnvc on Apify.
Last Updated: 2026.08.27