Ashby Jobs Scraper with Salaries avatar

Ashby Jobs Scraper with Salaries

Pricing

$1.42 / 1,000 results

Go to Apify Store
Ashby Jobs Scraper with Salaries

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

Redomic

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Security

Limited permissions

Share

Ashby Jobs Scraper with Salaries

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):

boardtitleteamlocationworkplaceTypesenioritysalaryMinsalaryMaxsalaryCurrencysalaryPeriodoffersEquity
rampSecurity Engineer, CloudBackendNew York, NY (HQ)HybridMid211,400290,600USDyeartrue
rampMobile Engineer, iOSSoftware Engineering - IndustryNew York, NY (HQ)HybridMid189,000330,000USDyeartrue
rampSenior Product Marketing Manager - New ProductsProduct MarketingNew York, NY (HQ)HybridSenior156,000210,000USDyeartrue
openaiResearch EngineerResearchSan FrancisconullMid250,000445,000USDyeartrue
openaiResearcher, Safety TrainingSafety SystemsSan FrancisconullMid380,000500,000USDyeartrue

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 to oteMin/oteMax, and salaryBasis says whether the salary is stated as base pay. Multi-tier ranges (e.g. per country or level) are kept in salaryRanges. When a company publishes no structured range but writes one in the description, it is read from the text (salarySource: "description") and salaryBasis becomes base or unspecified, never ote; a published OTE tier stays in oteMin/oteMax. Companies that publish no pay (e.g. Linear) get null: nothing is estimated.

  • Seniority on every row (Intern, Junior, Mid, Senior, Lead/Principal): read from the title (Senior Product Marketing Manager - New Products is Senior, Software Engineering Intern, Backend is Intern, Principal Brand Designer is Lead/Principal, no signal is Mid). Filter with seniority to 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, changed or removed. 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/boardsEmpty in 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 _status to 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

FieldTypeDefaultMeaning
boardsarray of strings["ramp", "openai"]Ashby board names (after jobs.ashbyhq.com/). Full board or job URLs are accepted
modeenummonitormonitor returns only new, changed and removed jobs since the last run; jobs lists every open job
searchstring""Keep jobs whose title, department, team, location, workplace type or description contains this text
seniorityarray of strings[]Keep only these levels: Intern, Junior, Mid, Senior, Lead/Principal. Empty = every level
includeDescriptionbooleanfalseAdd the full description (plain text and HTML) to each row. Same single request
maxItemsinteger50Max 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.

FieldExampleMeaning
id34413f8d-26bf-4bbc-8ade-eb309a0e2245Ashby job id, stable across runs
boardrampThe board you asked for
titleSecurity Engineer, CloudJob title
department, teamEngineering, BackendAs the company files the job
locationNew York, NY (HQ)Primary location as listed
city, region, countryNew York City, NY, USAFrom the job's address, when given
secondaryLocations["Remote (Canada)", "Remote (US)", "Miami, FL"]Other locations the job is open in
isRemotetrueAshby's remote flag
workplaceTypeHybridRemote, Hybrid or Onsite, when set
employmentTypeFull-timeFull-time, Part-time, Contract, Internship or Temporary
senioritySeniorIntern, Junior, Mid, Senior or Lead/Principal. From the title; no signal is Mid
publishedAt2026-04-07T17:12:35ZPosting date, UTC
urlhttps://jobs.ashbyhq.com/ramp/34413f8d-...Job posting
applyUrlhttps://jobs.ashbyhq.com/ramp/34413f8d-.../applicationApplication form
salaryMin, salaryMax211400, 290600Published base salary range (across tiers with the same currency and period)
salaryCurrency, salaryPeriodUSD, yearISO 4217 code; year, month, week, day or hour
salaryTextUSD 211,400 - 290,600 per yearThe range as one string
salaryBasisbasebase (stated as base pay), unspecified (a salary range with no basis given) or ote (only an on-target-earnings range is published)
oteMin, oteMax310000, 407000On-target earnings (base + commission) when the company publishes them, e.g. sales roles
salarySourceashbyCompensationashbyCompensation (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, offersCommissiontrue, false, falseFrom the compensation components; null when no compensation is published
compensationSummary$211.4K – $290.6K • Offers EquityAshby's own one-line summary
descriptionText, descriptionHtmlABOUT RAMP ...Only with includeDescription
changeTypenewMonitor mode only: new, changed or removed
scrapedAt2026-10-31T00:00:00ZWhen 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

  1. Save a task with {"boards": ["ramp", "openai", "notion"], "mode": "monitor"}.
  2. Schedule it daily (or hourly) in Apify Console.
  3. Add a "run succeeded" webhook that sends the rows to Slack, Make or n8n, or export the dataset to Google Sheets.
  4. 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 ApifyClient
client = 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