Ashby Jobs Feed: every open role from any board | $1.50/1K avatar

Ashby Jobs Feed: every open role from any board | $1.50/1K

Pricing

from $0.75 / 1,000 job rows

Go to Apify Store
Ashby Jobs Feed: every open role from any board | $1.50/1K

Ashby Jobs Feed: every open role from any board | $1.50/1K

Live job openings from Ashby career boards via the official Ashby Job Posting API (api.ashbyhq.com/posting-api). Pass board slugs or paste careers URLs. One row per job: title, location, department, apply URL, dates, stable id. No login, no HTML scrape, no proxies. $1.50 per 1,000 jobs. Also reads G

Pricing

from $0.75 / 1,000 job rows

Rating

0.0

(0)

Developer

CleanFeeds API

CleanFeeds API

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Security

Limited permissions

Share

Ashby Jobs Feed: every open role from any Ashby board | $1.50/1K

Quick start

  • Ashby jobs API in one run: one JSON row per open job on every Ashby board you list, with title, location, department, apply URL, published date and a stable id.
  • Minimal input: {"boards": ["ashby:ramp"]}
  • Run it from the Console, the API, or the Apify MCP server; export JSON, CSV or Excel.

Pull live job openings from Ashby career boards into one clean JSON dataset, read through the official Ashby Job Posting API (api.ashbyhq.com/posting-api). No HTML scraping, no login, no proxies, no API key.

Pass board slugs (ashby:ramp) or just paste the careers URL (jobs.ashbyhq.com/<company>). You get one row per job: title, location, department, apply URL, dates, stable id.

Raw board data, nine normalized fields, no enrichment; cheaper than multi-ATS and enrichment feeds. This Actor accepts only Ashby boards (ashby:<slug> or a pasted Ashby URL). Entries for other platforms are returned as one error row each and skipped. For a mixed list across six ATS platforms use ats-jobs-feed ($2 per 1,000).

Why this instead of scraping or the vendor API

  • api.ashbyhq.com/posting-api/job-board/<company> is the public job board feed behind jobs.ashbyhq.com. The hosted page is a JavaScript app, so plain HTML scrapers see an empty shell; this Actor reads the JSON directly.
  • No key and no account. The posting API is public and unauthenticated. Ashby's authenticated REST API is not needed.
  • Pasted URLs work. jobs.ashbyhq.com/<company> is recognized and turned into ashby:<company>.
  • Same nine-column schema as the other CleanFeeds ATS feeds, so rows from this Actor and ats-jobs-feed fit one table.
  • Postings without a title or URL are dropped before charging, so a malformed entry never costs you a row.

Input example

{"boards": ["ashby:ramp", "https://jobs.ashbyhq.com/notion", "ashby:linear"], "maxJobsPerBoard": 0}
FieldTypeDefaultNotes
boardsstring listthree sample Ashby boardsashby:<slug> or an Ashby careers URL
maxJobsPerBoardinteger00 = everything the board returns

Filters are applied before billing

postedAfter (ISO date or 24h / 7d), titleIncludes (keep if the title contains any term) and titleExcludes (drop if it contains any term) are applied to the rows read from the ATS before the pay-per-event charge, so you never pay for jobs you filtered out. Matching is case-insensitive substring; there is no fuzzy or AI matching, so what you see is what was matched. Dates come from the ATS itself (first_published, createdAt, publishedAt, releasedDate, published_at), not from when we indexed the job; Workday only publishes "Posted N Days Ago", so its posted_at has day precision and "30+ days ago" postings have no date and are excluded when postedAfter is set.

{ "boards": ["greenhouse:stripe", "lever:spotify"], "postedAfter": "24h", "titleIncludes": ["engineer", "developer"], "titleExcludes": ["intern", "staffing"] }

Output example

{ "source": "ashby", "company": "ramp", "title": "Software Engineer", "location": "Remote",
"department": null, "url": "https://jobs.ashbyhq.com/ramp/8c2e5f1a-3b4d-4e6f-9a7b-1c2d3e4f5a6b", "posted_at": "2026-10-21T09:12:00.000Z", "updated_at": null, "id": "8c2e5f1a-3b4d-4e6f-9a7b-1c2d3e4f5a6b" }
FieldMeaning
sourcealways ashby
companythe slug you passed
title, location, departmentas the ATS reports them, null where the ATS does not expose a field
urlpublic job / apply page (Ashby jobUrl)
posted_at, updated_atISO 8601 when the ATS provides them. Ashby gives publishedAt as posted_at; updated_at is always null for Ashby
idATS-side job id, stable across runs, diff it to detect new and closed roles

A board that fails (bad slug, HTTP error) yields one row with error and the other boards continue.

How much does it cost?

Pay per event: $1.50 per 1,000 job rows plus Apify's small Actor-start event. Compute is included. Set a maximum charge per run in the Console and the Actor stops at the limit. The Apify free plan is enough to try it on the sample boards.

Use cases

  • Recruiting SaaS and talent CRMs: nightly sync of target accounts' Ashby boards.
  • Hiring-intent signals: diff today's ids against yesterday's dataset.
  • AI agents and MCP: "list open roles at these companies" through the Apify MCP server.
  • Market maps: location and department mix per company over time.

Integrations

  • Apify API: POST https://api.apify.com/v2/acts/cleanfeedsapi~ashby-jobs-feed/run-sync-get-dataset-items?token=<APIFY_TOKEN> with the input JSON as the body. The response is the dataset, ready to parse.
  • Scheduling: open the Actor in the Apify Console, click Schedule, pick a cron (for example daily at 06:00) and the saved input runs on its own. Each run keeps its own dataset.
  • n8n, Make, Zapier: use the Apify integration in each tool, choose this Actor and pass the same input JSON. No per-Actor setup, no custom code.
  • Apify MCP server for AI agents: connect the Apify MCP server to Claude, Cursor or any MCP client and ask the agent to run cleanfeedsapi/ashby-jobs-feed with these inputs.

Free sample dataset: cleanfeeds/tech-jobs-daily on Hugging Face. More feeds at cleanfeeds.dev.

FAQ

Do I need an Ashby API key? No. The endpoint is public and unauthenticated.

Is this HTML scraping? No. It reads the official Ashby Job Posting API (api.ashbyhq.com/posting-api), the same data the careers page itself loads.

Where do I find the slug? It is the token in the careers URL. Or paste the URL itself.

Can I mix ATS platforms in one run? No. This Actor accepts only Ashby boards (ashby:<slug> or a pasted Ashby URL). Entries for other platforms are returned as one error row each and skipped. For a mixed list across six ATS platforms use ats-jobs-feed ($2 per 1,000).

How do I detect new and closed items between runs? id is the Ashby job posting id and does not change between runs. Keep each run's dataset and compare id sets per company: ids present today but not yesterday are new roles, ids present yesterday but not today are closed. Schedule the Actor daily and the diff is a few lines in n8n, Make or a script.

What happens when a source fails? A board that returns an HTTP error, an unknown slug or an unrecognized URL does not stop the run. The Actor logs the failure, pushes one row with source, company and error (the message), and continues with the next board. Error rows are not charged. Filter on error to find them.

Why is updated_at always null for Ashby? The posting API exposes publishedAt only. The Actor never guesses a value it did not receive.