# Ashby Jobs Scraper (`richiedc95/ashby-jobs-scraper`) Actor

Scrape all open jobs from any Ashby job board: titles, locations, remote/hybrid, salary ranges, departments and full descriptions. Fast official API, filters, monitoring mode for new jobs. $1.00 per 1,000 jobs.

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

## Pricing

from $0.80 / 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 & API

Extract **every open job** from any company that hires with **Ashby**: title, department, location, remote/hybrid/on-site, employment type, **salary range**, posting date, apply link and the full description. Works with OpenAI, Notion, Ramp, Linear and thousands of fast-growing startups.

⭐ **Is this Actor useful to you?** A short review on the Reviews tab helps other users find it, and tells us what to build next.

- ✅ **Fast and reliable**: uses Ashby's official public Job Posting API, including structured compensation. No browser, no login, no proxies needed.
- 🔎 **Search mode, no company list needed**: leave Companies empty, type a job title, and search all 3,000+ Ashby companies we track at once.
- 💰 **Salary ranges parsed into numbers** (min, max, currency, period), ready for analysis.
- 🔔 **Daily job alerts**: save your search as a task, schedule it daily and turn on **Only new jobs**: each run returns just the jobs posted since the last one, straight to Slack, email, Google Sheets or a webhook.
- 🔔 **Monitoring mode**: get only the jobs that are new since your last run. Schedule it daily and you have a job alert feed.
- 🧹 **Clean, consistent output**: the same schema for every ATS (Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable, Recruitee, Personio, Teamtailor, BambooHR, Breezy HR, Rippling, Oracle Cloud HCM, Jobvite, Pinpoint), so you can merge results from all of them.
- 💵 **Pay only for results**: $1.00 per 1,000 jobs.

### Who uses it

- **Job boards and aggregators** that need fresh listings from company career pages.
- **Recruiters and sourcers** tracking which companies are hiring for specific roles.
- **Sales and growth teams**: a company that is hiring is a company with budget. Use open roles as buying signals.
- **Analysts and researchers** studying salaries, hiring trends and remote work.
- **Job seekers** who want alerts the moment a target company posts a new role.

### How to use it

1. Add one or more companies. Ashby job board names (e.g. `ramp`) or any Ashby job board URL (`https://jobs.ashbyhq.com/notion`). **No list?** Leave Companies empty and add title keywords (for example `data engineer`) to search every Ashby company in our directory (3,000+ companies).
2. Optionally filter by title keywords, locations, departments, remote only, posting date, **experience level**, employment type, minimum salary, words in the description or **visa sponsorship** (only jobs that say they sponsor visas).
3. Click **Start**. Download the results as JSON, CSV, Excel or connect them to Google Sheets, Zapier, Make, n8n or your own app via API.

#### Example input

```json
{
    "companies": ["ramp","notion","openai"],
    "keywords": ["engineer"],
    "locations": ["Remote", "New York"],
    "onlyNewJobs": false
}
```

### Output

Each job is one item:

```json
{
    "ats": "ashby",
    "company": "Example Inc",
    "companySlug": "example",
    "jobId": "4012345",
    "title": "Senior Software Engineer, Payments",
    "department": "Engineering",
    "team": null,
    "location": "New York, NY",
    "locations": ["New York, NY", "Remote (US)"],
    "country": "US",
    "workplaceType": "hybrid",
    "isRemote": false,
    "employmentType": "full-time",
    "seniority": "senior",
    "salaryMin": 180000,
    "salaryMax": 240000,
    "salaryCurrency": "USD",
    "salaryPeriod": "year",
    "salaryText": "$180,000 - $240,000",
    "postedAt": "2026-10-28T14:52:05.000Z",
    "updatedAt": "2026-10-30T09:12:00.000Z",
    "url": "https://...",
    "applyUrl": "https://...",
    "description": "About the role ...",
    "scrapedAt": "2026-11-03T20:23:21.879Z"
}
```

| Field | Description |
|---|---|
| `workplaceType` | `remote`, `hybrid`, `onsite` or `null` when the posting does not say |
| `seniority` | Detected from the title: `intern`, `junior`, `mid`, `senior`, `lead`, `manager`, `director`, `executive` |
| `salaryMin` / `salaryMax` | Numbers parsed from the posting's pay range (when the company publishes one) |
| `salaryPeriod` | `year`, `month`, `week`, `day` or `hour` |
| `description` | Plain text by default; choose Markdown, HTML or none in the input |
| `visaSponsorship` | `true` when the description says visas are sponsored, `false` when it says they are not, `null` when it does not say |

