How to scrape Greenhouse, Lever and Ashby jobs (plus Personio, Teamtailor, Recruitee)
Updated 2026-10-08 · Tool used: Greenhouse / Lever / Ashby Jobs Scraper - Personio & more on Apify · Price: $1 per 1,000 jobs; companies without a supported ATS and filtered-out jobs are free
Greenhouse, Lever and Ashby all expose public job-board feeds, but each has a different URL scheme and schema, and you first need to know which ATS a company uses and what its board token is. Doing that for 200 companies by hand takes a day.
This guide shows how to give a list of company websites (e.g. stripe.com) or board URLs and get every open job in one normalized dataset: title, department, locations, country, remote/hybrid, salary where published, posting date and description.
Steps
- List companies as websites, careers URLs, board URLs or
ats:tokenshortcuts likepersonio:kb1. - Add title / location keywords and
postedWithinDaysto keep only relevant jobs (filtered jobs are free). - Schedule it with monitoring mode on to receive only jobs that are new since the previous run.
Example input
{
"companies": [
"stripe.com",
"polestar.com",
"https://jobs.ashbyhq.com/ramp",
"personio:kb1",
"bunq.com"
],
"titleKeywords": [
"engineer",
"developer"
],
"locationKeywords": [
"Germany",
"Remote",
"Amsterdam"
],
"postedWithinDays": 30,
"descriptionFormat": "text"
}
Example output (one item, shortened)
{
"company": "Ramp",
"companyInput": "ramp.com",
"ats": "ashby",
"atsBoard": "ramp",
"jobId": "baf0a4d2-e07e-4f76-af85-d85c91f479a4",
"title": "Senior Manager, Account Manager | Mid-Market",
"department": "Sales",
"team": "Account Manager",
"employmentType": "FullTime",
"seniority": null,
"locations": [
"New York, NY (HQ)",
"San Francisco, CA"
],
"location": "New York, NY (HQ)",
"country": "USA",
"workplaceType": "hybrid",
"salary": {
"min": 290000,
"max": 350000,
"currency": "USD",
"period": "1 YEAR",
"text": "$290K - $350K"
},
"postedAt": "2026-09-23T16:31:53.863Z",
"updatedAt": null,
"url": "https://jobs.ashbyhq.com/ramp/baf0a4d2-e07e-4f76-af85-d85c91f479a4",
"applyUrl": "https://jobs.ashbyhq.com/ramp/baf0a4d2-e07e-4f76-af85-d85c91f479a4/application",
"language": null,
"isNew": null,
"scrapedAt": "2026-10-04T07:15:18.313Z",
"descriptionText": "About Ramp\nRamp is building the smart infrastructure for finance teams, embedded in the transaction flow of every dollar a business spends. We automate how over $200B in annualized spend flows in and out of 70,000+ compa..."
}
Every run's dataset can be downloaded as JSON, CSV, Excel, XML or HTML from the Apify Console, or via https://api.apify.com/v2/datasets/<datasetId>/items?format=csv.
Run it from code
Python
from apify_client import ApifyClient # pip install apify-client
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
"companies": [
"stripe.com",
"polestar.com",
"https://jobs.ashbyhq.com/ramp",
"personio:kb1",
"bunq.com"
],
"titleKeywords": [
"engineer",
"developer"
],
"locationKeywords": [
"Germany",
"Remote",
"Amsterdam"
],
"postedWithinDays": 30,
"descriptionFormat": "text"
}
run = client.actor("tinyrex/ats-jobs-scraper").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)JavaScript / Node.js
import { ApifyClient } from 'apify-client'; // npm i apify-client
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('tinyrex/ats-jobs-scraper').call({
"companies": [
"stripe.com",
"polestar.com",
"https://jobs.ashbyhq.com/ramp",
"personio:kb1",
"bunq.com"
],
"titleKeywords": [
"engineer",
"developer"
],
"locationKeywords": [
"Germany",
"Remote",
"Amsterdam"
],
"postedWithinDays": 30,
"descriptionFormat": "text"
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);curl (no SDK)
# Runs the actor and returns the results directly (CSV here; use format=json for JSON)
curl -X POST "https://api.apify.com/v2/acts/tinyrex~ats-jobs-scraper/run-sync-get-dataset-items?format=csv" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"companies": ["stripe.com", "polestar.com", "https://jobs.ashbyhq.com/ramp", "personio:kb1", "bunq.com"], "titleKeywords": ["engineer", "developer"], "locationKeywords": ["Germany", "Remote", "Amsterdam"], "postedWithinDays": 30, "descriptionFormat": "text"}' > results.csv
Get your API token in Apify Console → Settings → API & Integrations. The free Apify plan includes monthly credit that is enough to try this.
Use it from an AI agent (MCP)
The Apify MCP server exposes this actor as a tool for Claude, Cursor, VS Code, n8n and other MCP clients. Add this to your client's MCP config (or use the OAuth flow at mcp.apify.com instead of a token):
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=tinyrex/ats-jobs-scraper",
"headers": {
"Authorization": "Bearer <YOUR_APIFY_TOKEN>"
}
}
}
}
Then ask in plain language, e.g. "Scrape greenhouse jobs api for this list and give me a table".
Pricing
Pay per result: $1 per 1,000 jobs; companies without a supported ATS and filtered-out jobs are free. You can cap the cost of every run in the run options.
FAQ
Does Greenhouse have a public jobs API?
Yes, Greenhouse's Job Board API (boards-api.greenhouse.io) is public for each company's board. The actor uses it and the equivalent official feeds of Lever, Ashby, Personio, Teamtailor and Recruitee, so no HTML scraping or login is involved.
How do I find which ATS a company uses?
Just pass the company website. The actor scans the site and careers pages for ATS links and checks the company name on each supported ATS.
Can I use it as a hiring signal for sales?
Yes. Monitoring mode returns only new jobs per run, which is a common trigger for outbound (e.g. companies hiring a first data engineer).
Try it on Apify →More guides
- Bulk tech stack lookup: a Wappalyzer / BuiltWith alternative for thousands of domains
- How to export all products from any Shopify store to CSV or JSON
- How to scrape jobs from Workday career sites (myworkdayjobs.com)
- How to export products from any WooCommerce store to CSV or JSON
- How to export EU public tenders from TED (Tenders Electronic Daily) to CSV or JSON
- How to export jobs from the Bundesagentur für Arbeit (Arbeitsagentur) and EURES
- How to scrape remote jobs from Himalayas, Remote OK, We Work Remotely and more in one run
- How to scrape Apple App Store reviews for any app and country (CSV, JSON, API)
- How to export open EU funding calls (Horizon Europe, Digital Europe, cascade funding) to CSV or JSON