Greenhouse, Lever, Ashby & Workday Jobs Scraper - Any Company
Pricing
from $1.25 / 1,000 jobs
Greenhouse, Lever, Ashby & Workday Jobs Scraper - Any Company
Get open jobs of any company by name: Stripe, Ramp (Greenhouse, Lever, Ashby, Workable, Recruitee, Personio) and NVIDIA, Salesforce (Workday) in one run, board auto-detected. Filters: title, location, remote. Returns per job: title, team, location, salary, date, URL. Default: 20/company. $1.25/1K.
Pricing
from $1.25 / 1,000 jobs
Rating
0.0
(0)
Developer
Bence Kadi
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 hours ago
Last modified
Categories
Share
Greenhouse, Lever & Ashby Jobs Scraper: ATS jobs API for Workable, Recruitee and Personio too
What is Greenhouse, Lever & Ashby Jobs Scraper?
Greenhouse, Lever & Ashby Jobs Scraper collects open jobs from company job boards on six applicant tracking systems (ATS): Greenhouse, Lever, Ashby, Workable, Recruitee and Personio. You type company names such as Stripe, ramp.com or Hugging Face, and get all their open jobs as JSON, CSV or Excel, in one schema with title, locations, work mode, department, posted date, salary and description.
It reads the public job-board endpoints that these ATS vendors provide so companies can show openings on their own websites. No login, API key or browser.
What makes it different
- Auto-detects the ATS. Type a name or domain; all 6 platforms are checked, including Lever EU and Personio
.de/.com. Board URLs work too. - Big employers on Workday too. If a company has no board on these 6 (NVIDIA, Salesforce, Intel, Adobe), its Workday career site is used instead, with the same output fields (
ats: "workday").StripeandNVIDIAin one run give one dataset. Workday URLs (*.myworkdayjobs.com) work as input as well. - Newest jobs first, so a small
maxJobsPerCompanygives recent openings instead of the A-Z top of the board. - One schema for 6 platforms. Merge companies in a spreadsheet or database without mapping work.
- No hidden result cap.
maxJobsPerCompany: 0returns every open job (Stripe alone has 700+). - Salary included. Structured pay ranges from Ashby, Lever and Recruitee, plus ranges like "$120,000 – $150,000" parsed from descriptions elsewhere.
- Filters. Posted within N days, title words, location and remote only.
- Only new jobs. Monitoring mode outputs, and charges for, only postings you haven't seen before.
- Fast. One request per company board. The 3-company prefill finishes in about 15 seconds.
Use cases
- Sales and lead generation (hiring signals): find companies hiring for roles that suggest they need your product, like "Head of RevOps" or "Data Engineer".
- Recruiting agencies: monitor target accounts and react to new openings the same day.
- Job boards and newsletters: aggregate startup and tech jobs from hundreds of career pages.
- Investors and market research: track team build-outs across a portfolio.
- AI agents and RAG apps: give an LLM fresh, structured job data through the API or the Apify MCP server.
Data fields you get
| Field | Description | Example |
|---|---|---|
title | Job title | Security Engineer, Cloud |
company | What you typed in the input | Ramp |
companyName | Company name the ATS publishes (Greenhouse, Workable, Recruitee, Personio; else empty) | Stripe |
ats | greenhouse, lever, ashby, workable, recruitee or personio | ashby |
jobId | Job ID on the ATS | 34413f8d-26bf-4bbc-8ade-eb309a0e2245 |
url | Link to the live job page | https://jobs.ashbyhq.com/ramp/34413f8d-... |
applyUrl | Link to the application form | https://jobs.ashbyhq.com/ramp/.../application |
location | Primary location | New York, NY (HQ) |
locations | All locations of the posting | ["New York, NY (HQ)", "Remote (US)"] |
country | Country, when the ATS gives it | USA |
countryCode | Country code, when the ATS gives it (Lever, Workable, Recruitee) | GB |
workMode | remote, hybrid, onsite or empty when unknown | hybrid |
employmentType | As published by the company | FullTime |
department | Department | Engineering |
team | Team (or function / category) | Backend |
seniority | Seniority (Personio only) | experienced |
postedDate | When the job was published (ISO, UTC) | 2026-04-07T17:12:35Z |
updatedDate | Last update (Greenhouse only) | 2026-09-25T20:45:00Z |
salaryMin / salaryMax | Pay range (numbers) | 211400 / 290600 |
salaryCurrency | Currency code | USD |
salaryPeriod | YEAR, MONTH or HOUR | YEAR |
salaryText | Original pay text, when available | $211.4K - $290.6K |
description | Job description as plain text | About Ramp\nRamp is building... |
descriptionHtml | Description as HTML (if you choose HTML or both) | <p>About Ramp</p>... |
boardUrl | Job board the job came from | https://jobs.ashbyhq.com/ramp |
isNew | Set in monitoring mode for jobs not seen before | true |
scrapedAt | When the job was scraped (UTC) | 2026-10-04T23:58:10Z |
How to use Greenhouse, Lever & Ashby Jobs Scraper
- Open the Actor and type one or more company names, websites or job-board URLs in the first field, one per line. The prefill is Stripe, Ramp and Hugging Face with 20 jobs each. It saves about 48 jobs, takes about 15 seconds and costs about $0.06.
- Optional: add title words to include or exclude, locations, remote only or posted within N days. Set Max jobs per company to
0to get everything. - Click Start.
- When the run finishes, open the Output tab and download the data as JSON, CSV, Excel or HTML, or connect it to Google Sheets, Zapier, Make, n8n or your own code.
- To get only new jobs every day, turn on Only new jobs and create a Schedule (see Integrations and scheduling).
Input guide
Company names, websites or job-board URLs (companies)
Type the company's name or domain, one per line. The Actor turns it into likely board slugs (Hugging Face becomes huggingface and hugging-face) and checks each selected ATS. If a company has boards on several ATSs, each one is scraped. The RUN_SUMMARY record shows which ATS and board were found for each company.
- Good:
Stripe,ramp.com,Hugging Face,https://jobs.lever.co/spotify,https://bunq.recruitee.com - Good board URLs:
job-boards.greenhouse.io/<slug>,jobs.lever.co/<slug>(orjobs.eu.lever.co),jobs.ashbyhq.com/<slug>,apply.workable.com/<slug>,<slug>.recruitee.com,<slug>.jobs.personio.de(or.com) - Bad:
Stripe jobs in London(put places in Locations), the company's own careers page such ashttps://stripe.com/jobs(paste the ATS board URL), a Workable short linkapply.workable.com/j/...(it doesn't contain the account) - Warning: detection uses the board's public slug. When the board publishes a company name (Greenhouse, Workable, Recruitee) that clearly differs from the name you typed, or it is a sandbox/demo account, the board is skipped and listed under
rejectedBoardsinRUN_SUMMARY. For generic names, still checkcompanyNameandboardUrl, or paste the exact board URL. - Warning: companies on Workday, SAP SuccessFactors, iCIMS or an in-house site are not found here. Try our Workday Jobs Scraper or ATS+ Jobs Scraper.
Platforms to check (atsPlatforms)
All 6 by default. If you know your companies use only Greenhouse and Lever, select just those; detection is faster.
Title filters (titleIncludes, titleExcludes, titleKeywords)
titleIncludes keeps a job if its title contains ANY of the words; titleExcludes drops it if the title contains ANY of them. It is a simple, case-insensitive "contains" check. titleKeywords is the older comma-separated version of titleIncludes; both are combined.
- Good: include
engineer,data scientist; excludeinternship,senior - Warning:
internalso matches "International". Useinternshipwhen that matters.
Locations (locations), Remote jobs only (remoteOnly), Posted within (days) (postedWithinDays)
locationskeeps jobs whose location text contains ANY of the words as a whole word or phrase, e.g.London,Germany,US,Remote(case-insensitive;USmatches "Remote - US" but not "Austin"). All locations of the posting, plus country and country code, are checked.remoteOnlykeeps jobs whoseworkModeisremote. Hybrid jobs are not included.postedWithinDayskeeps jobs posted in the last N days, e.g.7. Use1for about the last day.
Max jobs per company (maxJobsPerCompany)
A limit per company, not per run. 0 means no limit. The Console prefill is 20 for a quick test; the default via API, MCP or an AI agent is 20; set 0 for all jobs.
Jobs removed by any filter are not saved, don't count toward the limit and are not charged.
Output and advanced options
descriptionFormat:text(default),html,bothornone.stripContactInfo(default on): removes e-mails and phone numbers from descriptions, so you don't store personal data.proxyConfiguration: off by default. These are public APIs; enable a proxy only if you see blocking errors in the log.onlyNewJobsandmonitorName: see Monitoring mode.
Example input:
{"companies": ["Stripe", "Ramp", "Hugging Face", "https://jobs.lever.co/spotify", "personio.com"],"titleIncludes": ["engineer", "data"],"titleExcludes": ["internship", "senior"],"locations": ["London", "Remote"],"postedWithinDays": 30,"maxJobsPerCompany": 0,"onlyNewJobs": false}
Output
Each job is one item in the run's dataset. Here is one real Ashby item from the prefill run on 2026-10-05 (description shortened). Greenhouse, Lever, Workable, Recruitee and Personio jobs have exactly the same fields.
{"title": "Security Engineer, Cloud","company": "Ramp","companyName": null,"ats": "ashby","jobId": "34413f8d-26bf-4bbc-8ade-eb309a0e2245","url": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245","applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application","location": "New York, NY (HQ)","locations": ["New York, NY (HQ)", "Remote (Canada)", "Remote (US)", "Miami, FL"],"country": "USA","countryCode": null,"workMode": "hybrid","employmentType": "FullTime","department": "Engineering","team": "Backend","seniority": null,"postedDate": "2026-04-07T17:12:35Z","updatedDate": null,"salaryMin": 211400,"salaryMax": 290600,"salaryCurrency": "USD","salaryPeriod": "YEAR","salaryText": "$211.4K - $290.6K","description": "About Ramp\nRamp is building the smart infrastructure for finance teams, embedded in the transaction flow of every dollar a business spends. We…","descriptionHtml": null,"boardUrl": "https://jobs.ashbyhq.com/ramp","scrapedAt": "2026-10-04T23:58:10Z"}
Notes:
- Not every ATS has every field. For example, Greenhouse has no structured salary, team or employment type, and only Greenhouse has
updatedDate. Missing values arenull, so every item has the same columns in CSV and Excel. - Without a structured salary, the Actor looks for a clear range with a currency in the description. Several ranges in the same currency (per level or location) are merged into one
salaryMin–salaryMaxspan; the original text stays insalaryText. workModecomes from the ATS's workplace field when it has one, otherwise from "remote" or "hybrid" in the location or title.
Dataset views
The Output tab has two views of the same data:
| View | What it shows |
|---|---|
| Jobs | A compact table: title, company, ATS, location, work mode, posted date, salary range and URL. Best for a quick look. |
| Full details | Adds the published company name, department, team, employment type, all locations, country code, salary text, description and apply link. |
Every export contains all fields, whichever view you look at. The run also writes a RUN_SUMMARY record to the key-value store: for each company, the ATS and board found, jobs on the board, saved and skipped by filters, the platforms checked, boards skipped because they belong to another company, or a note such as "no job board found".
How to export the data
- In the Console: Output tab > Export > JSON, CSV, Excel, HTML, XML or RSS. You can pick fields and the view.
- Google Sheets: add the Google Sheets integration to the Actor or a schedule (Integrations tab), or use
=IMPORTDATA("https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=csv&token=<TOKEN>"). - API:
https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=json(alsocsv,xlsx,xml). Add&view=overviewfor the compact table.
Pricing
This Actor uses pay per event. You pay $1.25 per 1,000 jobs ($0.00125 per job saved to the dataset), plus Apify's standard Actor start fee of $0.00005 per run. Platform compute is included in the price.
| Example run | Jobs saved | Cost |
|---|---|---|
| Prefill test (Stripe, Ramp, Hugging Face, 20 jobs each) | 48 | about $0.06 |
| 700 jobs (e.g. all open jobs at Stripe) | 700 | about $0.88 |
| 50 companies, 20 jobs each | 1,000 | about $1.25 |
| Daily monitoring, ~50 new jobs per day for 30 days | 1,500 | about $1.88 per month |
What you don't pay for:
- jobs removed by your filters (title, location, remote, posted date),
- jobs already seen in monitoring mode,
- companies where no job board was found,
- postings that failed to parse,
- the
RUN_SUMMARYrecord.
To cap spending, set Max charge per run in the run options; the Actor stops cleanly at that limit and keeps what it saved.
Use it via API
Get your API token in the Apify Console under Settings > API & Integrations. The examples below run the Actor, wait for it to finish and read the jobs.
JavaScript / Node.js (npm install apify-client)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('kadi_bence/ats-jobs-scraper').call({companies: ['Stripe', 'ramp.com', 'https://jobs.lever.co/spotify'],titleIncludes: ['engineer'],locations: ['London', 'Remote'],maxJobsPerCompany: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`${items.length} jobs`, items[0]);
Python (pip install apify-client)
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("kadi_bence/ats-jobs-scraper").call(run_input={"companies": ["Stripe", "ramp.com", "https://jobs.lever.co/spotify"],"titleIncludes": ["engineer"],"locations": ["London", "Remote"],"maxJobsPerCompany": 100,})for job in client.dataset(run["defaultDatasetId"]).iterate_items():print(job["ats"], job["title"], job["location"], job["salaryMin"], job["url"])
cURL (runs the Actor and returns the jobs in one request; best for runs under 5 minutes)
curl -X POST "https://api.apify.com/v2/acts/kadi_bence~ats-jobs-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"companies": ["Stripe", "Ramp", "Hugging Face"], "maxJobsPerCompany": 20}'
Apify CLI
$apify call kadi_bence/ats-jobs-scraper --input '{"companies": ["Stripe", "Ramp", "Hugging Face"], "maxJobsPerCompany": 20}' --output-dataset
MCP server for AI agents (Claude, Cursor, VS Code and other MCP clients)
Add the Apify MCP server with this Actor as a tool. Your client will ask you to sign in to Apify (OAuth), or you can send your token as an Authorization: Bearer YOUR_APIFY_TOKEN header.
{"mcpServers": {"apify": {"url": "https://mcp.apify.com/?actors=kadi_bence/ats-jobs-scraper"}}}
Then ask your agent, for example: "Find all open engineering jobs at Stripe, Ramp and Hugging Face posted in the last 7 days and list the ones with a salary range."
Integrations and scheduling
- Schedules: in the Console go to Schedules > Create new, pick this Actor (or a saved task with your input) and a time, e.g. every day at 07:00. Each run gets its own dataset.
- Webhooks: on the Actor's Integrations tab, add a webhook for "Run succeeded" to send the run and dataset ID to your server.
- Zapier, Make and n8n: use the Apify app or node. Trigger "Actor run finished", then "Get dataset items", then send each job to Slack, e-mail, a CRM or Airtable.
- Google Sheets: the Google Sheets integration appends each run's jobs to a sheet, which is the easiest job-alert setup.
Monitoring mode (only new jobs)
Turn on Only new jobs (onlyNewJobs: true) and schedule the Actor:
- The first run outputs all matching jobs and saves their IDs as a baseline.
- Every later run outputs only jobs that weren't returned before. In monitoring mode, saved jobs have
isNew: true. - You pay only for those new jobs.
The "already seen" list is stored in a named key-value store (ats-jobs-monitor) in your own Apify account, one list per Monitor name and job board (ATS + slug). Filters are not part of the key, so if you run two schedules on the same companies with different filters (e.g. engineers and sales), give them different Monitor names. To start over, use a new monitor name.
Only jobs that were actually output (and charged) are remembered. Jobs cut off by Max jobs per company or Max charge per run come in a later run, and nothing is charged twice.
Other job scrapers by the same developer
All of them use the same output fields where possible, so you can merge datasets.
- Workday Jobs Scraper: every job from company career sites on Workday (myworkdayjobs.com), by company name, with no 2,000-job cap.
- Oracle, Taleo, BambooHR & Rippling Jobs Scraper: nine more applicant tracking systems, including Oracle Recruiting Cloud, Taleo, Teamtailor and Jobvite.
- Germany Jobs Scraper - Arbeitsagentur: 1M+ German job offers from the federal employment agency's Jobbörse.
- Sweden Jobs Scraper - Platsbanken: all Swedish job ads from Arbetsförmedlingen, with an archive since 2016.
- EURES Jobs Scraper: EU job vacancies from 31 countries via the official European Job Mobility Portal.
- Remote Jobs Scraper: remote jobs from RemoteOK, Himalayas, Jobicy and Arbeitnow in one de-duplicated feed.
Related company data for B2B leads: SEC Form D Scraper (startup funding rounds), New Business Filings USA (newly registered companies) and Website Tech Stack Detector (technologies a company uses).
FAQ
How does Greenhouse, Lever & Ashby Jobs Scraper work? Each supported ATS has a public job-board endpoint that returns all open jobs of a board in one response. The Actor turns your company name into likely board slugs, checks each selected ATS, and reads every board it finds. It doesn't use a browser, so it's fast and cheap.
Is there an official Greenhouse, Lever or Ashby jobs API? Yes, each vendor has a public job-board API that companies use to show jobs on their own sites. But each has its own format, and you need to know the board slug. This Actor finds the board for you and returns one schema for all six, through the Apify API.
How many jobs can I get? Is there a limit?
No hidden cap. With maxJobsPerCompany: 0 you get every job the board publishes, and you can list hundreds of companies per run.
How fast is it? The 3-company prefill takes about 15 seconds. A few hundred companies take about a minute.
A company wasn't found, or I get fewer jobs than the careers page shows. Why?
The company may use another system (Workday, SAP SuccessFactors, iCIMS, an in-house site) or its board has an unusual slug. Open the careers page, click a job, and paste the board URL (e.g. https://jobs.lever.co/acme). Fewer jobs usually come from a filter or maxJobsPerCompany; RUN_SUMMARY shows jobs on the board, saved and skipped per company. For generic names, check boardUrl to be sure the right company was matched.
Why is the salary or another field empty?
Many companies don't publish pay. Salary is filled when the ATS has a structured range or the description contains a clear range with a currency. Other fields, like team or countryCode, exist only on some platforms; missing values are null.
Do I need proxies? No. These are public APIs. The proxy option exists only for unusual network setups.
Is it legal to scrape these job boards?
The Actor uses only the public job-board endpoints that these ATS vendors publish so postings can be displayed and shared. It respects robots.txt (including crawl-delay), doesn't log in, and removes e-mails and phone numbers from descriptions by default, so it doesn't collect personal data (GDPR). You are responsible for how you use the data, including the platforms' terms and data-protection law in your country.
Can I use it from Python or another app, and get only new jobs every day? Yes. Use the Apify API, the JavaScript or Python client, the CLI, or the MCP server, as shown in Use it via API. For daily new jobs, turn on Only new jobs and create a schedule; see Monitoring mode.
The run failed or a field is missing. What should I do? Open an issue on the Issues tab with the run link or your input. Fixes usually land within 24–48 hours. See the changelog below for recent changes.
Companies tested by name
These companies were found by typing just their name (tested 2026-10-05):
- Greenhouse: Stripe, Figma, Airbnb, Discord, Coinbase, Anthropic, Databricks, Cloudflare, Duolingo, Reddit, Pinterest, Dropbox
- Ashby: Ramp, Notion, Plaid, OpenAI, Linear
- Lever: Spotify
- Workable: Hugging Face
Related Actors
More low-cost Actors by the same developer, built on official APIs and public data:
- Workday Jobs Scraper — open jobs of any company by name (NVIDIA, Salesforce), plus Greenhouse/Lever fallback
- ATS Jobs Feed — search a daily database of jobs from 1,000+ companies, no crawling wait
- Oracle, Taleo, BambooHR & Rippling Jobs Scraper — jobs from 9 more applicant tracking systems
- Remote Jobs Scraper — remote jobs from We Work Remotely, RemoteOK, Himalayas and more
- EURES Jobs Scraper — EU job vacancies from 31 countries
- Website Tech Stack Detector — CMS, ecommerce, analytics and frameworks of any website
- SEC Form D Scraper — new startup funding rounds from SEC EDGAR
All my Actors: apify.com/kadi_bence
Changelog
- 2026-10-05: Workday fallback: companies not found on the 6 ATS platforms are read from their Workday career site (
atsPlatformsoption "workday", on by default). Jobs are returned newest first. - 2026-10-05: Added title include/exclude filters (
titleIncludes,titleExcludes). Filtered-out jobs are not charged. The oldertitleKeywordstext field still works. - 2026-10-05, 1.0: first public release: auto-detection across 6 ATS platforms, unified schema with salary, title/location/remote/date filters, monitoring mode.