# Ashby Job Board API | Jobs, Companies & Salary Data (`johnvc/ashby-job-board-scraper`) Actor

Ashby Job Board API access without keys: live jobs from any Ashby career site with the employer's own salary ranges, company discovery, and new-postings feeds. Titles, locations, departments, compensation, and Markdown, HTML, or text descriptions. Pay per delivered row, no start fee.

- **URL**: https://apify.com/johnvc/ashby-job-board-scraper.md
- **Developed by:** [John](https://apify.com/johnvc) (community)
- **Categories:** Jobs, Lead generation, AI
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 1,000 job records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Ashby Job Board API

Scrape Ashby jobs from any Ashby job board through the public Ashby API, with no API key and no login. Give it company names, board slugs, or jobs.ashbyhq.com URLs and get back structured job records with titles, locations, departments, employment types, timestamps, full descriptions, and the employer's own published salary ranges. Or give it nothing and let it discover companies from its bundled directory of 2,700+ verified Ashby job boards.

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 same public API that powers every hosted Ashby job board, live at run time, so every row reflects what the employer's board says right now, not what an index remembered from last week. If you have been searching for an Ashby jobs API, an Ashby job board scraper, or a way to pull AshbyHQ jobs into your own pipeline, this is the maintained version of that tool.

### What you get per job

| Field group | Fields |
|---|---|
| Identity | id, title, companyName, boardToken, url, applyUrl |
| Structure | department, team, departments, employmentType, workplaceType |
| Locations | location, secondaryLocations, locationsDerived, address, isRemote |
| Timestamps | datePublished (the employer's own publish stamp) |
| Compensation | compensationSummary, salaryRaw (structured pay data, verbatim), salaryDerived plus flat salaryMin, salaryMax, salaryCurrency, salaryPeriod columns, salaryTiers, offersEquity |
| Content | descriptionMarkdown, descriptionHtml, descriptionText |
| Company add-on | companyWebsite, companyLogo, remoteEligibility, applicationDeadline, directApply |
| Provenance | source, sourceType, sourceUrl, scrapedAt |

### Ashby salary data employers actually publish

Ashby job boards carry structured compensation: salary ranges with currency and pay period, equity flags, and human-readable summaries like "$211.4K - $290.6K". This actor passes the raw structure through as salaryRaw, normalizes it into salaryDerived, and flattens it into ready-to-export salaryMin, salaryMax, salaryCurrency, and salaryPeriod columns. When an employer does not display pay, a deterministic parser still checks the posting text for a published range. No model calls, no guessing: the Ashby salary fields come from what the employer wrote.

### One actor, three ways to read a board

1. **Full job records** (default): every open job on the Ashby job boards you name, with descriptions in the formats you pick and salary data on every row that has it.
2. **Job URLs only**: the cheapest way to index everything: id, title, company, link, employment type, and the publish date, without descriptions.
3. **Company discovery**: one row per company that hires through Ashby, live-verified with a current open-jobs count. The bundled directory covers 2,700+ boards found in public web archives and re-verified at run time.

Leave the company list empty and the actor sweeps the directory for you, capped by maxCompanies and maxJobs so an exploratory run stays small.

### Company identity and remote eligibility

Turn on the company-data add-on and each job row is enriched from its own public job page: the hiring company's real name, website, and logo, the countries where remote applicants may live, the application deadline when the employer sets one, and whether the posting accepts direct applications. Remote-eligibility countries are the employer's own declaration, not a guess, which makes this the clean way to build location-aware remote job feeds from Ashby boards.

### Find companies that use Ashby

Set outputMode to companiesOnly and the actor becomes an Ashby customers directory: one row per company with its board slug, board URL, and a live count of open roles. Filter it with discoveryQuery, or pass your own prospect list to check specific companies. Nobody publishes an official list of companies that use Ashby; this mode builds you one on demand.

### Check whether a company has an Ashby job board

Type a company name the way you know it. The actor matches names to board slugs automatically ("Black Semiconductor" finds blacksemiconductor), and when a board does not exist it returns a clear in-band error row with the closest known slugs as did-you-mean suggestions. Point it at a list of prospects and it tells you exactly who hires through Ashby and how many roles they have open.

### Track new Ashby job postings without state

Every Ashby job carries the employer's own publish timestamp. Set publishedAfter to 25h on a daily schedule and each run returns only what appeared since yesterday. There is no seen-list or delta store to maintain between runs, because the timestamp comes from the source.

### Pay for exactly what you receive

Billing is per delivered row, with no start fee and no minimum spend. Filters (title, department, location, employment type, remote, dates) run before billing, so filtered jobs cost nothing. The base job record is one event, salary data included; Markdown, HTML, or plain-text descriptions, the company and remote-eligibility enrichment, and the whole-run report are optional add-ons, each billed only on the rows that actually carry them. Turn everything off and a job row costs a fraction of a cent.

### Input parameters

| Parameter | Type | Default | What it does |
|---|---|---|---|
| companies | array | \["cerebras"] | Company names, board slugs, or any board, embed, or single-job URL, mixed freely |
| startUrls | array | \[] | Same values in URL-list form; merged with companies |
| outputMode | select | jobs | jobs, urlsOnly, or companiesOnly |
| discoveryQuery | string | "" | Text match over the company directory for discovery and sweeps |
| verifyCompanies | boolean | true | Live-probe each discovered company before returning it |
| titleKeywords | array | \[] | Keep jobs whose title contains any of these |
| departments | array | \[] | Keep jobs in matching departments or teams |
| locationKeywords | array | \[] | Keep jobs in matching locations or addresses |
| employmentTypes | array | \[] | Keep only these employment types (FullTime, PartTime, Intern, Contract, Temporary) |
| remoteOnly | boolean | false | Keep only jobs the board marks as remote |
| publishedAfter | string | "" | 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 | Add company website, logo, remote-eligibility countries, deadline, and direct-apply from the job page (paid add-on) |
| report | select | none | Write a Markdown or HTML run report (paid add-on) |
| maxCompanies | integer | 25 | Cap on companies in sweeps and discovery |
| maxJobsPerCompany | integer | 0 | Per-board cap, 0 = all |
| maxJobs | integer | 100 | Whole-run cap, the main cost control |
| maxConcurrency | integer | 5 | Parallel discovery probes |

### Example output

```json
{
  "resultType": "job",
  "id": "b5f37f60-04b2-4b1c-8cf1-d1cbbf3f1b25",
  "title": "Security Engineer, Cloud",
  "companyName": "Ramp",
  "boardToken": "ramp",
  "url": "https://jobs.ashbyhq.com/ramp/b5f37f60-04b2-4b1c-8cf1-d1cbbf3f1b25",
  "applyUrl": "https://jobs.ashbyhq.com/ramp/b5f37f60-04b2-4b1c-8cf1-d1cbbf3f1b25/application",
  "department": "Engineering",
  "location": "New York",
  "isRemote": true,
  "workplaceType": "Hybrid",
  "employmentType": "FullTime",
  "datePublished": "2026-07-11T14:02:11.000+00:00",
  "compensationSummary": "$211.4K - $290.6K",
  "salaryDerived": { "min": 211400, "max": 290600, "currency": "USD", "period": "year", "source": "native" },
  "salaryMin": 211400,
  "salaryMax": 290600,
  "salaryCurrency": "USD",
  "salaryPeriod": "year",
  "descriptionMarkdown": "# About Ramp\n\nRamp is building the smart infrastructure...",
  "source": "ashby",
  "scrapedAt": "2026-08-26T16:00:00Z"
}
```

### Use cases

- Job boards and aggregators: backfill and refresh listings straight from the source, not from a third-party index.
- Recruiters and sourcers: pull every open role at target companies, filtered by title, department, location, or employment type.
- Remote-work feeds: set remoteOnly and publishedAfter and you have a daily Ashby remote jobs pipeline.
- Compensation research: Ashby employers publish structured pay ranges; collect Ashby salary data at scale for benchmarking.
- Sales and GTM teams: hiring is a buying signal. Discover companies that use Ashby in your niche and watch where headcount is going.
- AI agents: structured JSON, Markdown descriptions, stable field names, and MCP support make this a clean tool for agent pipelines.

### Getting started

1. Add company names, slugs, or board URLs to the companies field.
2. Pick the description formats you want (Markdown is on by default).
3. Run it. Rows land in the dataset; a per-board summary lands in the key-value store.

[View on Apify Store](https://apify.com/johnvc/ashby-job-board-scraper?fpr=9n7kx3)

For scheduled monitoring, create a daily schedule with publishedAfter set to 25h and the actor becomes a new-postings feed for the boards you care about.

### Integrations

- Apify API and clients: run the actor and read the dataset from Python or JavaScript with the [Apify API](https://docs.apify.com/api/v2), or export results as JSON, CSV, or Excel straight from the console.
- Schedules and monitoring: pair a daily schedule with publishedAfter for a hands-off new-roles feed.
- MCP: add the actor to any MCP client through the hosted server (section below).
- Automation platforms: connect through Apify's [integrations](https://docs.apify.com/platform/integrations) for n8n, Make, Zapier, webhooks, and Google Sheets.
- Crypto-native agents: pay per run over the x402 protocol (section below).

### Related tools

Part of a family of job-data APIs on this account:

- [Greenhouse Job Board API](https://apify.com/johnvc/greenhouse-job-board-api?fpr=9n7kx3) for Greenhouse-hosted career sites
- [Workday Careers API](https://apify.com/johnvc/workday-careers-api?fpr=9n7kx3) for Workday-hosted career sites
- [iCIMS Careers API](https://apify.com/johnvc/icims-careers-api?fpr=9n7kx3) for iCIMS career portals
- [Oracle Taleo Jobs API](https://apify.com/johnvc/oracle-taleo-jobs-api?fpr=9n7kx3) for Taleo career sections
- [JazzHR Jobs API](https://apify.com/johnvc/jazzhr-jobs-api?fpr=9n7kx3) for the JazzHR platform
- [Wellfound Jobs API](https://apify.com/johnvc/wellfound-jobs-api?fpr=9n7kx3) for startup jobs on Wellfound
- [LinkedIn Jobs API](https://apify.com/johnvc/linkedin-jobs-api?fpr=9n7kx3) for LinkedIn job search results

### 🔌 Ashby MCP: use this API from Claude and AI agents

Looking for an Ashby MCP server that reads job boards instead of managing them? Add this actor as a tool in [Claude Code](https://claude.ai/referral/uIlpa7nPLg) (free trial), [Claude Cowork](https://claude.ai/referral/uIlpa7nPLg) (free trial), or any MCP client, through the hosted Apify MCP server:

```
https://mcp.apify.com/?tools=actors,docs,johnvc/ashby-job-board-scraper
```

https://www.youtube.com/watch?v=jREWahDGhJM

Apify MCP integration docs: https://docs.apify.com/platform/integrations/mcp

### 💸 Pay per run with crypto (x402)

The Ashby Job Board API supports agentic payments via the [x402 protocol](https://docs.apify.com/platform/integrations/x402).
AI agents and MCP clients can pay for runs in USDC (on Base) with no Apify account or API token needed:
point your agent at the [Apify MCP server](https://mcp.apify.com/?tools=actors,docs,johnvc/ashby-job-board-scraper) and it can
discover, pay for, and run this actor autonomously. Read the
[Apify x402 announcement](https://apify.com/change-log/pay-for-apify-actors-with-x402?fpr=9n7kx3) for details.

### Ashby job board API pricing

Pay per event, per delivered row. The base job record covers every structured field, salary data included. Add-ons bill only on rows that carry them: description formats, the company and remote-eligibility enrichment, and the whole-run report. URL index rows and discovered companies have their own low per-row events. No start fee, no monthly rental, no minimum results per run, and filtered rows are never charged. Current prices are on the store page's pricing card.

### FAQ

#### Is this an API or a web scraper?

Both, honestly. 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 Ashby scraper, this is the version where someone else maintains the parser.

#### Can I use this from Claude or another MCP client?

Yes. Add the hosted MCP server URL from the section above and the actor shows up as a callable tool in [Claude Code](https://claude.ai/referral/uIlpa7nPLg) (free trial), [Claude Cowork](https://claude.ai/referral/uIlpa7nPLg) (free trial), or any MCP client. Agents can discover it, run it, and read the dataset without any glue code.

#### How do I check if a company has an Ashby job board?

Put the company's name in the companies field. The actor tries the name's slug spellings against the live API, and in companiesOnly mode it returns one row per company with its board URL and current job count, or a clear not-found error with did-you-mean suggestions.

#### Is there a page that lists all Ashby job boards?

Not from Ashby itself, which is exactly why this actor exists. Set outputMode to companiesOnly and it sweeps its bundled directory of verified boards, capped by maxCompanies. Raise the caps to go wider.

#### What is jobs.ashbyhq.com?

It is the domain where Ashby hosts its customers' public job boards: every company on Ashby gets a careers 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.

#### What is api.ashbyhq.com?

It is the public, read-only job posting API that powers every hosted Ashby job board. This actor reads it directly, which is why results are live rather than indexed.

#### What is the difference between Ashby and Greenhouse job boards?

They are competing applicant tracking systems with similar public job feeds. Ashby boards live at jobs.ashbyhq.com and publish structured salary data far more often; Greenhouse boards live at boards.greenhouse.io and carry an extra last-updated timestamp. This account maintains an actor for each: this one for Ashby, and the [Greenhouse Job Board API](https://apify.com/johnvc/greenhouse-job-board-api?fpr=9n7kx3) for Greenhouse, with matching output schemas so you can merge both into one dataset.

#### Do I need an Ashby API key?

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 and no key to manage.

#### How do I get salary data for Ashby jobs?

It is on the base job row. Employers that display compensation publish structured ranges; those arrive as salaryRaw (verbatim) and salaryDerived (normalized min, max, currency, period, with source set to native). For employers that do not display pay, the actor still parses the posting text for a published range.

#### How do I get only new job postings?

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.

#### How do I find companies that use Ashby?

Set outputMode to companiesOnly. You get one row per company with its board slug, a live open-jobs count, and the board URL. Add a discoveryQuery to narrow by name, or pass your own prospect list to check specific companies.

#### Is the job description included by default?

Yes, as Markdown, which reads well in AI pipelines and converts cleanly to anything else. HTML and plain text are separate toggles. Each format is a per-row add-on charge, so you only pay for what you ship.

#### Why did a board return an error row?

Error rows carry a stable errorCode: board\_not\_found means the slug does not exist on the public API (check the didYouMean suggestions), job\_not\_found means a single-job URL pointed at a closed posting, http\_error means the source answered abnormally. Errors are in-band rows, so your pipeline sees them without reading logs.

### Featured Tasks

Ready-to-run examples that show this API solving a specific problem. Each opens its own setup so you can run it on your account in one click.

- [Find Companies That Use Ashby ATS](https://apify.com/johnvc/ashby-job-board-scraper/examples/find-companies-using-ashby?fpr=9n7kx3) - a live directory of companies hiring through Ashby with open-jobs counts.
- [Scrape Ashby Jobs With Salary Data](https://apify.com/johnvc/ashby-job-board-scraper/examples/ashby-jobs-with-salary-data?fpr=9n7kx3) - job rows with the employer's published salary ranges normalized.
- [Track New Ashby Job Postings Daily](https://apify.com/johnvc/ashby-job-board-scraper/examples/track-new-ashby-jobs-daily?fpr=9n7kx3) - a schedule-ready feed of postings added in the last day.
- [Ashby Jobs as Markdown for AI Agents](https://apify.com/johnvc/ashby-job-board-scraper/examples/ashby-jobs-markdown-ai-agents?fpr=9n7kx3) - postings as clean Markdown for LLM and MCP pipelines.
- [Check If a Company Has an Ashby Job Board](https://apify.com/johnvc/ashby-job-board-scraper/examples/check-company-ashby-board?fpr=9n7kx3) - verify a prospect list against Ashby with did-you-mean suggestions.
- [抓取 Ashby 远程职位数据](https://apify.com/johnvc/ashby-job-board-scraper/examples/ashby-remote-jobs-zh?fpr=9n7kx3) - 远程职位数据,结构化 JSON 输出 (Simplified Chinese).
- [查找使用 Ashby 招聘系统的公司](https://apify.com/johnvc/ashby-job-board-scraper/examples/ashby-companies-directory-zh?fpr=9n7kx3) - 使用 Ashby 的公司名单与在招职位数 (Simplified Chinese).

### Agent skills

Install ready-made Claude skills that drive this API:

- [Ashby jobs scraper skill](https://github.com/johnisanerd/claude-skill-ashby-jobs-scraper): live job rows with published salary columns.
- [Companies using Ashby skill](https://github.com/johnisanerd/claude-skill-companies-using-ashby): a live-verified directory of companies hiring through Ashby.

Install with `npx skills add johnisanerd/claude-skill-ashby-jobs-scraper` or add the folder to your agent's skills directory.

### 🌐 About Alpha OSINT

This Actor is part of [Alpha OSINT](https://www.alphaosint.com), toolset of financial and operations data sources and APIs.
For support or requests for this actor, please start a ticket [directly on our support page](https://apify.com/johnvc/ashby-job-board-scraper/issues/open?fpr=9n7kx3).

Last Updated: 2026.08.27

# Actor input Schema

## `companies` (type: `array`):

Ashby board slugs, company names, or URLs, mixed freely: a bare slug (cerebras), a company name (Black Semiconductor), a board URL (https://jobs.ashbyhq.com/cerebras), an embed URL (.../allspice/embed), or a single job URL (.../cerebras/5985b733-... or its /application page). Company names are matched to their board automatically. Leave empty together with startUrls to sweep companies from the bundled directory instead.

## `startUrls` (type: `array`):

Alternative to the companies field for URL-shaped input; both lists are merged. Accepts the same board, embed, and single-job URL forms.

## `outputMode` (type: `string`):

jobs returns full job records. urlsOnly returns the job index without descriptions, the cheapest way to list everything. companiesOnly returns one row per company from the discovery directory with a live job count.

## `discoveryQuery` (type: `string`):

Case-insensitive text matched against company names and board slugs in the bundled directory. Scopes companiesOnly runs and empty-input sweeps. Leave empty to take the largest boards first.

## `verifyCompanies` (type: `boolean`):

companiesOnly mode: probe each candidate board against the live API before returning it, adding a current job count. Dead boards are skipped and never billed. Turn off to list the directory snapshot without network checks.

## `titleKeywords` (type: `array`):

Keep only jobs whose title contains any of these words, for example engineer, sales, designer. Filters run before billing, so filtered jobs cost nothing.

## `departments` (type: `array`):

Keep only jobs whose department or team name contains any of these values, for example Engineering, Marketing.

## `locationKeywords` (type: `array`):

Keep only jobs whose primary location, secondary locations, or address contains any of these values, for example Remote, London, New York.

## `employmentTypes` (type: `array`):

Keep only jobs with any of these employment types. Leave empty for all types.

## `remoteOnly` (type: `boolean`):

Keep only jobs the board marks as remote. Uses the employer's own remote flag and workplace type.

## `publishedAfter` (type: `string`):

Keep only jobs published on or after this cutoff. Accepts a relative window (24h, 7d, 2w) or an ISO date or datetime (2026-08-01 or 2026-08-01T12:00:00Z). Uses the board's own publishedAt timestamp, so a daily schedule with 25h returns only new postings. No state to manage.

## `includeDescriptionMarkdown` (type: `boolean`):

Add descriptionMarkdown to each job row: the posting converted to clean Markdown, compact and ready for AI agents and LLM pipelines. Billed per job row that carries it. Uncheck for cheaper metadata-only rows.

## `includeDescriptionHtml` (type: `boolean`):

Add descriptionHtml to each job row: the original posting markup as the board publishes it. Billed per job row that carries it.

## `includeDescriptionText` (type: `boolean`):

Add descriptionText to each job row: the board's own plain-text rendering of the posting. Billed per job row that carries it.

## `includeCompanyData` (type: `boolean`):

Enrich each job row from its public job page: 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, so large runs are slower. Billed per job row that carries the data.

## `report` (type: `string`):

Also write a human-readable digest of every scraped job, grouped by company with pay summaries, to the key-value store under the REPORT key. One flat charge per report. Capped at 5000 rows.

## `maxCompanies` (type: `integer`):

Cap on companies processed in a discovery sweep or companiesOnly run. Keeps empty-input runs small and predictable.

## `maxJobsPerCompany` (type: `integer`):

Cap on job rows per board after filtering. 0 means no per-company cap.

## `maxJobs` (type: `integer`):

Hard ceiling on rows across the entire run, all companies combined. The main cost control. 0 means unlimited.

## `maxConcurrency` (type: `integer`):

Parallel board probes in discovery mode. Board scraping itself is one request per company.

## `proxyConfiguration` (type: `object`):

Optional. The public board API answers direct connections, so leave this off unless your network requires a proxy.

## Actor input object example

```json
{
  "companies": [
    "cerebras"
  ],
  "startUrls": [],
  "outputMode": "jobs",
  "discoveryQuery": "",
  "verifyCompanies": true,
  "titleKeywords": [],
  "departments": [],
  "locationKeywords": [],
  "employmentTypes": [],
  "remoteOnly": false,
  "publishedAfter": "",
  "includeDescriptionMarkdown": true,
  "includeDescriptionHtml": false,
  "includeDescriptionText": false,
  "includeCompanyData": false,
  "report": "none",
  "maxCompanies": 25,
  "maxJobsPerCompany": 0,
  "maxJobs": 100,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `allResults` (type: `string`):

Every row this run produced.

## `overview` (type: `string`):

Job rows with the headline fields: title, company, location, employment type, pay, and the apply link.

## `salaries` (type: `string`):

Job rows focused on compensation: the employer's pay summary and the normalized salary range.

## `companies` (type: `string`):

One row per discovered company with a live open-jobs count and a link to their board.

## `newPostings` (type: `string`):

Job rows ordered for monitoring, publish date first.

## `report` (type: `string`):

The whole-run Markdown or HTML report, when the report add-on was enabled.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "companies": [
        "cerebras"
    ],
    "startUrls": [],
    "titleKeywords": [],
    "departments": [],
    "locationKeywords": [],
    "employmentTypes": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("johnvc/ashby-job-board-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "companies": ["cerebras"],
    "startUrls": [],
    "titleKeywords": [],
    "departments": [],
    "locationKeywords": [],
    "employmentTypes": [],
}

# Run the Actor and wait for it to finish
run = client.actor("johnvc/ashby-job-board-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "companies": [
    "cerebras"
  ],
  "startUrls": [],
  "titleKeywords": [],
  "departments": [],
  "locationKeywords": [],
  "employmentTypes": []
}' |
apify call johnvc/ashby-job-board-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,johnvc/ashby-job-board-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/H9ZkYEGh5gSvAVSXT/builds/V1FcGmwQ5EUubovcG/openapi.json
