# Ashby Jobs Scraper: Export Any Ashby Job Board (`pulsedata/ashby-jobs-scraper`) Actor

Scrape all open jobs from any Ashby job board (jobs.ashbyhq.com): title, location, remote flag, team, employment type, posting date, published salary range, full description and apply URL. No API key. $2.00 per 1,000 jobs.

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

## Pricing

$2.00 / 1,000 job scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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: Export Any Ashby Job Board

Ashby Jobs Scraper exports every listed job from one or more Ashby job boards (`jobs.ashbyhq.com`) as JSON, CSV or Excel. You give it board URLs or just board names such as `ramp`, and it returns one record per job with title, primary and secondary locations, country, workplace type, department, team, employment type, Ashby's compensation summary, the description in HTML and plain text, and the job and application URLs. It costs $2.00 per 1,000 jobs, so a 500-job board costs about $1.00.

### Features

- **Scrape Ashby job boards** by URL or by board name. A bare name like `openai` is expanded to `https://jobs.ashbyhq.com/openai`.
- **Export jobs.ashbyhq.com postings to CSV, JSON or Excel.**
- **Get Ashby salary and equity info.** The actor requests compensation from Ashby's public job board API, and many Ashby boards publish it.
- **Scrape Ashby jobs with all secondary locations**, so a role listed in New York plus remote Canada shows both.
- **Filter Ashby jobs by keyword, location, remote and posting date.**
- **Find remote startup jobs.** Ashby is common among venture-backed startups, and it flags remote roles explicitly.
- **No API key and no login.** Ashby publishes each board through a public posting API.

### Use cases

- **Startup job boards:** keep a curated list of Ashby-hosted startups in sync with their real openings.
- **Compensation research:** compare published pay bands for one role across many startups that use Ashby.
- **Venture and market research:** use hiring by department and location as a growth signal for portfolio or target companies.
- **Lead generation:** startups that open their first "RevOps" or "Security Engineer" role are often about to buy tools for it.

### Input

```json
{
  "startUrls": [
    "https://jobs.ashbyhq.com/ramp",
    "openai",
    "linear"
  ],
  "keywords": ["engineer", "product"],
  "locations": ["San Francisco", "New York", "Remote"],
  "remoteOnly": false,
  "postedWithinDays": 7,
  "includeDescription": true,
  "maxJobsPerCompany": 0
}
```

| Field | Type | Default | What it does |
|---|---|---|---|
| `startUrls` | array of strings | (required) | Ashby board URLs or bare board names, one per line. |
| `keywords` | array | `[]` | Keep only jobs whose title contains one of these words (case-insensitive). |
| `locations` | array | `[]` | Keep only jobs whose primary location, a secondary location or the country contains one of these strings. |
| `remoteOnly` | boolean | `false` | Keep only jobs Ashby marks as remote, or whose location mentions remote. |
| `postedWithinDays` | integer | `0` | Keep only jobs published in the last N days. 0 means no limit. |
| `includeDescription` | boolean | `true` | Include `descriptionHtml` and `descriptionText`. Ashby returns both in the same request, so this adds no extra requests. |
| `maxJobsPerCompany` | integer | `0` | Cap per board, applied after the filters. 0 means no limit. |
| `proxyConfiguration` | object | `{ "useApifyProxy": false }` | Optional Apify Proxy. |

**Accepted Ashby URL formats:**

- `https://jobs.ashbyhq.com/ramp`
- `https://jobs.ashbyhq.com/ramp/<job-id>` (a single job URL; the actor reads the whole board)
- `ramp` (bare board name)
- `https://company.com/careers` (a page that embeds or links an Ashby board)

The board name is the path segment after `jobs.ashbyhq.com/`. It is usually the company name in lower case, but not always, so copy it from the board URL when in doubt.

### Output

One item per job:

```json
{
  "title": "Security Engineer, Cloud",
  "company": "ramp",
  "location": "New York, NY (HQ)",
  "locations": ["New York, NY (HQ)", "Remote (Canada)"],
  "country": "USA",
  "remote": true,
  "workplaceType": "Hybrid",
  "department": "Engineering",
  "team": "Backend",
  "employmentType": "FullTime",
  "seniority": null,
  "salary": "$211.4K–$290.6K",
  "postedAt": "2026-04-07T17:12:35.753Z",
  "updatedAt": null,
  "url": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245",
  "applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application",
  "descriptionHtml": "<h1><strong>About Ramp</strong></h1><p>…</p>",
  "descriptionText": "ABOUT RAMP\n\nRamp is building the smart infrastructure for finance teams…",
  "ats": "ashby",
  "atsJobId": "34413f8d-26bf-4bbc-8ade-eb309a0e2245",
  "sourceUrl": "https://jobs.ashbyhq.com/ramp",
  "scrapedAt": "2026-09-25T08:31:10.000Z"
}
```

What Ashby exposes, and how it maps:

