Job Postings Scraper - Greenhouse, Lever & Ashby (Multi-ATS)
Pricing
from $0.40 / 1,000 jobs
Job Postings Scraper - Greenhouse, Lever & Ashby (Multi-ATS)
Scrape live job postings from any Greenhouse, Lever, or Ashby careers board by slug, URL, or auto-detect. Returns title, location, department, employment type, remote flag, salary, apply URL and dates. Built-in keyword, location, department and remote filters. HTTP-first, no auth, no anti-bot.
Pricing
from $0.40 / 1,000 jobs
Rating
0.0
(0)
Developer
Actor stats
0
Bookmarked
3
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Pull live job openings from any company that hires on Greenhouse, Lever, or Ashby. Give it a company slug, paste a careers-board URL, or let it auto-detect the platform for you. Every posting comes back as one clean, normalized row no matter which ATS it came from: title, location, department, team, employment type, remote flag, salary (where the ATS exposes it), the listing and apply URLs, created/updated dates, and the full description in both plain text and HTML. Export as JSON, CSV, or Excel.
It calls each ATS's own public job-board API directly instead of driving a headless browser, so it's fast, needs no login, and doesn't trip anti-bot. Mix as many boards and ATS types as you want in a single run.
Three ways to point it at a board
You can put any of these in the sources array, and mix them freely:
- Explicit object โ
{ "ats": "greenhouse", "company": "stripe" } - Pasted board URL โ
"https://jobs.lever.co/spotify"or"https://boards.greenhouse.io/stripe"(the ATS and slug are read straight out of the URL) - Bare company slug โ
"ramp"(the actor probes Greenhouse, Lever, and Ashby and uses whichever one has a board)
The company slug is the identifier in the careers-page URL: boards.greenhouse.io/stripe, jobs.lever.co/spotify, jobs.ashbyhq.com/ramp.
Underlying endpoints:
greenhouseโboards-api.greenhouse.io/v1/boards/{company}/jobsleverโapi.lever.co/v0/postings/{company}ashbyโapi.ashbyhq.com/posting-api/job-board/{company}
Filters
Narrow the run before anything is billed โ filtered-out rows never cost you a thing:
titleKeywordโ title must contain this textlocationKeywordโ location must contain this textdepartmentโ department or team must contain this textremoteOnlyโ keep only jobs detected as fully remote
Input
| Field | Type | Description |
|---|---|---|
sources | array | Board objects {ats, company}, board URLs, or bare slugs (any mix). Required. |
titleKeyword | string | Keep only jobs whose title contains this (case-insensitive). |
locationKeyword | string | Keep only jobs whose location contains this (case-insensitive). |
department | string | Keep only jobs whose department or team contains this (case-insensitive). |
remoteOnly | boolean | Keep only fully-remote jobs. |
maxItems | integer | Stop after this many rows across all boards (0 = no limit). |
impersonate | string | Browser TLS fingerprint (chrome by default). |
{"sources":[{"ats":"greenhouse","company":"stripe"},"https://jobs.lever.co/spotify","ramp"],"titleKeyword":"engineer","remoteOnly":true,"maxItems":500}
Output fields
One row per posting. A check means the field is populated when that ATS provides it; otherwise it's null.
| Field | Type | Greenhouse | Lever | Ashby |
|---|---|---|---|---|
source_ats | string | โ | โ | โ |
company | string | โ | โ | โ |
job_id | string | โ | โ | โ |
global_id | string {ats}:{company}:{job_id} | โ | โ | โ |
title | string | โ | โ | โ |
location | string | โ | โ | โ |
department | string | โ | โ | โ |
team | string | โ | โ | โ |
employment_type | string | โ | โ | โ |
remote | boolean | inferred | โ | โ |
remote_type | remote/hybrid/onsite | inferred | โ | โ |
salary | string | โ | when set | when set |
url | string (listing) | โ | โ | โ |
apply_url | string | โ | โ | โ |
created_at | ISO 8601 | โ | โ | โ |
updated_at | ISO 8601 | โ | โ | when set |
posted_at | ISO 8601 | โ | โ | โ |
scraped_at | ISO 8601 | โ | โ | โ |
description | plain text | โ | โ | โ |
description_html | HTML | โ | โ | โ |
global_id is stable across runs, so you can diff datasets or join against your own systems. Greenhouse's board API has no employment-type, team, or salary, no explicit remote flag, and no separate apply endpoint โ remote/remote_type there are inferred from the location and title text (treat them as best-effort for that source), and apply_url is null since the listing url is the only link Greenhouse exposes.
Example output
{"source_ats":"lever","company":"spotify","job_id":"88499546-e9f7-4403-87a5-240050bd7c5b","global_id":"lever:spotify:88499546-e9f7-4403-87a5-240050bd7c5b","title":"Accounts Payable Analyst","location":"New York, NY","department":"Finance","team":"Accounting","employment_type":"Permanent","remote":false,"remote_type":"hybrid","salary":null,"url":"https://jobs.lever.co/spotify/88499546-e9f7-4403-87a5-240050bd7c5b","apply_url":"https://jobs.lever.co/spotify/88499546-e9f7-4403-87a5-240050bd7c5b/apply","created_at":"2026-05-11T11:20:11.285000+00:00","updated_at":null,"posted_at":"2026-05-11T11:20:11.285000+00:00","scraped_at":"2026-06-24T09:15:02.110000+00:00","description":"Spotify is looking for an Accounts Payable Analyst ..."}
Why this one
- One shape for every ATS. Greenhouse, Lever, and Ashby each return a different JSON structure; this maps all of them to the same fields, so you can dump multiple companies into one dataset and not care where each row came from.
- Paste a URL or just a name. No need to know which ATS a company uses โ paste the careers link or the bare slug and it figures the rest out.
- Nothing fails silently. A wrong slug, a failed request, or an API that changes shape gives you a typed error row (
fetch_failed,parse_failed,invalid_source,invalid_input) instead of a quietly empty run. One bad board never aborts the rest, but if every source fails the run is marked failed (not a green empty dataset), and a rate-limit/anti-bot block (HTTP 403/429/5xx) is reported as a block rather than a false "no board found". - You're billed per valid posting delivered, so error rows, duplicates, and rows you filter out don't cost you anything.
- Duplicates are removed within a run, per ATS, by job id.
Notes
Only public, unauthenticated job-board APIs are used โ the same data these companies publish on their own careers pages. Follow each provider's Terms and the laws that apply to you, and use the data responsibly.
Who built this
I build scrapers for my own projects and publish the ones that turn out genuinely useful. This is one of them. If you need a custom scraper, a data pipeline, or a change to this actor, I'm available for freelance work.
GitHub: github.com/bujhmml ยท Site: bujhmml.fun
