Ashby Jobs Scraper: Salary, Equity & Correct Remote Flags
Pricing
from $2.10 / 1,000 job posting returneds
Ashby Jobs Scraper: Salary, Equity & Correct Remote Flags
Scrapes job postings from any Ashby job board (jobs.ashbyhq.com) through Ashby's public API. Reads compensation correctly, including the salary ranges a naive parse silently drops. Separates genuinely remote roles from hybrid ones, and ships a verified list of live Ashby boards.
Pricing
from $2.10 / 1,000 job posting returneds
Rating
0.0
(0)
Developer
First Party Data
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
a month ago
Last modified
Categories
Security
Limited permissionsShare
Job postings from any Ashby board (jobs.ashbyhq.com/...) through Ashby's own
public API. No login, no proxy, no browser.
| You give it | Ashby board URLs, company names like ramp, or nothing: switch on Search the built-in company list and filter 3,216 live Ashby boards |
| You get back | one row per posting: title, department, location, country, employment type, the full description, the posted date, the pay range and equity flag where published, and a work arrangement you can filter on (Remote, Hybrid or OnSite) |
| It costs | $3.50 per 1,000 rows on Apify's Free and Starter plans, $2.80 on Scale, $2.10 on Business and above, plus $0.01 per run. Filters are applied before you are charged, and a run that finds nothing costs nothing |
| The form as it opens | reads OpenAI and Ramp, 10 postings each: 20 rows, 8 cents on the Free plan, under 10 seconds on Apify. For more, raise Maximum jobs from any one job board and Maximum jobs to return |
Ashby is the most generous of the major applicant tracking systems about what it publishes. It is the one that routinely gives you a real pay range, and also the one that is easiest to read wrongly. Both of those are the point of this actor, and both are measured below rather than asserted.
Ashby's pay data is the densest anywhere, and a third of it is easy to lose
Ashby attaches several compensation components to a posting: a salary range, an equity line, sometimes a bonus. They are returned as a list, and the list is not in a fixed order.
Ramp publishes a pay range on 95% of its roles. On only 25% of them is that range the first component: usually the equity line comes first, and an equity line carries no numbers at all. So the obvious implementation, take the first component, reports Ramp as mostly not publishing pay.
Measured across 300 Ashby boards and 19,267 live postings:
| Postings that publish a real pay range | 38.4% |
| …that taking the first component silently misses | 30.0% of them (2,217 postings) |
| Postings advertising equity | 24.1% |
So a naive Ashby scraper reports roughly 27% salary coverage. The true figure is
38.4%. This actor picks the component that is actually a pay range, exposes
offersEquity separately, and normalises Ashby's "1 YEAR" interval notation to
YEARLY so ranges are comparable across boards.
"compensation": {"min": 211400, "max": 290600, "currency": "USD","interval": "YEARLY", "raw": "$211.4K - $290.6K"},"offersEquity": true
Filter to only jobs with published pay and you get a genuinely dense salary dataset, which on most other applicant tracking systems is simply not available.
isRemote does not mean remote, and it is wrong about half the time
This is Ashby's sharpest trap. The API returns a boolean field called isRemote.
It reads as though it means the role is remote. It does not. It appears to mean
"not strictly on-site", so it is true for hybrid roles too.
Measured across 300 Ashby boards and 19,267 live postings:
| 51.7% | of postings have isRemote: true |
| 23.6% | are actually remote, per Ashby's own workplaceType |
| 54.6% | of the field's true values are Hybrid or OnSite |
| 2.19× | how much you overstate remote work by trusting it |
More than half of everything Ashby marks isRemote: true is not a remote job.
Anything built downstream of that field inherits the error, including an "AI work
arrangement" filter, which will confidently label hybrid roles remote.
This actor treats workplaceType as authoritative and falls back to
isRemote only where workplaceType is absent. You get both:
workplaceType:Remote,Hybrid,OnSite, ornullisRemoteis three-valued:true,false, ornullwhen the board did not say
Filter with Work arrangement to pick exactly what you want, including
Hybrid on its own, which no boolean can express. Remote roles only means
genuinely remote, and excludes unknowns rather than guessing.
Distribution across that sample: OnSite 31.7%, Hybrid 28.3%, Remote 23.6%, unstated 16.4%.
Input
Paste board URLs, or just name the company:
https://jobs.ashbyhq.com/openaihttps://jobs.ashbyhq.com/rampopenai
The board identifier is the last path segment. Ashby's API publishes no company
name, so for a board in the bundled list company is the name from that board's
own Ashby job page, collected when the list was built, and for any other board it
is derived from the identifier. companyToken always holds the exact, unmodified
identifier.
Or switch on Search the built-in company list: this actor ships 3,216 verified live Ashby boards carrying 59,274 open postings, ordered largest first, so a sample of a few hundred already covers most of them.
The ten largest Ashby boards in the bundled list
- Bjak: 3,061 roles
- OpenAI: 810 roles
- Airwallex: 581 roles
- Air Apps: 498 roles
- LILT (Production): 413 roles
- Alpaca Health: 405 roles
- Renuity: 383 roles
- Crusoe: 374 roles
- Snowflake: 368 roles
- Harvey: 332 roles
Every board was verified live at build time (2026-09-24): it answered Ashby's API with at least one open posting. Dead and private boards are not shipped.
What a row looks like
{"id": "ashby:openai:8fb1615c-34bf-47c4-a1d1-b7b2f836bbd3","title": "Technical Program Manager, Compute Infrastructure","company": "OpenAI","companyToken": "openai","department": "Technical Program Management","team": "Technical Program Management","employmentType": "FULL_TIME","employmentTypeRaw": "FullTime","seniorityLevel": null,"seniorityInferred": false,"locationRaw": "San Francisco","locations": ["San Francisco"],"city": "San Francisco","region": "California","country": "United States","workplaceType": "Hybrid","isRemote": false,"compensation": { "min": 257000, "max": 335000, "currency": "USD", "interval": "YEARLY", "raw": "$257K - $335K" },"offersEquity": true,"descriptionText": "About the Team...","applyUrl": "https://jobs.ashbyhq.com/openai/8fb1615c-.../application","postedAt": "2026-03-12T16:38:15.322Z","scrapedAt": "2026-09-11T06:20:11.004Z"}
Note workplaceType: "Hybrid" alongside isRemote: false. That same posting
carries isRemote: true in Ashby's raw response.
seniorityLevel is null here on purpose. "Technical Program Manager" is a
role, not a level: program managers, account managers and project managers are
individual contributors, and across 20,000 titles "manager" was the single most
misleading word to read as seniority. Where a level really is stated, the field
carries one of INTERN JUNIOR MID SENIOR MANAGER PRINCIPAL DIRECTOR
EXECUTIVE, and seniorityInferred says whether it came from the employer's own
field or from the title.
id is stable between runs, so an incremental pipeline can dedupe on it.
Multi-location postings keep every location in locations[] rather than only the
primary one.
Location is structured, not just a string. Ashby publishes a real postal
address on 793 of 795 OpenAI postings, so city, region and country come out
as separate fields. That makes the Country filter exact: you are matching a
country, not string-searching "Germany" against a location line that might say
"Berlin" or "Munich". An ISO code works too.
Recipes
Every remote engineering role that publishes pay
{"useBuiltInCorpus": true,"corpusSample": 500,"titleInclude": ["engineer"],"workplaceTypes": ["Remote"],"withSalaryOnly": true}
Salary benchmarking across the startup market
{ "useBuiltInCorpus": true, "corpusSample": 0, "withSalaryOnly": true, "includeDescriptions": false }
Ashby's structured pay plus a wide board list is the cheapest compensation dataset available here. Descriptions off keeps it small.
Roles offering equity
{ "useBuiltInCorpus": true, "corpusSample": 300, "offersEquityOnly": true }
A daily feed of one company
{ "companies": ["ramp"], "onlyNewOrChanged": true }
Running it as a feed
Only new or changed jobs remembers what the last run returned and bills only
what moved: a changed title, a changed pay range, a changed work arrangement.
Unchanged postings are skipped without being billed. Roles that disappeared are
listed in the REMOVED_SINCE_LAST_RUN record so you can close them out.
Set Maximum jobs from any one job board to 0 for a feed. The form opens at 10 per company to keep a first look cheap, and a limit left in place caps what every run can deliver from each company.
The first run establishes the baseline and returns everything.
Honest limits
- Ashby's API publishes no company name. The bundled list carries the name
from each board's own Ashby job page, so a board in it comes back as the
employer calls itself. A board outside it is named from its identifier, so a
glued-together name comes back as it was written, with only the first letter
capitalised. Treat
companyTokenas the real key. compensationis null more often than you would like. 38.4% coverage is excellent for this industry and still means most postings have none. Where a range appears only in the description prose it is parsed out, but only when it is unambiguous and currency-marked.workplaceTypeis unset on about 16% of postings. Those getisRemote: null. Filtering on work arrangement excludes them; that is deliberate, because the alternative is inventing an answer.- One request per board, no paging. Ashby returns the whole board at once, which is why this is the fastest of the major systems to read, a 795-posting board lands in about 210 ms. Large runs are limited by how many boards you ask for, not by Ashby.
- Public data only. The endpoint is Ashby's documented public job-board API, the one that exists so companies can host their own careers page. Nothing authenticates, submits an application, or touches candidate data.
Unofficial: this actor is not affiliated with or endorsed by Ashby.