# Ashby Jobs Scraper: Open Roles, Compensation & Descriptions (`larkmoor/ashby-jobs`) Actor

Get every open job from any company's Ashby job board via Ashby's official public posting API: title, department, team, locations, workplace type, remote flag, salary and equity, posted date, full description. Filter by keyword, location, team, type, date. $1 per 1,000 jobs.

- **URL**: https://apify.com/larkmoor/ashby-jobs.md
- **Developed by:** [Larkmoor Data](https://apify.com/larkmoor) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.85 / 1,000 jobs

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?

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 Scraper: Open Roles, Compensation & Descriptions

Get every open job from any company that hires through Ashby — Ramp, Notion, Linear, OpenAI, Deel, Vanta, Plaid, Supabase and thousands of fast-growing startups — as one clean row per job: title, department, team, primary and secondary locations, workplace type (on-site, hybrid, remote), a remote flag, employment type, the published salary range with currency and period, whether equity or bonus is offered, the publish date, the job and apply URLs, and the full description as plain text and HTML.

It reads Ashby's **official public Job Posting API** (`api.ashbyhq.com/posting-api/job-board`), the feed Ashby publishes so companies can show their open roles anywhere. No browser, no login, no proxies, no blocked runs.

### What you can use it for

- **Startup job boards**: Ashby is the applicant tracking system of choice for venture-backed startups, so this is the fastest way to fill an AI, fintech, devtools or remote job board with fresh roles
- **Sales and recruiting leads**: see which startups are hiring for which teams right now — a company opening ten go-to-market roles just raised money
- **Compensation research**: Ashby companies publish structured pay ranges (salary, equity, bonus) far more often than average; collect them by title, level and location
- **Competitive intelligence**: track a competitor's hiring by team and location week by week
- **Job alerts**: a daily scheduled run with `postedWithinDays: 1` sends only new roles to Slack, email or a sheet
- **Career search**: one list of every open "founding engineer" or "product designer" role across your target startups

### Why this one

- **$1 per 1,000 jobs**, $0.001 per run start — half the price of the other Ashby actor in the Store
- **Reliable**: official public API, so runs do not fail on bot checks or page redesigns
- **Structured compensation**: salary min/max, currency and period read from Ashby's own compensation tiers (not guessed from text), plus the human summary ("$211.4K – $290.6K • Offers Equity"), an equity flag, a bonus flag, a commission flag (sales roles) and every component in `compensationComponents`
- **Accepts anything**: a board name (`ramp`), a board URL (`https://jobs.ashbyhq.com/notion`) or a company careers page that links to its Ashby board — it finds the board for you
- **Real filters**: keywords (title or full text), locations (primary and secondary), department or team, employment type, remote only, posted within N days, salary only — and you only pay for the jobs that pass them
- **256 MB memory**, a 170-job company finishes in about a second

### Input

| Field | What it does |
|---|---|
| `companies` | Ashby board names, board URLs or company careers pages |
| `keywords` | Keep jobs mentioning any of these words |
| `keywordsInTitleOnly` | Match keywords in the title only |
| `locations` | Keep jobs whose primary or secondary location contains any of these ("New York", "Canada", "Remote") |
| `departments` | Keep jobs whose department or team matches ("Engineering", "Sales") |
| `employmentTypes` | FullTime, PartTime, Contract, Intern, Temporary |
| `remoteOnly` | Only remote roles |
| `postedWithinDays` | Only jobs published in the last N days |
| `withSalaryOnly` | Only jobs with a published compensation range |
| `includeDescription` | Include the description text and HTML (default on) |
| `maxJobsPerCompany` / `maxResults` | Caps per company and for the whole run |

Example:

```json
{
  "companies": ["ramp", "https://jobs.ashbyhq.com/notion", "linear"],
  "keywords": ["engineer"],
  "keywordsInTitleOnly": true,
  "locations": ["United States", "Remote"],
  "withSalaryOnly": true,
  "maxResults": 500
}
```

### Output

```json
{
  "company": "ramp",
  "boardSlug": "ramp",
  "jobId": "34413f8d-26bf-4bbc-8ade-eb309a0e2245",
  "title": "Security Engineer, Cloud",
  "department": "Engineering",
  "team": "Backend",
  "employmentType": "FullTime",
  "location": "New York, NY (HQ)",
  "secondaryLocations": ["Remote (Canada)", "Remote (US)", "Miami, FL"],
  "city": "New York City",
  "region": "NY",
  "country": "USA",
  "workplaceType": "Hybrid",
  "remote": true,
  "publishedAt": "2026-04-07T17:12:35.753+00:00",
  "url": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245",
  "applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application",
  "salaryMin": 211400,
  "salaryMax": 290600,
  "salaryCurrency": "USD",
  "salaryPeriod": "year",
  "compensationSummary": "$211.4K – $290.6K • Offers Equity",
  "equity": true,
  "bonus": null,
  "commission": null,
  "compensationComponents": [{"type": "Salary", "interval": "1 YEAR", "currency": "USD", "min": 211400, "max": 290600}],
  "descriptionText": "ABOUT RAMP\n\nRamp is building the smart infrastructure for finance teams...",
  "descriptionHtml": "<h1><strong>About Ramp</strong></h1>..."
}
```

### How much does it cost?

**$1.00 per 1,000 jobs** on the Free plan plus **$0.001 per run**, with automatic discounts on paid Apify plans. Platform compute is included. Filters run before you are charged, so filtered-out jobs cost nothing.

Worked examples:

- **Daily alert for 50 startups**, about 30 new jobs a day: **$0.03 a day**, under $1 a month
- **Full snapshot of 300 Ashby companies** (about 20,000 open jobs): **$20**
- **Compensation study**: every engineering role with a published range across 100 startups (about 2,000 jobs): **$2**

### FAQ

**Is this legal?**
Yes. It uses Ashby's public Job Posting API, which Ashby documents for exactly this purpose (showing a company's open jobs anywhere). Job postings are public advertisements; no login, no candidate data and no personal data are touched. Unlisted jobs (`isListed: false`) are skipped.

