Ashby Jobs Scraper & API avatar

Ashby Jobs Scraper & API

Pricing

Pay per usage

Go to Apify Store
Ashby Jobs Scraper & API

Ashby Jobs Scraper & API

Free Ashby jobs scraper: pay only for platform usage. Extract every open job from Ashby job boards with salary ranges and pay tiers, equity, remote/hybrid/on-site type, locations, teams and descriptions. Filter by team, location, workplace, employment type, keywords or date.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Milad Amirzadeh

Milad Amirzadeh

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

11 hours ago

Last modified

Share

Collect every open job from one or many Ashby job boards in a single run: titles, locations, teams, departments, employment type, salary ranges with every pay tier, equity and bonus flags, remote/hybrid/on-site type, full descriptions, and publish dates. Use the results for job-board feeds, recruiting research, salary benchmarking, hiring-trend tracking, and scheduled employer snapshots, with no login or API key.

The Actor is free to use: you pay only for Apify platform usage, which is typically a fraction of a cent per run.

Ashby is the applicant tracking system behind the careers pages of companies such as OpenAI, Ramp, Notion, Linear, Snowflake, Cohere, Plaid, and thousands more. This Actor reads Ashby's public job posting API directly over HTTP. It runs without a browser or proxy, and fetched about 2,000 jobs from six large boards in under 5 seconds in testing.

What you get

  • All open jobs for one or many companies per run, from a board name (openai) or any board URL
  • Specific jobs by URL (job_details mode)
  • Salary ranges with currency and period, across every pay tier (Ashby often has one tier per location or level), plus salaries stated only in the job description: Notion, 1Password, Docker and others write pay there instead of in Ashby's compensation fields
  • Every compensation tier with its components (salary, equity, bonus, commission), and simple offersEquity, offersBonus, and offersCommission flags
  • Workplace type (Remote, Hybrid, On-site) and employment type (Full-time, Part-time, Internship, Contract, Temporary)
  • City, region, country, and an ISO country code, even though Ashby stores countries as free text ("USA", "United States")
  • Every listed location, team, and department
  • The real company name and website, which the posting API does not include
  • Full description as HTML and as plain text
  • Filters for workplace type, employment type, department or team, location or country, keywords, publish date, and salary availability
  • A per-company run summary showing open, matched, and saved counts, and any board names that were not found

Quick start

All jobs from several companies

{
"mode": "company_jobs",
"companySlugs": ["openai", "ramp", "https://jobs.ashbyhq.com/notion"],
"maxJobsPerCompany": 9999
}

Filtered: recent remote or hybrid full-time engineering roles in the US

{
"mode": "company_jobs",
"companySlugs": ["openai", "ramp", "notion", "cohere", "plaid"],
"workplaceTypes": ["remote", "hybrid"],
"employmentTypes": ["fulltime"],
"filterLocation": "US",
"jobKeywords": ["engineer", "engineering"],
"postedAfter": "30 days",
"maxJobsPerCompany": 200
}

Specific jobs

{
"mode": "job_details",
"jobUrls": [
"https://jobs.ashbyhq.com/linear/d3bc1ced-3ce4-4086-a050-555055dbb1ff"
]
}

How to find a company's board name

Open the company's Ashby job board or any of its job postings. The board name is the path segment right after jobs.ashbyhq.com/:

URLBoard name
https://jobs.ashbyhq.com/openaiopenai
https://jobs.ashbyhq.com/ramp/34413f8d-...ramp
https://jobs.ashbyhq.com/notion/e7c18c11-.../applicationnotion

You can paste any of these URLs directly. Case does not matter. Some companies embed their Ashby board on their own careers site; open any job there, and the application link usually points to jobs.ashbyhq.com/<board>.

Input reference