A `SUMMARY` record in the run's key-value store lists how many jobs were found per company and any company that could not be loaded.

### Pricing

You pay **$1.00 per 1,000 jobs** saved to the dataset, plus a tiny fee per run start. Filters are applied before saving, so you never pay for jobs you filtered out. Use **Max jobs in total** to cap the cost of any run.

### Monitoring mode (only new jobs)

Turn on **Only new jobs** and schedule the Actor (for example every morning). Each run returns only openings that were not returned before, so you can pipe them straight into Slack, email or a spreadsheet. The list of already-seen jobs is stored in a named key-value store in your own Apify account.

🧹 **Closed jobs, free:** in monitoring mode each run also writes a `CLOSED_JOBS` record listing the jobs you received earlier that are no longer open (job ID, title, URL and when the closure was detected). Job boards use it to remove expired listings. Closed jobs are not charged.

### FAQ

**Is this an alternative to a LinkedIn or Indeed jobs scraper?** Yes, and a safer one. Most jobs you see on LinkedIn and Indeed are first published on the employer's own career site (Greenhouse, Lever, Workday and the other ATS this Actor reads), so you get the same openings from the original source, usually earlier and with the full description, salary range and direct apply link. No LinkedIn or Indeed account, cookies, proxies or login are needed, nothing is scraped from those sites, and there are no blocked runs or duplicated reposts. This Actor is not affiliated with LinkedIn or Indeed.

**Is it legal?** The Actor reads public job postings that companies publish so that anyone can see them, using Ashby's official public Job Posting API, including structured compensation. It does not log in and does not collect personal data. As always, use the data in line with the laws that apply to you.

**How do I find a company's Ashby board?** Open the company's careers page and click any job. If the link goes to a Ashby page, paste that URL here.

**Why did a company return 0 jobs?** Either it has no open roles right now, or it moved to another applicant tracking system. Check the `SUMMARY` record of the run.

