Ashby Jobs Scraper: Job Board API with Compensation avatar

Ashby Jobs Scraper: Job Board API with Compensation

Pricing

from $2.00 / 1,000 job scrapeds

Go to Apify Store
Ashby Jobs Scraper: Job Board API with Compensation

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

Arman Hossain

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 hours ago

Last modified

Share

Ashby Jobs Scraper — Every posting on any Ashby board — with the published compensation range when disclosed

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

FieldTypeDefaultNotes
boardsarray-Required. Ashby org slugs (ramp) or full board URLs. Mixed input is fine, URLs are normalised to slugs automatically.
includeCompensationbooleantrueAsk Ashby for published salary ranges. Turn off for a slightly smaller, faster payload.
searchTermsarray[]Keep only titles containing one of these terms (case-insensitive). Empty = all.
remoteOnlybooleanfalseKeep only postings Ashby flags isRemote.
maxJobsPerBoardinteger0Cap 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"
}
FieldMeaning
boardThe org slug the record came from
jobIdAshby's posting UUID, stable, use it as your primary key
titleJob title, trimmed (Ashby occasionally leaks a leading space)
teamAshby's team, falling back to department when a board only fills one
locationPrimary location string as published
employmentTypeFullTime, PartTime, Intern, Contract, Temporary
isRemoteAshby's own remote flag, not a keyword guess
compensationMin, compensationMaxAnnual salary band from the posting's salary component. null when the company does not disclose pay
currencyISO code for the band, e.g. USD. null when there is no band
publishedAtISO timestamp the posting went live
applyUrlDirect application link
descriptionPlainFull description as plain text, Ashby's own plain rendering, with an HTML-to-text fallback
scrapedAtRun 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, returns shouldDisplayCompensationOnJobPostings: false and empty tiers on every role. Rows are never dropped for missing pay; compensationMin, compensationMax and currency come back null. Check RUN_SUMMARY.jobsWithCompensation to 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}'