FieldTypeDefaultBehavior
modestringcompany_jobscompany_jobs lists all open jobs for each company. job_details fetches specific jobs.
companySlugsarray["linear"]Board names or URLs. Used in company_jobs mode. Duplicates are removed.
jobUrlsarray[]Ashby job URLs or board/jobId. Used in job_details mode.
includeContentbooleantrueSave the description as HTML (content) and plain text (descriptionText). Salaries in the text are read either way.
workplaceTypesarray[]Any of remote, hybrid, onsite, using the type the employer set in Ashby.
employmentTypesarray[]Any of fulltime, parttime, intern, contract, temporary.
filterDepartmentstringemptyCase-insensitive partial match against the department or team.
filterLocationstringemptyCase-insensitive partial match against every listed location, city, region, and country. Remote also matches jobs with the Remote workplace type. A two-letter country code such as DE, US, or UK matches the country exactly, using the country named in the location when the address has none. A US state name such as California also finds its code ("San Francisco, CA"), and state codes that are not country codes (NY, TX) match the state.
jobKeywordsarray[]Up to 20 keywords or phrases. A job matches when any of them appears as a whole word in its title or description.
postedAfterstringemptyYYYY-MM-DD or relative (7 days). Inclusive, compared as UTC dates.
onlyWithSalarybooleanfalseKeep only jobs with a salary, from Ashby's compensation or the description.
maxJobsPerCompanyinteger500Maximum jobs saved per company after filtering, newest first. Use 9999 for all.
proxyConfigurationobjectoffOptional. The API is public, so a proxy is not required.

All filters that you set must match (AND). Filters apply only in company_jobs mode.

Keyword matching uses whole words, so AI matches "AI Engineer" but not "email". Add every form you want to catch, such as engineer and engineering.

Output

Each saved job looks like this:

{
"jobId": "34413f8d-26bf-4bbc-8ade-eb309a0e2245",
"title": "Security Engineer, Cloud",
"companyName": "Ramp",
"companySlug": "ramp",
"companyWebsite": "https://ramp.com",
"location": "New York, NY (HQ)",
"allLocations": ["New York, NY (HQ)", "Remote (Canada)", "Remote (US)", "Miami, FL"],
"city": "New York City",
"region": "NY",
"country": "USA",
"countryCode": "US",
"workplaceType": "Hybrid",
"department": "Engineering",
"team": "Backend",
"employmentType": "Full-time",
"salaryMin": 211400,
"salaryMax": 290600,
"salaryCurrency": "USD",
"salaryInterval": "year",
"salaryDescription": "$211.4K – $290.6K • Offers Equity",
"salarySource": "ashby",
"offersEquity": true,
"offersBonus": false,
"offersCommission": false,
"compensationTiers": [
{
"title": null,
"summary": "$211.4K – $290.6K • Offers Equity",
"components": [
{ "type": "EquityPercentage", "min": null, "max": null, "currency": null, "interval": null },
{ "type": "Salary", "min": 211400, "max": 290600, "currency": "USD", "interval": "year" }
]
}
],
"url": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245",
"applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application",
"content": "<h1><strong>About Ramp</strong></h1><p>Ramp is building the smart infrastructure for finance teams...",
"descriptionText": "ABOUT RAMP\n\nRamp is building the smart infrastructure for finance teams...",
"publishedAt": "2026-04-07T17:12:35+00:00",
"scrapedAt": "2026-10-01T03:00:00+00:00"
}
FieldMeaning
jobIdAshby job ID (UUID).
titleJob title.
companyName / companySlug / companyWebsiteCompany name and website from the hosted Ashby board, and the board name. The name falls back to the board name if unavailable.
location / allLocationsPrimary location, and every location the job lists.
city / region / country / countryCodeAddress of the primary location. country is as written by the employer; countryCode is the ISO code when recognized.
workplaceTypeRemote, Hybrid, On-site, or null when the employer left it unset.
department / teamAshby's department and team.
employmentTypeFull-time, Part-time, Internship, Contract, or Temporary.
salaryMin / salaryMax / salaryCurrency / salaryIntervalSalary range across all pay tiers and its period (year, month, week, day, hour). A single figure has equal min and max. null when no salary is stated.
salaryDescriptionAshby's compensation summary, or the sentence the salary was read from.
salarySourceashby when the employer filled in Ashby's compensation, description when the salary was read from the job text, null when neither has one.
offersEquity / offersBonus / offersCommissionWhether the published compensation includes these; null when no compensation is published.
compensationTiersEvery pay tier (often one per location or level), with its components: type (Salary, EquityPercentage, EquityCashValue, Bonus, Commission), min, max, currency, and interval.
url / applyUrlHosted job page and application page.
content / descriptionTextFull description as HTML and as plain text. null when includeContent is off.
publishedAtWhen the job was published (UTC).
scrapedAtWhen the job was collected (UTC).

