# Ashby Public Jobs Exporter (`danielmichalek/ashby-jobs-exporter`) Actor

Export public jobs from Ashby boards. Filter remote roles and published pay, then download CSV with direct job links. Ready to check your company boards?

- **URL**: https://apify.com/danielmichalek/ashby-jobs-exporter.md
- **Developed by:** [Daniel Michałek](https://apify.com/danielmichalek) (community)
- **Categories:** Jobs
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 saved public jobs

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 Public Jobs Exporter

Export **listed public jobs** from up to three company job boards on Ashby. Filter by title, team, location, fully remote work, published salary and posting date, then download JSON or spreadsheet-friendly CSV. The Actor uses Ashby's documented public Job Postings API, not private ATS endpoints.

### What it does

- Reads only boards you specify, using the pinned API host api.ashbyhq.com and no login, proxy, browser or AI model.
- Ignores any job where Ashby does not explicitly mark isListed=true, skips invalid job URLs and removes duplicates.
- Preserves the employer's published job URL, application URL, location, team, employment type, original publish timestamp and salary summary when supplied.
- Distinguishes Remote from Hybrid. Ashby's isRemote field can be true for both, so remoteOnly requires workplaceType=Remote.
- Produces a results dataset, a JOBS_CSV file, a REPORT summary and an EXPORT_SUMMARY JSON record.

### Input

Provide 1–3 board tokens or full root board URLs. Example: Ashby or https://jobs.ashbyhq.com/ashby. The board URL must not contain credentials, a query string or an individual job path. The Actor never enumerates companies on its own.

**maxItems** defaults to 50 and is limited to 100 billable saved jobs per run. **keywords** and **locations** accept up to eight literal text filters each. **remoteOnly** excludes hybrid work. **onlyWithSalary** hides jobs without an employer-published salary summary. **postedWithinDays=0** disables the date filter; higher values keep only posts with a matching known publish date.

The Actor reads up to three public board feeds sequentially. If any required source fails or changes schema, it stops without emitting partial billable jobs. An empty but valid board returns an empty dataset and no job event.

### Output

Each dataset item contains the board, title, canonical Ashby job URL, application URL when valid, location, workplace type, remote flag, department, team, employment type, published timestamp, salary text when provided, a bounded text excerpt and fetch timestamp.

Download **JOBS_CSV** from the default key-value store or the dataset from the Actor output tab. CSV cells are quoted and spreadsheet formula prefixes are escaped. **EXPORT_SUMMARY** reports returned/matched counts, excluded unlisted rows, invalid rows, duplicates and output truncation.

### Pricing and cost control

**Proposed publication pricing:** pay per event, $0.002 per successfully stored job-exported item. It is a draft until the Store's live pricing and provider cost have been verified. One saved unique job triggers one event, not a fee per API request. Source failure, filtered rows and unlisted postings are not intended to generate events. The user can cap the maximum total charge for a run. Platform usage and payout rules follow the current Apify billing model.

No paid AI model, external token, private Ashby API, proxy or additional subscription is required by this code. The runtime has strict limits of three boards, 100 saved rows and a 3 MB response cap per board. Live platform cost per paid customer has not yet been measured, so do not treat the proposed price as guaranteed profitable.

### Limitations and fair use

The feed contains only currently published information that each employer makes publicly available. A role can disappear, change, or be marked unlisted later. Salary and compensation are presented as employer-provided text; the Actor does not convert currencies, infer missing ranges, verify employment eligibility or apply for jobs. Dates may reflect the last publication rather than the original creation date. Source availability and rate limits remain outside our control.

This product is independently implemented from the documented public API. Do not use it for mass unsolicited messaging, candidate contact extraction, private openings, login bypasses or job applications. Do not present usage counters or test runs as paid customer revenue.

### Example

Use the synthetic input in examples/input.json. To run against the official public Ashby jobs board, use {"boards":\["ashby"],"maxItems":20,"remoteOnly":true} and inspect the current resulting rows; examples are not evidence that any specific vacancy is still open.

Official API documentation: https://developers.ashbyhq.com/docs/public-job-posting-api

# Actor input Schema

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

One to three public Ashby board slugs or https://jobs.ashbyhq.com/<board> URLs. Private or unlisted jobs are excluded.

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

Up to eight optional literal case-insensitive keyword matches. No regex.

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

Up to eight optional location substrings. Does not verify visa, residency or eligibility.

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

Include only workplaceType Remote. Hybrid jobs are excluded even when Ashby sets isRemote true.

## `onlyWithSalary` (type: `boolean`):

Include only roles where the board supplies a salary summary. Never estimate salary.

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

0 disables the filter. Missing or invalid dates are excluded when the filter is active.

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

Hard cap of 1 to 100 distinct listed public jobs. Each saved job is one paid event on paid plans.

## Actor input object example

```json
{
  "boards": [
    "ashby"
  ],
  "keywords": [],
  "locations": [],
  "remoteOnly": false,
  "onlyWithSalary": false,
  "postedWithinDays": 0,
  "maxItems": 50
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `csv` (type: `string`):

No description

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

No description

## `summary` (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 = {
    "boards": [
        "ashby"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("danielmichalek/ashby-jobs-exporter").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": ["ashby"] }

# Run the Actor and wait for it to finish
run = client.actor("danielmichalek/ashby-jobs-exporter").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": [
    "ashby"
  ]
}' |
apify call danielmichalek/ashby-jobs-exporter --silent --output-dataset

```

## MCP server setup

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

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/0iAQc7O6orzXICRxY/builds/4QQ0OUPxqTWXupq4g/openapi.json
