Career Site Jobs Aggregator - ATS Salary Data
Open jobs from Greenhouse, Lever, Ashby, Workday, Workable, SmartRecruiters, Recruitee and Personio in one schema with normalized salaries.
datagrit › Jobs & salaries › Ashby Salary Scraper - Startup Job Pay Ranges
Jobs & salariesAshby job postings with normalized annual salary ranges, equity flags and new-since-last-run detection.
Ashby Salary Scraper reads the public job boards of companies that hire through Ashby and returns every posting as a clean record, with the published salary range converted to yearly amounts. Pay is the point: you can keep only postings with a salary, set a minimum annual pay, pick the currency of the pay range, and get equity, bonus and commission flags plus every location pay tier next to each role. Export the data as JSON, CSV or Excel, call it through the Apify API, or plug it into n8n, Make and AI agents through MCP.
jobs.ashbyhq.com/ramp means the name is ramp. Some board names contain spaces, such as jobs.ashbyhq.com/the%20browser%20company; paste the link as it is or type the browser company.Each record contains the title, department, team, employment type, primary and secondary locations with country, region and city plus one allLocations column that joins them, the workplace type and Ashby's remote flag, publication date and age, the posting and application links, and the compensation: the headline range as published with its interval and currency, the same range annualised, equity, bonus and commission flags, the salary text shown on the posting, the number of location-based pay tiers with their currencies and summaries. The full description text is available on request.
Annualising multiplies monthly pay by 12, weekly by 52, daily by 260 and hourly by 2080. Amounts stay in the currency of the headline range: the Actor does not convert currencies, so combine the minimum salary filter with the currency filter.
Measured by us on 30 September 2026 on the live Ashby API: the openai board listed 838 postings, 677 of them with a salary; ramp listed 155 postings, 148 with a salary (144 yearly, 4 monthly ranges); zapier listed 11 postings, 9 with a USD headline range, 8 of which add a Canadian pay tier. Boards such as deel and vercel existed but had no open postings.
Ashby sets its isRemote flag to true for hybrid roles as well: on openai all 524 Hybrid postings carried it (measured 30 September 2026). The Remote roles only switch therefore keeps workplace type Remote and drops Hybrid and on-site roles; on that day it returned 29 of 838 openai postings (24 marked Remote, 5 without a workplace type whose location says remote, such as "Bangalore - Remote").
The Actor reads only the public job board API that Ashby offers to employers for publishing their open roles. It does not log in, bypass access controls or collect candidate data. Job postings can contain personal data such as a recruiter name in the description, so if you request descriptions you are responsible for handling them in line with applicable data protection law. This description is not legal advice.
Every result is one flat record, so it drops straight into a spreadsheet, a database or a CRM.
| Field | Type | Description | Example |
|---|---|---|---|
company | string | Ashby board name the posting belongs to. On the status row (found = false) it lists the boards that were read. | ramp |
id | string | Stable Ashby identifier of the posting; null only on the status row. | 34413f8d-26bf-4bbc-8ade-eb309a0e2245 |
title | string | Job title; null only on the status row. | Security Engineer, Cloud |
department | string | Department as set by the employer. | Engineering |
team | string | Team inside the department. | Backend |
employmentType | string | FullTime, PartTime, Intern, Contract or Temporary. | FullTime |
location | string | Primary location text. | New York, NY (HQ) |
otherLocations | string | Secondary locations joined with semicolons. | Remote (Canada); Miami, FL |
allLocations | string | Every place the posting names, joined with semicolons: primary location, secondary locations and the address as city, region, country. The location filter searches this field. | New York, NY (HQ); Remote (Canada); Remote (US); Miami, FL; New York City, NY, U |
country | string | Country of the primary address when published. | USA |
region | string | State or region of the primary address. | NY |
city | string | City of the primary address. | New York City |
isRemote | boolean | Ashby's isRemote flag as published. Ashby sets it to true for Hybrid roles too, so use workplaceType to tell fully remote roles apart. | true |
workplaceType | string | Remote, Hybrid or OnSite as set by the employer; null when the employer did not set it. | Hybrid |
publishedAt | string | ISO 8601 publication time. | 2026-04-07T17:12:35.753Z |
daysSincePublished | integer | Whole days between publication and this run. | 175 |
jobUrl | string | Public page of the posting; null only on the status row. | https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245 |
applyUrl | string | Direct application link. | https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application |
hasSalary | boolean | True when a salary range is published. | true |
salaryMin | number | Lower bound as published, in the posting interval. | 211400 |
salaryMax | number | Upper bound as published, in the posting interval. | 290600 |
salaryCurrency | string | Currency of the headline range in salaryMin/salaryMax. The salary currency filter and the minimum annual salary use this currency. | USD |
salaryInterval | string | Pay period of the published range, for example 1 YEAR or 1 MONTH. | 1 YEAR |
salaryAnnualMin | integer | Lower bound converted to a yearly amount in the posting currency (no currency conversion). | 211400 |
salaryAnnualMax | integer | Upper bound converted to a yearly amount in the posting currency. | 290600 |
equityOffered | boolean | True when the compensation includes equity. | true |
bonusMentioned | boolean | True when the compensation lists a bonus. | false |
commissionMentioned | boolean | True when the compensation lists commission. | false |
salarySummary | string | Salary text as shown on the posting. | $211.4K - $290.6K |
payTiers | integer | Number of location-based pay tiers published for the role. | 1 |
payTierCurrencies | string | All currencies used by the pay tiers of the posting, for example "USD, CAD" when a Canadian tier is listed next to the US one; the headline currency when there are no tiers. | USD, CAD |
payTierSummaries | string | All pay tiers joined with a pipe, only when there is more than one. | |
descriptionText | string | Plain-text description, only when requested. | |
found | boolean | True for every posting. False only on the single free status row emitted when a run returns no postings; the run status message says why. | true |
scrapedAt | string | ISO 8601 timestamp of extraction. | 2026-09-30T08:00:00.000Z |
{
"company": "ramp",
"id": "34413f8d-26bf-4bbc-8ade-eb309a0e2245",
"title": "Security Engineer, Cloud",
"department": "Engineering",
"team": "Backend",
"employmentType": "FullTime",
"location": "New York, NY (HQ)",
"otherLocations": "Remote (Canada); Miami, FL",
"allLocations": "New York, NY (HQ); Remote (Canada); Remote (US); Miami, FL; New York City, NY, USA",
"country": "USA",
"region": "NY",
"city": "New York City",
"isRemote": true,
"workplaceType": "Hybrid",
"publishedAt": "2026-04-07T17:12:35.753Z",
"daysSincePublished": 175,
"jobUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245",
"applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application",
"hasSalary": true,
"salaryMin": 211400,
"salaryMax": 290600,
"salaryCurrency": "USD",
"salaryInterval": "1 YEAR",
"salaryAnnualMin": 211400,
"salaryAnnualMax": 290600,
"equityOffered": true,
"bonusMentioned": false,
"commissionMentioned": false,
"salarySummary": "$211.4K - $290.6K",
"payTiers": 1,
"payTierCurrencies": "USD, CAD",
"payTierSummaries": null,
"descriptionText": null,
"found": true,
"scrapedAt": "2026-09-30T08:00:00.000Z"
}
| Field | Name | Type | What it does |
|---|---|---|---|
companies required | Companies (Ashby boards) | array | Ashby job board names or URLs, one per company. The name is the last part of the careers URL: jobs.ashbyhq.com/ramp means the name is ramp; names with spaces work too (jobs.ashbyhq.com/the%20browser%20company or the browser company). Boards that do not exist and entries that are not a board name or an Ashby link are skipped and listed in the run status; if none of the boards can be read, the run fails. |
keywords | Job title keywords | array | Optional. Keep a posting when its job title contains any of these words (case-insensitive), for example engineer or designer. Leave empty for all roles. |
departments | Departments | array | Optional. Keep only postings whose department contains one of these words (case-insensitive), for example Engineering or Sales. Companies name departments differently (OpenAI files sales roles under Go To Market), so check the department column of a first run. |
teams | Teams | array | Optional. Keep only postings whose team, the level below the department, contains one of these words (case-insensitive), for example Backend or Sales. Combined with departments, both must match. |
locations | Locations | array | Optional. Keep only postings whose primary or secondary locations, country, region or city contain one of these as a whole word or phrase, for example London, Germany or US (US matches Remote (US) but not Australia). Countries appear as the employer writes them, for example USA or United States. |
remoteOnly | Remote roles only | boolean | Keep only fully remote postings: workplace type Remote. Hybrid and on-site roles are excluded even though Ashby flags Hybrid roles as isRemote. When the employer did not set a workplace type, the isRemote flag decides, and without it the word remote in the primary location. |
onlyWithSalary | Only postings with a published salary | boolean | Skip postings that do not show a salary range. Employers in some regions must publish pay, so this is a quick way to build a pay dataset. |
minAnnualSalary | Minimum annual salary | integer | Keep only postings whose top salary, converted to a yearly amount, reaches this value in the currency of the headline range (salaryCurrency). 0 disables the filter. Monthly, weekly, daily and hourly pay is annualised (12, 52, 260 and 2080 periods). Currencies are not converted, so combine it with the currency filter. |
salaryCurrencies | Salary currencies | array | Optional. Keep only postings whose headline salary range (salaryMin/salaryMax, output field salaryCurrency) is in one of these currencies, as three-letter codes such as USD, GBP or EUR. A posting with a USD headline and an extra Canadian pay tier counts as USD; all tier currencies are listed in payTierCurrencies. |
publishedWithinDays | Published within days | integer | Keep only postings published at most N x 24 hours before the run. 0 disables the filter. |
onlyNewSinceLastRun | Only postings new since my last run | boolean | Return only postings this Actor has not already delivered to you for the same company and the same filters. The memory is kept in a storage on your account, separately for every company and every combination of filters (and state key), and only postings actually returned in a run are remembered, so postings cut off by the result limit or excluded by other filters come back later. The first run returns everything that matches. |
stateKey | State key for only-new mode | string | Optional name for the only-new memory. Two schedules with the same filters share one memory; give each a different state key (for example team-a and team-b) when each of them must receive every new posting. |
includeDescription | Include description text | boolean | Adds the plain-text job description, cut to 8000 characters. Off by default to keep the dataset small. |
maxItems | Maximum results | integer | Stop after this many postings in total across all companies. |
proxyConfiguration | Proxy configuration | object | Optional proxy. Leave disabled: the Ashby job board API is public and needs none. |
Run the Actor and get the results in one request. Replace YOUR_APIFY_TOKEN with the token from your Apify account settings.
curl -X POST "https://api.apify.com/v2/acts/datagrit~ashby-salary-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"companies":["ramp"],"onlyWithSalary":true,"maxItems":50}'import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('datagrit/ashby-salary-scraper').call({
"companies": [
"ramp"
],
"onlyWithSalary": true,
"maxItems": 50
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0]);Install with npm i apify-client.
from apify_client import ApifyClient
import os
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("datagrit/ashby-salary-scraper").call(run_input={
"companies": [
"ramp"
],
"onlyWithSalary": True,
"maxItems": 50
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(len(items), items[0] if items else None)Install with pip install apify-client.
Any company that publishes its roles through Ashby. Board names that return "not found" and entries that are not a board name or an Ashby link are listed in the run status, so you can spot typos, and boards that exist but have no open postings are named there too, even when your filters removed every posting from the other boards.
Employers decide whether to publish pay. Use the salary filter to keep only postings that show it.
The Actor keeps a memory in a storage on your account, separately for every company and every combination of filters. Only postings actually returned to you are remembered, so a posting cut off by the result limit or excluded by your filters comes back in a later run, and a second schedule with different filters gets its own complete feed. Two schedules with identical filters share one memory unless you give each a different state key. Postings that leave the board are forgotten after 30 days. Your first run returns everything that matches.
You get one free status row with `found: false`, and the run status says why: the board has no open postings, your filters matched nothing, or there is nothing new since your last run.
Every run reads the live job boards.
Open an issue with the input you used; changes at the source are fixed quickly.
Open jobs from Greenhouse, Lever, Ashby, Workday, Workable, SmartRecruiters, Recruitee and Personio in one schema with normalized salaries.
Greenhouse job postings with published pay ranges by zone, annualised pay, filters and new-since-last-run detection.
Find EU public contracts approaching expiry from TED award notices: incumbent, buyer, value, end date and renewal options.
French company lead lists from Sirene screened by net result and revenue, with net margin, size, matching establishment and optional directors.