Results appear in the default dataset. Use the Job overview view for compact metadata, salaries, and links, or the Job descriptions view for text.

Run summary

Each run also writes an OUTPUT record to the default key-value store. It shows every target's status (ok, not_found, or error) and its open, matched, and saved job counts, so you can spot mistyped board names without reading the log. When no target succeeds, the run is marked as failed.

API and exports

Run the Actor from your application with the standard Apify API:

curl -X POST \
"https://api.apify.com/v2/acts/miladamirzadeh~ashby-jobs-scraper/run-sync-get-dataset-items?token=<APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"companySlugs": ["openai", "ramp"],
"workplaceTypes": ["remote"],
"maxJobsPerCompany": 50
}'

You can also use the generated Python, JavaScript, CLI, OpenAPI, and MCP examples in the Actor's API tab. Datasets export to JSON, CSV, Excel, XML, and HTML.

Recurring workflows

Save a tested input as an Apify Task and schedule it daily or weekly. For daily runs, set postedAfter to 1 day so each run saves only jobs published since the day before.

Typical uses:

  • Job-board and aggregator ingestion
  • Salary benchmarking across companies that publish pay ranges
  • Tracking hiring volume by team, location, or workplace type
  • Alerts for new roles at target companies, through Apify integrations such as Slack, Google Sheets, Make, or Zapier

Each run produces an independent dataset. The Actor does not keep history between runs.

Practical limitations

  • You need each company's Ashby board name. Ashby has no public directory of all boards.
  • Only listed jobs are available. Unlisted and internal jobs are not exposed by the public API.
  • Ashby records when a job was published, not when it was last edited, so there is no "updated after" filter.
  • Some employers leave the workplace type unset; those jobs are excluded when you filter by workplace type.
  • salaryMin and salaryMax span all pay tiers. When tiers use different currencies, Ashby's summary (and these fields) keep the first currency; every tier is still in compensationTiers.
  • Salaries read from the description (salarySource: "description") are the first salary the text states. When a job lists several ranges (per city or level), the first one is saved and salaryDescription shows its context. Amounts labeled OTE (on-target earnings), bonuses, perks, and business figures such as deal sizes are skipped. A bare $ is read as USD unless the text names another currency code.
  • Filters apply only in company_jobs mode.
  • Closed jobs return not_found in job_details mode.

Pricing

The Actor is free. There is no per-run or per-result fee; you pay only for the Apify platform usage (compute units) of your runs, which the Apify free plan's monthly credit covers for most users.

Runs are cheap because the Actor makes plain HTTP requests with no browser or proxy. It runs at 512 MB by default and used about 215 MB in testing. Saving every job from OpenAI, Snowflake, Harvey, ClickHouse, Cohere, and ElevenLabs (about 2,000 jobs) took under 5 seconds.

Troubleshooting and support

If a run returns no jobs:

  1. Open the OUTPUT record. A not_found status means the board name is wrong or the company does not use Ashby.
  2. Open the company's job posting in a browser and copy the board name from the URL.
  3. Remove the filters temporarily to rule out an overly narrow match.

For support, open an Actor issue with your input (without tokens), the run link, and what you expected to see.