Ashby Jobs Scraper: Job Board API with Compensation
Pricing
from $2.00 / 1,000 job scrapeds
Ashby Jobs Scraper: Job Board API with Compensation
Scrape any Ashby-hosted job board: title, team, location, employment type, remote flag and published compensation ranges when disclosed. Bulk boards, no login.
Pricing
from $2.00 / 1,000 job scrapeds
Rating
0.0
(0)
Developer
Arman Hossain
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 hours ago
Last modified
Categories
Share

What it does
Scrape any Ashby-hosted job board: title, team, location, employment type, remote flag and published compensation ranges when disclosed. Bulk boards, no login. Give it a list of boards and it returns one structured record per job.
Ashby is the ATS behind a large slice of well-funded startups, and unlike most ATS feeds, its public posting API can return the compensation tiers a company attaches to a role. That makes it the single best free source for salary-transparency data at scale.
Input
| Field | Type | Default | Notes |
|---|---|---|---|
boards | array | - | Required. Ashby org slugs (ramp) or full board URLs. Mixed input is fine, URLs are normalised to slugs automatically. |
includeCompensation | boolean | true | Ask Ashby for published salary ranges. Turn off for a slightly smaller, faster payload. |
searchTerms | array | [] | Keep only titles containing one of these terms (case-insensitive). Empty = all. |
remoteOnly | boolean | false | Keep only postings Ashby flags isRemote. |
maxJobsPerBoard | integer | 0 | Cap saved jobs per board after filtering. 0 = no limit. |
{"boards": ["ramp", "https://jobs.ashbyhq.com/notion"],"includeCompensation": true,"searchTerms": ["engineer", "security"],"remoteOnly": false,"maxJobsPerBoard": 100}
Combinations that make sense. searchTerms and remoteOnly combine with AND, a job must match a title term and be remote. maxJobsPerBoard applies after filtering, so searchTerms: ["engineer"], maxJobsPerBoard: 25 gives you 25 engineering roles, not 25 jobs of which some are engineering. Setting includeCompensation: false blanks the three pay fields; it does not drop rows.
Output
One dataset item per job. Sample record (real values from ramp):
{"board": "ramp","jobId": "34413f8d-26bf-4bbc-8ade-eb309a0e2245","title": "Security Engineer, Cloud","team": "Backend","location": "New York, NY (HQ)","employmentType": "FullTime","isRemote": true,"compensationMin": 211400,"compensationMax": 290600,"currency": "USD","publishedAt": "2026-04-07T17:12:35.753+00:00","applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application","descriptionPlain": "ABOUT RAMP\n\nRamp is building the smart infrastructure for finance teams…","scrapedAt": "2026-08-06T12:00:00.000Z"}
| Field | Meaning |
|---|---|
board | The org slug the record came from |
jobId | Ashby's posting UUID, stable, use it as your primary key |
title | Job title, trimmed (Ashby occasionally leaks a leading space) |
team | Ashby's team, falling back to department when a board only fills one |
location | Primary location string as published |
employmentType | FullTime, PartTime, Intern, Contract, Temporary |
isRemote | Ashby's own remote flag, not a keyword guess |
compensationMin, compensationMax | Annual salary band from the posting's salary component. null when the company does not disclose pay |
currency | ISO code for the band, e.g. USD. null when there is no band |
publishedAt | ISO timestamp the posting went live |
applyUrl | Direct application link |
descriptionPlain | Full description as plain text, Ashby's own plain rendering, with an HTML-to-text fallback |
scrapedAt | Run timestamp |
A RUN_SUMMARY record in the key-value store carries per-run counts, per-source failures and the applied filters:
{"boardsRequested": 2,"boardsFailed": 0,"failures": [],"jobsSaved": 212,"jobsWithCompensation": 168,"filters": {"searchTerms": [],"remoteOnly": false,"maxJobsPerBoard": 0,"includeCompensation": true},"finishedAt": "2026-08-06T12:00:04.117Z"}
Use cases
1. Build a salary-transparency dataset. Sweep a list of Ashby boards with compensation on, then keep the rows that actually disclose pay.
{"boards": ["ramp", "vanta", "notion"],"includeCompensation": true}
2. Track compensation bands by role and region. Narrow to one job family and run it on a schedule, diff compensationMin / compensationMax on jobId over time.
{"boards": ["ramp", "vanta"],"searchTerms": ["engineer", "engineering manager"],"includeCompensation": true}
3. Source roles that publish pay up front. Remote-only, capped, ready to hand to a sourcer.
{"boards": ["ramp", "notion", "vanta"],"remoteOnly": true,"searchTerms": ["designer", "product manager"],"maxJobsPerBoard": 50}
Limits and behaviour
- Compensation is optional per posting. Many boards publish no bands at all,
linear, for example, returnsshouldDisplayCompensationOnJobPostings: falseand empty tiers on every role. Rows are never dropped for missing pay;compensationMin,compensationMaxandcurrencycome backnull. CheckRUN_SUMMARY.jobsWithCompensationto see how much of a run actually carries pay. - Salary components only. Ashby also publishes equity, bonus and commission components. Those have no comparable min/max, so the pay fields report the salary component alone, annual when a posting lists both annual and monthly bands.
- A failing board never aborts the run. An unknown slug returns 404 and is recorded in
RUN_SUMMARY.failures; the Actor only errors out if every board fails. - Transient errors are retried. 429 and 5xx get three attempts with linear backoff. 404 and malformed payloads fail fast.
- No pagination. Ashby returns a board's entire published set in one response, so a run is one request per board plus a 250 ms politeness gap.
- Public data only. No authentication, no personal data, no access-control bypass.
FAQ
Do I need a proxy? No. Proxy configuration is not required to run this Actor.
Do I need an account on the source? No. You supply no credentials.
What happens if a source is unavailable? It is reported in RUN_SUMMARY.failures and the run continues with the remaining boards.
Can I schedule it? Yes, it is designed for scheduled runs. Diff on jobId plus publishedAt to spot new roles.
How do I find a board slug? Open the company's Ashby careers page: https://jobs.ashbyhq.com/ramp → the slug is ramp. You can paste the whole URL; the Actor extracts it.
Why is a board empty? Either the org has no published roles (an empty jobs array is a valid 200 response), or your filters excluded everything. RUN_SUMMARY reports listed-vs-matched-vs-saved counts per board, which tells the two apart.
Can I integrate it with something else? Yes, Apify API, client libraries, webhooks, scheduled runs, dataset exports (JSON/CSV/Excel) or MCP. Output is structured JSON.
API example
curl -X POST "https://api.apify.com/v2/acts/arman-bd~ashby-jobs-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"boards": ["ramp"], "includeCompensation": true, "maxJobsPerBoard": 25}'