- `company` is the board name from the URL.
- `location` is the primary location; `locations` adds every secondary location Ashby lists.
- `country` comes from the job's postal address in Ashby, when the company filled it in.
- `remote` is Ashby's own remote flag (or remote in the location text). `workplaceType` is Ashby's value, such as `OnSite`, `Hybrid` or `Remote`. A hybrid job can still have `remote: true` if Ashby flags it as remote-eligible, as above.
- `department`, `team` and `employmentType` (`FullTime`, `PartTime`, `Intern`, `Contract`, `Temporary`) are Ashby's fields as published.
- `salary` is Ashby's compensation summary as a single text string, formatted the way the board shows it (it can include notes such as "Offers Equity"). There are no separate min, max or currency fields. If a board publishes no compensation, the actor looks for a range near the start of the description.
- `descriptionText` is Ashby's own plain-text version of the description.
- `postedAt` is Ashby's publish date. `updatedAt` and `seniority` are not published by Ashby.
- Jobs the company has marked as unlisted in Ashby are skipped.

If a board name does not exist, the dataset gets one row with `sourceUrl`, `ats`, `slug` and an `error` message. Error rows are not charged.

### Pricing

Pay per event: **$0.002 per job** saved to the dataset ($2.00 per 1,000 jobs). There is no start fee.

Worked example: 100 Ashby-hosted startups with an average of 35 open roles is 3,500 jobs, or $7.00 per full export. A weekly run with `postedWithinDays: 7` over the same list usually returns a few hundred new jobs, which is well under $1.00. Jobs removed by filters and error rows are not charged.

### FAQ

**Do I need an API key or an Ashby account?**
No. Ashby boards are public and the actor calls Ashby's public posting API.

**Is compensation always included?**
Only when the company publishes it on its Ashby board. The actor always asks Ashby for compensation, so if the board shows a pay band, you get it in `salary`.

**How many jobs can it get from one board?**
All listed jobs. Ashby returns the whole board in one response; use `maxJobsPerCompany` to cap it.

**What can it not do?**
It cannot see unlisted, internal or confidential Ashby jobs, application questions or candidate data. It does not render JavaScript, so if a careers page loads Ashby through a script, paste the `jobs.ashbyhq.com` URL.

**Do I need proxies?**
Normally no. The actor retries rate limits and server errors with backoff. Turn on `proxyConfiguration` only if a large list returns HTTP 429.

**Can I mix Ashby with Greenhouse or Lever boards?**
Use the [Career Page Jobs Scraper](https://apify.com/pulsedata/career-page-jobs-scraper) for mixed lists. It auto-detects 12 applicant tracking systems.

**How do I export, schedule or automate it?**
Download results as JSON, CSV, Excel, XML or HTML, start runs through the Apify API or SDKs, schedule them in Apify Console, or connect the actor to Google Sheets, Make, Zapier or n8n.

### Related actors

- [Career Page Jobs Scraper (12 ATS)](https://apify.com/pulsedata/career-page-jobs-scraper): multi-ATS version with auto-detection.
- [Greenhouse Jobs Scraper](https://apify.com/pulsedata/greenhouse-jobs-scraper): the same output for Greenhouse boards, the usual next step as startups grow.
- [Lever Jobs Scraper](https://apify.com/pulsedata/lever-jobs-scraper): Lever boards, which publish structured salary ranges.
- [Workday Jobs Scraper](https://apify.com/pulsedata/workday-jobs-scraper): enterprise careers sites on Workday.
- [Website Tech Stack Detector](https://apify.com/pulsedata/website-tech-stack-detector): see which tools the hiring startups already run on their websites.

# Actor input Schema

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

Ashby board URLs such as `https://jobs.ashbyhq.com/ramp`, or just the board name (`ramp`). A company's own careers page works too when it embeds an Ashby board.

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

Only keep jobs whose title contains at least one of these words/phrases (case-insensitive). Leave empty for all jobs.

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

Only keep jobs whose location contains one of these strings (e.g. `Berlin`, `Germany`, `Remote`, `United States`).

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

Keep only jobs flagged as remote by the ATS or whose location mentions remote.

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

Only jobs posted or updated within the last N days. Jobs whose ATS publishes no date are kept. 0 = no limit.

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

Return the full description (HTML + plain text). For Workday, SmartRecruiters, BambooHR, Workable and Breezy this requires one extra request per job.

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

Maximum jobs returned per career page, counted after the keyword, location, remote and date filters (0 = no limit).

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

Optional. ATS APIs are public and rarely block; enable Apify Proxy only if you hit rate limits.

## Actor input object example

```json
{
  "startUrls": [
    "https://jobs.ashbyhq.com/ramp",
    "openai"
  ],
  "keywords": [],
  "locations": [],
  "remoteOnly": false,
  "postedWithinDays": 0,
  "includeDescription": true,
  "maxJobsPerCompany": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Results stored in the default dataset (JSON/CSV/Excel via the dataset API).

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

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

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,pulsedata/ashby-jobs-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/KsRoNVKbghmvnGpsW/builds/4x9dgKGbmG3pyYbZd/openapi.json
