# Ashby Jobs Feed | Public Posting API (`zinin/ashby-jobs-feed`) Actor

Collect published Ashby jobs from supplied board names. One structured vacancy per paid result, with free diagnostics.

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

## Pricing

from $1.05 / 1,000 result founds

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 Feed

Read publicly published jobs from Ashby job boards. It is intended for job-market analysts and recruiting teams who need a structured feed across selected companies.

### What you get

- One structured row per valid public job posting.
- Source identifiers, a direct source URL, and useful facts for analysis.
- Free diagnostics for source rejection, empty results, or buyer limits.
- Run it on Apify schedules, monitor it, call it through the API, and export JSON, CSV, or Excel.

### How to run it

1. Enter the public source value in **Public Ashby job board names**.
2. Adjust the optional result limit if needed.
3. Start the Actor and open its default dataset for results or free diagnostics.

### Pricing

Pay-per-event price: **$0.0015 per valid job** (`result-found`), $0 per start, $0 for free diagnostics. 100 jobs cost $0.15. There is no Actor-specific free quota; the Apify Free plan lists $5 monthly usage credit as of 2026-11-01, subject to other usage. Comparator: Apify Store actor `bovi/greenhouse-lever-ashby-job-scraper`, observed at 104 users in the last 30 days and $0.0015 for one `Job result` on the Free tier (checked 2026-11-01). Recheck Store pricing at acceptance because prices and usage change.

Only jobs with `id`, `title`, and `jobUrl` are delivered through one linked dataset write and `result-found` charge. Diagnostic rows are free.

The current `result-found` event price is $0.0015 per useful row. The following are Actor event charges:

| Useful rows | Actor event charges |
|---:|---:|
| 10 | $0.015 |
| 100 | $0.150 |
| 1,000 | $1.500 |

These examples assume that many valid, billed rows across one or more runs. Input limits and source availability may require several runs. Apify platform compute usage is separate.

### Input

| Field | Required | Purpose |
|---|---|---|
| `jobBoardNames` | Yes | Public board identifiers, for example linear or openai. |
| `maxItems` | No | Maximum number of published jobs returned across the supplied boards. |
| `includeDescription` | No | Include sanitized public job descriptions in the output. |
| `proxyConfiguration` | No | Not used by this direct public API actor. |

```json
{
  "jobBoardNames": [
    "linear",
    "openai"
  ]
}
```

### Output

This row comes from a successful Actor run completed 2026-11-01T16:09:01.592Z. Values are copied from its dataset.

```json
{
  "id": "d3bc1ced-3ce4-4086-a050-555055dbb1ff",
  "title": "Senior / Staff Fullstack Engineer",
  "department": "Product",
  "location": "Europe",
  "jobUrl": "https://jobs.ashbyhq.com/linear/d3bc1ced-3ce4-4086-a050-555055dbb1ff",
  "jobBoardName": "linear"
}
```

| Field | Meaning |
|---|---|
| `id` | Public source identifier for this result. |
| `title` | Published job title. |
| `department` | Public hiring department. |
| `location` | Public job location. |
| `jobUrl` | Link to the source job posting. |
| `jobBoardName` | Supplied public board name. |

### Other tools we built

#### Related tools

Related tools for adjacent workflows in jobs and hiring.

| Actor | What it does |
|---|---|
| [Greenhouse Jobs Feed | Public Job Board API](https://apify.com/zinin/greenhouse-jobs-feed) | Pair it in the jobs and hiring workflow: Collect published Greenhouse Job Board vacancies from supplied board tokens |
| [Lever Jobs Feed | Public Postings API](https://apify.com/zinin/lever-jobs-feed) | Pair it in the jobs and hiring workflow: Collect published Lever jobs from company boards |
| [SmartRecruiters Jobs Feed | Public Posting API](https://apify.com/zinin/smartrecruiters-jobs-feed) | Pair it in the jobs and hiring workflow: Collect published SmartRecruiters jobs from company identifiers |
| [Recruitee Jobs Feed | Public Career Offers](https://apify.com/zinin/recruitee-jobs-feed) | Pair it in the jobs and hiring workflow: Collect public Recruitee career offers from company subdomains |
| [Teamtailor Jobs Feed | Public Career Sites](https://apify.com/zinin/teamtailor-jobs-feed) | Pair it in the jobs and hiring workflow: Extract job titles, locations, dates and URLs from supplied public Teamtailor career sites |

### FAQ / Limitations

#### Source conditions

The public endpoint supplied for this actor is `https://api.ashbyhq.com/posting-api/job-board/{jobBoardName}?includeCompensation=true`. GETs for `linear` and `openai` returned public job-board JSON without authentication on 2026-11-01.

Official [Ashby Job Postings API documentation](https://developers.ashbyhq.com/docs/public-job-posting-api), checked 2026-11-01, states: “This API allows you to get data for all currently published Job Postings for your organization.” It documents the exact GET endpoint used here. The [Ashby Customer Terms](https://www.ashbyhq.com/resources/terms), checked 2026-11-01, say: “Customer may access and use the Service pursuant to the terms of any outstanding Order”. Those terms govern Ashby customers under an order; they do not independently grant this Actor any redistribution right. Only public, listed jobs are returned, and operators must respect company and source conditions.

#### Limitations

- Only public posting fields are mapped; candidate records are not requested by this public posting endpoint.
- Compensation is included only when supplied by the employer.
- Descriptions are excluded by default and may contain personal contact details.
- The API returns the board payload in one response; the actor caps its own saved items but does not paginate.
- No browser, proxy, or retry is used.

#### Frequently asked questions

**Can I use this to find every Ashby employer?** No. Supply known public board names. The Actor does not discover tenants.

**Does it submit applications?** No. It reads published postings and never calls application endpoints.

**What if a board blocks access?** The Actor stops without a retry or proxy rotation and records a free diagnostic.

# Changelog

This Actor's version history is a separate document: https://apify.com/zinin/ashby-jobs-feed/changelog.md

# Actor input Schema

## `jobBoardNames` (type: `array`):

Public board identifiers, for example linear or openai.

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

Maximum number of published jobs returned across the supplied boards.

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

Include sanitized public job descriptions in the output.

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

Not used by this direct public API actor.

## Actor input object example

```json
{
  "jobBoardNames": [
    "linear",
    "openai"
  ],
  "maxItems": 50,
  "includeDescription": false
}
```

# Actor output Schema

## `results` (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 = {
    "jobBoardNames": [
        "linear",
        "openai"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("zinin/ashby-jobs-feed").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 = { "jobBoardNames": [
        "linear",
        "openai",
    ] }

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

```

## MCP server setup

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

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/zcAH40t2366R2ShRG/builds/PN2b4OuB8a0eki6vI/openapi.json