**How do I find a company's board name?**
Open the company's careers page. If a job link goes to `jobs.ashbyhq.com/<name>`, the board name is that last part. Or paste the careers page URL and the actor looks for the Ashby link in the page (if a careers page loads its job list only with JavaScript, give the board name instead).

**Can it search all Ashby companies at once?**
Ashby has no public directory of every board, so you give the companies. Lists of a few hundred work well in one run.

**Why is the salary empty for some jobs?**
The company chose not to publish a range for that job. US companies publish one for most roles in states with pay-transparency laws. Use `withSalaryOnly` to keep only jobs with a range.

**Why is `company` the board name and not the full company name?**
Ashby's public feed does not carry the display name; the board name is the stable identifier and is what appears in the job URL.

**Does it cover Greenhouse, Lever or Workday?**
This actor is focused on Ashby. We publish a dedicated Greenhouse Jobs actor, and our Career Site Jobs actor mixes several applicant tracking systems in one run.

### Tips

- Schedule it daily with `postedWithinDays: 1` and connect Slack or email for a zero-maintenance job alert.
- Use `keywordsInTitleOnly` for precise roles ("designer"), full-text keywords for skills ("Rust", "LLM").
- `locations: ["Remote"]` matches both the remote flag and jobs that list a remote secondary location.

### Integrations

Works with Google Sheets, Slack, Zapier, Make, Airtable, webhooks, the Apify API and the Python and JavaScript clients. Download as JSON, CSV, Excel, XML or HTML.

### Changelog

- **2026-10-22** — First release: all listed jobs per Ashby board, team and department, primary and secondary locations, workplace type, structured compensation (salary, equity, bonus), posted-date, keyword, location, team and employment-type filters, careers-page auto-detection.

# Actor input Schema

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

Ashby job board names (e.g. 'ramp', the part after jobs.ashbyhq.com/), job-board URLs, or company careers pages that embed an Ashby board.

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

Keep jobs whose title or description contains any of these words (case-insensitive). Empty = all jobs.

## `keywordsInTitleOnly` (type: `boolean`):

Only look for the keywords in the job title (stricter).

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

Keep jobs whose location or office contains any of these (e.g. 'New York', 'London', 'Remote').

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

Keep jobs whose department or team contains any of these (e.g. 'Engineering', 'Sales').

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

Keep only these Ashby employment types: FullTime, PartTime, Contract, Intern, Temporary. Empty = all.

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

Keep only jobs that mention remote work in the location, office or title.

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

Keep only jobs published in the last N days. Empty = any age.

## `withSalaryOnly` (type: `boolean`):

Keep only jobs where the company publishes a compensation range.

## `includeDescription` (type: `boolean`):

Include the job description as plain text and HTML.

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

Stop after this many jobs from one company.

## `maxResults` (type: `integer`):

Hard cap on rows for the whole run (you pay per job row).

## Actor input object example

```json
{
  "companies": [
    "ramp",
    "notion",
    "linear"
  ],
  "keywords": [
    "engineer"
  ],
  "keywordsInTitleOnly": false,
  "remoteOnly": false,
  "withSalaryOnly": false,
  "includeDescription": true,
  "maxJobsPerCompany": 1000,
  "maxResults": 50
}
```

# Actor output Schema

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

All results as JSON items in the run's default dataset (also downloadable as CSV/Excel from the 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 = {
    "companies": [
        "ramp",
        "notion",
        "linear"
    ],
    "keywords": [
        "engineer"
    ],
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("larkmoor/ashby-jobs").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": [
        "ramp",
        "notion",
        "linear",
    ],
    "keywords": ["engineer"],
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("larkmoor/ashby-jobs").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": [
    "ramp",
    "notion",
    "linear"
  ],
  "keywords": [
    "engineer"
  ],
  "maxResults": 50
}' |
apify call larkmoor/ashby-jobs --silent --output-dataset

```

## MCP server setup

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

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/wVJPc3ez0tzqvukK5/builds/0B3OAbFPfz86eQija/openapi.json
