# Ashby Jobs API: Jobs with Compensation from Any Ashby Board (`ailu_studio/ashby-jobs-api`) Actor

Ashby jobs API: every open job on any Ashby board (jobs.ashbyhq.com) with full description and compensation: salary min/max, equity, commission and per-tier ranges. Bulk board URLs or slugs; keyword, location, remote, type and date filters.

- **URL**: https://apify.com/ailu_studio/ashby-jobs-api.md
- **Developed by:** [Ailu Studio](https://apify.com/ailu_studio) (community)
- **Categories:** Jobs, Lead generation, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 jobs

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Ashby Jobs API: every job with compensation (salary range, equity, tiers) from any Ashby board

Ashby hosts the careers pages of many fast-growing companies (OpenAI, Ramp, Notion, Linear and many more) at `jobs.ashbyhq.com/<slug>`. This Actor reads Ashby's public posting API with compensation turned on and returns every listed job as a clean row: title, department, team, all locations, workplace type, employment type, publish date, the **full description** and the **published compensation**: salary min/max/currency/interval, the compensation summary ("$160K – $230K • Offers Equity • Offers Commission"), equity/commission/bonus flags and every compensation tier (for example one range per location zone). Paste any number of board URLs or slugs. It reads the boards you name live (one request per board), needs no API key, and costs $1.50 per 1,000 jobs versus $2.00–$3.00 for the most-used Ashby Actors in the Store.

### Use cases

- **Salary benchmarking**: structured, employer-published pay ranges by role, level and location zone.
- **Job aggregation**: pull startup jobs from many Ashby boards into one feed or job board.
- **Hiring signals**: track which teams and locations a company is hiring for, week by week.
- **Candidate alerts**: run daily with `postedWithinDays: 1`, a keyword list and `remoteOnly`.
- **AI matching**: descriptions arrive as plain text, ready for embedding.

### Input

| Field | Default | Meaning |
|---|---|---|
| `boards` | `["ramp", "notion"]` | Ashby board URLs (`jobs.ashbyhq.com/<slug>`, a job URL) or bare slugs. |
| `keywords` | – | Keep jobs whose title or description contains any of these words. |
| `locations` | – | Keep jobs whose primary/secondary location or country contains any of these strings. |
| `remoteOnly` | `false` | Only jobs Ashby flags as remote. |
| `employmentType` | – | Any of FullTime, PartTime, Intern, Contract, Temporary (spelling-insensitive). |
| `postedWithinDays` | `0` | Only jobs published in the last N days (0 = off). |
| `descriptionFormat` | `text` | `text`, `html`, `both` or `none`. |
| `maxItems` | `200` | Cap on returned jobs for the whole run. |

```json
{ "boards": ["https://jobs.ashbyhq.com/openai", "ramp", "linear"], "keywords": ["engineer"], "locations": ["San Francisco", "Remote"], "employmentType": ["FullTime"], "postedWithinDays": 30, "maxItems": 500 }
```

### Output

| Field | Type | Meaning |
|---|---|---|
| `id`, `sourceId` | string | `ashby:<slug>:<jobId>` and the Ashby job UUID. |
| `company`, `companySlug` | string | Company name from the board page and the board slug. |
| `title`, `department`, `team` | string | Job title and organisation. |
| `locations`, `country` | string\[], string | Primary + secondary locations; country of the primary address. |
| `isRemote`, `workplaceType`, `employmentType` | boolean, string, string | Ashby's remote flag, onsite/hybrid/remote, Full Time/Intern/... |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryInterval`, `salaryRaw` | number, number, string, string, string | Overall salary range across tiers; `null` when not published. |
| `compensationSummary` | string | Ashby's compensation summary line. |
| `offersEquity`, `offersCommission`, `offersBonus` | boolean | Compensation components (null when nothing is published). |
| `compensationTiers` | object\[] | Each tier: `title`, `summary`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryInterval`. |
| `postedAt`, `updatedAt` | ISO 8601 | Publish time (UTC). |
| `url`, `applyUrl` | string | Posting and application page. The Actor never applies. |
| `descriptionText`, `descriptionHtml` | string | Full description in the requested format(s). |
| `fetchedAt` | ISO 8601 | Run time. |

```json
{
  "id": "ashby:ramp:4745807e-82f4-4b1a-857c-dc8dadc73076", "sourceId": "4745807e-82f4-4b1a-857c-dc8dadc73076", "source": "ashby", "companySlug": "ramp", "company": "Ramp",
  "title": "Credit Risk Associate", "department": "Risk", "team": "Risk", "locations": ["New York, NY (HQ)"], "country": "USA",
  "isRemote": true, "workplaceType": "hybrid", "employmentType": "Full Time", "postedAt": "2026-08-12T20:22:32.685Z", "updatedAt": null,
  "url": "https://jobs.ashbyhq.com/ramp/4745807e-82f4-4b1a-857c-dc8dadc73076", "applyUrl": "https://jobs.ashbyhq.com/ramp/4745807e-82f4-4b1a-857c-dc8dadc73076/application",
  "compensationSummary": "$108K – $200K • Offers Equity", "offersEquity": true, "offersCommission": false, "offersBonus": false,
  "compensationTiers": [{ "title": null, "summary": "$108K – $200K • Offers Equity", "salaryMin": 108000, "salaryMax": 200000, "salaryCurrency": "USD", "salaryInterval": "year" }],
  "salaryMin": 108000, "salaryMax": 200000, "salaryCurrency": "USD", "salaryInterval": "year", "salaryRaw": "$108K - $200K",
  "descriptionText": "ABOUT RAMP\n\nRamp is building the smart infrastructure for finance teams, …", "descriptionHtml": null, "fetchedAt": "2026-11-04T11:35:55.991Z"
}
```

### How it works and limits

- Per board: `GET api.ashbyhq.com/posting-api/job-board/<slug>?includeCompensation=true` (all jobs, descriptions and compensation in one response) plus one request to the public board page to read the company display name. Requests are spaced 300 ms per host and retried on 429/5xx.
- Unlisted jobs (`isListed: false`) are skipped. Compensation appears only when the employer publishes it (on 2026-11-04: Ramp 162 of 168 jobs, OpenAI 645 of 812, Notion none).
- `salaryMin`/`salaryMax` are the overall range across tiers; per-zone ranges are in `compensationTiers`.
- Ashby's `isRemote` flag can be true for hybrid jobs that also accept remote candidates; use `workplaceType` when you need the strict value.
- Boards are read in the order given; once `maxItems` is reached the remaining boards are skipped and listed in the run summary (`OUTPUT` record).
- Not covered: private/confidential postings, application forms, candidate data.

### Pricing

Pay per result: **$1.50 per 1,000 rows** (`job` event). Platform usage is billed separately by Apify. Removed/free rows are not charged.

### Legal

Not affiliated with Ashby, Inc. or the employers. Uses the public Ashby Job Postings API only. Data licence/terms: https://developers.ashbyhq.com/docs/public-job-posting-api. Job content belongs to the employers who published it.

### FAQ

**Where is the slug?** In the careers URL: `https://jobs.ashbyhq.com/<slug>`. Companies that embed Ashby on their own site still have this URL; the "Apply" link usually shows it.

**Why is compensation empty for some jobs?** The employer did not publish it on Ashby. The Actor never estimates salaries.

**Can I get only new jobs?** Use `postedWithinDays: 1` on a daily schedule, or the *Job Change Tracker* Actor for new/updated/removed detection.

**How big can a board be?** Large boards (800+ jobs) still come back in one response; raise `maxItems` to export all of them.

# Actor input Schema

## `boards` (type: `array`):

Ashby job board URLs or slugs, e.g. "https://jobs.ashbyhq.com/ramp", a job URL from the board, or just "notion". The slug is the part after jobs.ashbyhq.com/.

## `keywords` (type: `array`):

Only return jobs whose title or description contains at least one of these words (case-insensitive), e.g. \["engineer", "product"]. Leave empty for all jobs.

## `locations` (type: `array`):

Only return jobs whose primary or secondary location (or country) contains one of these strings, e.g. \["New York", "London"]. "Remote" also matches jobs Ashby flags as remote.

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

When true, only jobs Ashby flags as remote are returned (this includes hybrid jobs that also accept remote candidates).

## `employmentType` (type: `array`):

Keep only these Ashby employment types: FullTime, PartTime, Intern, Contract, Temporary. Spelling and hyphens do not matter ("full-time" works). Leave empty for all.

## `postedWithinDays` (type: `integer`):

Only return jobs published in the last N days (0 = no date filter). Use 1 for a daily run that only picks up new postings.

## `descriptionFormat` (type: `string`):

Plain text suits AI processing and spreadsheets; HTML keeps headings and bullet lists; "none" drops the description to keep rows small.

## `maxItems` (type: `integer`):

Upper limit on returned jobs for the whole run (default 200). Raise it for full exports; boards such as OpenAI list 800+ jobs.

## Actor input object example

```json
{
  "boards": [
    "ramp",
    "notion",
    "https://jobs.ashbyhq.com/linear"
  ],
  "keywords": [],
  "locations": [],
  "remoteOnly": false,
  "employmentType": [],
  "postedWithinDays": 0,
  "descriptionFormat": "text",
  "maxItems": 200
}
```

# Actor output Schema

## `results` (type: `string`):

All rows in the default dataset.

# 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 = {
    "boards": [
        "ramp",
        "notion",
        "https://jobs.ashbyhq.com/linear"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ailu_studio/ashby-jobs-api").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 = { "boards": [
        "ramp",
        "notion",
        "https://jobs.ashbyhq.com/linear",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("ailu_studio/ashby-jobs-api").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 '{
  "boards": [
    "ramp",
    "notion",
    "https://jobs.ashbyhq.com/linear"
  ]
}' |
apify call ailu_studio/ashby-jobs-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ailu_studio/ashby-jobs-api"
        }
    }
}
```

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/cGKjbaCOLJDKEg316/builds/K4191FqHJ72BJGyvh/openapi.json
