Ashby Jobs Scraper with Salaries
Pricing
$1.42 / 1,000 results
Ashby Jobs Scraper with Salaries
Ashby jobs scraper for any startup careers board (OpenAI, Ramp, Notion and thousands more), with salary ranges as numbers: min, max, currency, period, plus equity and bonus flags. Flat rows with title, team, location, remote, apply link. Monitor mode returns only new, changed and removed jobs.
Pricing
$1.42 / 1,000 results
Rating
0.0
(0)
Developer
Redomic
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Security
Limited permissionsShare

For recruiters, VC and sales teams who track which startups are hiring: give it an Ashby job board (the name after jobs.ashbyhq.com/, for example ramp or openai) and get every open job as a flat row: title, department, team, location, remote/hybrid, employment type, the level read from the title (seniority), posting date, apply link and, when the company publishes it, the salary range as numbers (salaryMin, salaryMax, ISO salaryCurrency, salaryPeriod) plus whether the role offers equity, bonus or commission.
Real rows from 31 Oct 2026 (default options):
| board | title | team | location | workplaceType | seniority | salaryMin | salaryMax | salaryCurrency | salaryPeriod | offersEquity |
|---|---|---|---|---|---|---|---|---|---|---|
| ramp | Security Engineer, Cloud | Backend | New York, NY (HQ) | Hybrid | Mid | 211,400 | 290,600 | USD | year | true |
| ramp | Mobile Engineer, iOS | Software Engineering - Industry | New York, NY (HQ) | Hybrid | Mid | 189,000 | 330,000 | USD | year | true |
| ramp | Senior Product Marketing Manager - New Products | Product Marketing | New York, NY (HQ) | Hybrid | Senior | 156,000 | 210,000 | USD | year | true |
| openai | Research Engineer | Research | San Francisco | null | Mid | 250,000 | 445,000 | USD | year | true |
| openai | Researcher, Safety Training | Safety Systems | San Francisco | null | Mid | 380,000 | 500,000 | USD | year | true |
What it does
-
Salary as numbers: Ashby companies can publish structured pay ranges; this Actor requests them (
includeCompensation=true) and returns min, max, ISO currency and period in their own columns. Counts from runs on 1 Nov 2026 with{"boards": ["<board>"], "maxItems": 1000}: OpenAI 645 of 812 jobs with a salary range; Ramp 111 of 171 with a salary range plus 59 sales roles with an OTE range. On-target earnings (base + commission, e.g. Ramp's "OTE $310K – $407K") are never reported as salary: they go tooteMin/oteMax, andsalaryBasissays whether the salary is stated as base pay. Multi-tier ranges (e.g. per country or level) are kept insalaryRanges. When a company publishes no structured range but writes one in the description, it is read from the text (salarySource: "description") andsalaryBasisbecomesbaseorunspecified, neverote; a published OTE tier stays inoteMin/oteMax. Companies that publish no pay (e.g. Linear) getnull: nothing is estimated. -
Seniority on every row (
Intern,Junior,Mid,Senior,Lead/Principal): read from the title (Senior Product Marketing Manager - New ProductsisSenior,Software Engineering Intern, BackendisIntern,Principal Brand DesignerisLead/Principal, no signal isMid). Filter withseniorityto get only the level you are hiring for. -
Monitor mode: Schedule it and get only what changed since the last run: new jobs, changed jobs (title, team, location, workplace type or pay range) and removed jobs, each tagged
new,changedorremoved. Unchanged jobs are free. -
Flat, clean columns: City, region and country split out of the address; secondary locations as a list; employment type as
Full-time,Internship...; titles trimmed. No nested objects in the main table. -
Dead inputs are reported: A misspelled board (Ashby answers 404) or a board with no open jobs pushes a status row with the reason, and its count shows up as
boardsFailed/boardsEmptyin the summary row. The run itself still succeeds (0 rows, $0 charged), so a scheduled monitor does not fail when a company pauses hiring or a board name is mistyped; filter on_statusto alert on the input. A run fails only when Ashby cannot be reached or answers something that is not a job board. Example status row for a misspelled name:{"_status": "failed", "board": "ramp-typo", "mode": "jobs", "rows": 0, "reason": "board not found (404): check the name after jobs.ashbyhq.com/"} -
One request per board: Ashby's public posting API returns a whole board, descriptions included, in one call. No proxy, no browser; runs take seconds.
Input
| Field | Type | Default | Meaning |
|---|---|---|---|
boards | array of strings | ["ramp", "openai"] | Ashby board names (after jobs.ashbyhq.com/). Full board or job URLs are accepted |
mode | enum | monitor | monitor returns only new, changed and removed jobs since the last run; jobs lists every open job |
search | string | "" | Keep jobs whose title, department, team, location, workplace type or description contains this text |
seniority | array of strings | [] | Keep only these levels: Intern, Junior, Mid, Senior, Lead/Principal. Empty = every level |
includeDescription | boolean | false | Add the full description (plain text and HTML) to each row. Same single request |
maxItems | integer | 50 | Max job rows per board, 1 to 1000 (3 boards x 50 = at most 150 rows) |
{ "boards": ["ramp", "openai"], "mode": "monitor", "maxItems": 50 }
Output
One row per job, then one status row per board, then a summary row.
| Field | Example | Meaning |
|---|---|---|
id | 34413f8d-26bf-4bbc-8ade-eb309a0e2245 | Ashby job id, stable across runs |
board | ramp | The board you asked for |
title | Security Engineer, Cloud | Job title |
department, team | Engineering, Backend | As the company files the job |
location | New York, NY (HQ) | Primary location as listed |
city, region, country | New York City, NY, USA | From the job's address, when given |
secondaryLocations | ["Remote (Canada)", "Remote (US)", "Miami, FL"] | Other locations the job is open in |
isRemote | true | Ashby's remote flag |
workplaceType | Hybrid | Remote, Hybrid or Onsite, when set |
employmentType | Full-time | Full-time, Part-time, Contract, Internship or Temporary |
seniority | Senior | Intern, Junior, Mid, Senior or Lead/Principal. From the title; no signal is Mid |
publishedAt | 2026-04-07T17:12:35Z | Posting date, UTC |
url | https://jobs.ashbyhq.com/ramp/34413f8d-... | Job posting |
applyUrl | https://jobs.ashbyhq.com/ramp/34413f8d-.../application | Application form |
salaryMin, salaryMax | 211400, 290600 | Published base salary range (across tiers with the same currency and period) |
salaryCurrency, salaryPeriod | USD, year | ISO 4217 code; year, month, week, day or hour |
salaryText | USD 211,400 - 290,600 per year | The range as one string |
salaryBasis | base | base (stated as base pay), unspecified (a salary range with no basis given) or ote (only an on-target-earnings range is published) |
oteMin, oteMax | 310000, 407000 | On-target earnings (base + commission) when the company publishes them, e.g. sales roles |
salarySource | ashbyCompensation | ashbyCompensation (structured), description (read from the text) or null |
salaryRanges | [{"min": 211400, "max": 290600, "currency": "USD", "period": "year", "label": null}] | Every published salary tier |
offersEquity, offersBonus, offersCommission | true, false, false | From the compensation components; null when no compensation is published |
compensationSummary | $211.4K – $290.6K • Offers Equity | Ashby's own one-line summary |
descriptionText, descriptionHtml | ABOUT RAMP ... | Only with includeDescription |
changeType | new | Monitor mode only: new, changed or removed |
scrapedAt | 2026-10-31T00:00:00Z | When the row was fetched |
Status rows carry _status (ok, empty, failed), board, mode, rows, reason and total (open jobs on the board). The last row has _status: "summary" with run totals and, in monitor mode, new, changed, removed, firstRun.
Seniority, real counts
With {"boards": ["ramp"], "seniority": ["Senior"], "maxItems": 1000} on the 31 Oct 2026 capture (171 open jobs) the 27 Senior rows are Senior Manager, Account Executive | Mid-Market and Senior Product Marketing Manager - New Products (27 of 171; the same capture has 5 Intern, 3 Junior and 115 Mid, plus 21 Lead/Principal including Lead Recruiter | Design and Principal Brand Designer).
Pricing
result: $0.002 per job row delivered, nothing else: no start fee. 1,000 jobs ≈ $2.00. In monitor mode only new and changed jobs are charged; unchanged and removed jobs are free.
Monitor recipe
- Save a task with
{"boards": ["ramp", "openai", "notion"], "mode": "monitor"}. - Schedule it daily (or hourly) in Apify Console.
- Add a "run succeeded" webhook that sends the rows to Slack, Make or n8n, or export the dataset to Google Sheets.
- Filter on
changeType:new= fresh openings (a hiring signal),changed= retitled or re-priced roles,removed= filled or closed.
FAQ
- How do I find a board name? Open the company's careers page; Ashby boards live at
jobs.ashbyhq.com/<name>. Paste the whole URL if you like. - Can I search all Ashby companies at once? No. Ashby's public API is per board; list as many boards as you need in
boards. - Why is salary null for some companies? They do not publish pay on Ashby and do not write a range in the description. The Actor does not estimate.
What this does not do
It reads only Ashby's public posting API: no logins, no applicant data, no personal contact details. It does not guess missing salaries and does not search across companies you did not list.
Sibling Actors: Greenhouse Jobs Scraper with Salaries (the same row shape for Greenhouse boards) and Google Jobs API Scraper.
Use it from AI agents (MCP) and Python
AI agents. Add this Actor as a tool in Claude, Cursor, VS Code or any MCP client through the Apify MCP server. The agent reads the input schema, so a plain request is enough.
{"mcpServers": {"ashby-jobs-monitor": {"url": "https://mcp.apify.com?tools=redomic/ashby-jobs-monitor","headers": {"Authorization": "Bearer <YOUR_APIFY_TOKEN>"}}}}
Python. pip install apify-client, then:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("redomic/ashby-jobs-monitor").call(run_input={"boards": ["ramp"], "mode": "jobs", "maxItems": 20})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
More from us
- ATS Jobs Search: Greenhouse, Lever & Ashby Jobs API: Search 328,000+ open jobs from 11,000+ companies on Greenhouse, Lever and Ashby in one run
- Google Jobs Scraper - Job Postings API: Google Jobs and job postings scraper: get job title, company, location, posted date, salary, full description and every apply link for any search
- Google Trends API: Trending Now & Interest Over Time: Trending-now searches and new-trends alerts/monitoring per country with the news behind them, plus interest over time, interest by region, and related and rising queries for any keyword
- Greenhouse Jobs Monitor & Scraper: Monitor Greenhouse jobs from any company careers board (Airbnb, Stripe, Discord and thousands more)
- Lever Jobs Scraper with Salaries: Lever jobs scraper for any company's careers page (Palantir, Spotify, Zoox, Shield AI and thousands more): flat rows with title, team, location, workplace, commitment, apply link, salary as numbers and the full description merged