### Use it from your code, AI agents and automations

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("richiedc95/ashby-jobs-scraper").call(run_input={
    "companies": [
        "ramp",
        "notion"
    ],
    "keywords": [
        "engineer"
    ],
    "onlyNewJobs": True
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

**JavaScript**

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('richiedc95/ashby-jobs-scraper').call({
    "companies": [
        "ramp",
        "notion"
    ],
    "keywords": [
        "engineer"
    ],
    "onlyNewJobs": true
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

- 🤖 **AI agents (MCP)**: add the [Apify MCP server](https://mcp.apify.com) to Claude, ChatGPT, Cursor or any MCP client and this Actor becomes a tool your agent can call.
- 🔗 **No-code (n8n, Make, Zapier)**: one HTTP request runs the Actor and returns the results, so any automation tool can use it. In n8n, add an *HTTP Request* node with method `POST`, URL `https://api.apify.com/v2/acts/richiedc95~ashby-jobs-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>` and the JSON input above as the body, then send the items to Slack, Google Sheets, email or a CRM. Put a *Schedule* node in front for daily alerts. Make and Zapier have official Apify apps (*Run an Actor* → *Get dataset items*). Ready-made n8n workflows (import from URL) and a step-by-step guide: [n8n / Make / Zapier examples](https://github.com/richiedc95/job-search-mcp/blob/main/examples/README.md).
- 📥 **Exports**: download every run as JSON, CSV, Excel, XML or RSS, or read it through the [Apify API](https://docs.apify.com/api/v2).

### Get a fresh feed automatically (job boards, dashboards, alerts)

1. Click **Save as a new task** with your input (turn on the monitoring option if the Actor has one, so each run returns only new jobs).
2. Add a **schedule** to the task (hourly, daily or weekly) under **Schedules**.
3. Read the latest results from one stable URL, in the format your tool expects:

```text
https://api.apify.com/v2/actor-tasks/<TASK_ID>/runs/last/dataset/items?token=<YOUR_APIFY_TOKEN>&status=SUCCEEDED&format=csv
```

Use `format=json`, `csv`, `xlsx`, `xml` or `rss`. Job-board plugins and spreadsheets can import that URL directly.

### Related Actors

- **[Job Search Scraper: 25,500+ Company Career Sites](https://apify.com/richiedc95/company-jobs-search)**: no company list needed, search a job title across 25,500+ companies at once.

These share the same output schema, so you can combine their results:

- [Greenhouse Jobs Scraper & API](https://apify.com/richiedc95/greenhouse-jobs-scraper)
- [Lever Jobs Scraper & API](https://apify.com/richiedc95/lever-jobs-scraper)
- [Workday Jobs Scraper & API](https://apify.com/richiedc95/workday-jobs-scraper)
- [SmartRecruiters Jobs Scraper & API](https://apify.com/richiedc95/smartrecruiters-jobs-scraper)
- [Workable Jobs Scraper & API](https://apify.com/richiedc95/workable-jobs-scraper)
- [Recruitee Jobs Scraper & API](https://apify.com/richiedc95/recruitee-jobs-scraper)
- [Career Site Jobs Scraper & API (Any ATS)](https://apify.com/richiedc95/career-site-jobs-scraper)

More data Actors from the same author:

- [Global News Scraper with sentiment (GDELT)](https://apify.com/richiedc95/global-news-scraper)
- [Public Tenders Scraper (UK, EU, Canada, Colombia)](https://apify.com/richiedc95/public-tenders-scraper)

Found a bug or need a field? Open an issue on the Issues tab and we will usually answer within a day.

# Actor input Schema

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

Ashby job board names (e.g. `ramp`) or any Ashby job board URL (`https://jobs.ashbyhq.com/notion`). Add as many as you need. Or leave it empty and add Title keywords to search all 3,000+ Ashby companies we track.

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

Keep only jobs whose title contains at least one of these words (case-insensitive), e.g. "engineer", "sales". Leave empty to get all jobs.

## `excludeKeywords` (type: `array`):

Skip jobs whose title contains any of these words, e.g. "intern", "senior".

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

Keep only jobs whose location contains one of these texts, e.g. "London", "Remote", "Germany".

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

Keep only jobs whose department or team contains one of these texts, e.g. "Engineering".

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

Keep only jobs detected as fully remote.

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

Keep only jobs posted in the last N days. 0 = no limit.

## `excludeLocations` (type: `array`):

Skip jobs whose location contains any of these texts, e.g. "India", "Remote".

## `seniorityLevels` (type: `array`):

Keep only these levels, detected from the job title (e.g. "Junior", "Graduate", "Senior", "Head of"). "Mid" is any title without a level word. Leave empty for all.

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

Keep only these employment types. Jobs that do not state a type are skipped when this is set.

## `minSalary` (type: `integer`):

Keep only jobs that publish a pay range whose top reaches at least this yearly amount, in the job's own currency (hourly and monthly pay are converted to yearly). Jobs without a published salary are skipped when this is set. 0 = no filter.

## `descriptionKeywords` (type: `array`):

Keep only jobs whose title or description contains at least one of these words, e.g. "Python", "visa sponsorship", "Spanish".

## `visaSponsorship` (type: `boolean`):

Keep only jobs whose description says visa sponsorship is offered (e.g. "we sponsor H-1B visas"). Every job also gets a visaSponsorship field: true, false (says it does not sponsor) or null (does not say).

## `onlyNewJobs` (type: `boolean`):

Return only jobs you have not received in previous runs of this Actor. Schedule the Actor daily to get a feed of new openings. State is kept in a named key-value store in your own account.

## `reportClosedJobs` (type: `boolean`):

With "Only new jobs" on, also list the jobs you received before that are no longer open, in the CLOSED_JOBS record of each run, so you can remove them from your job board. Free: closed jobs are not charged.

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

Format of the job description field.

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

Limit the number of jobs saved per company. 0 = all jobs.

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

Stop after saving this many jobs across all companies. 0 = no limit. Useful to control cost.

## Actor input object example

```json
{
  "companies": [
    "ramp",
    "https://jobs.ashbyhq.com/notion"
  ],
  "remoteOnly": false,
  "postedWithinDays": 0,
  "minSalary": 0,
  "visaSponsorship": false,
  "onlyNewJobs": false,
  "reportClosedJobs": true,
  "descriptionFormat": "text",
  "maxJobsPerCompany": 0,
  "maxItems": 0
}
```

# Actor output Schema

## `jobs` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `closedJobs` (type: `string`):

No description

# 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",
        "https://jobs.ashbyhq.com/notion"
    ]
};

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

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,richiedc95/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/LyCpTFyZVolUflGac/builds/Z3pq2ebpYMaFl3fDh/openapi.json
