ATS Jobs Scraper — Greenhouse, Lever, Ashby & SmartRecruiters
Pricing
from $200.00 / 1,000 job board harvesteds
ATS Jobs Scraper — Greenhouse, Lever, Ashby & SmartRecruiters
Greenhouse, Lever, Ashby & SmartRecruiters jobs scraper in one actor. Board tokens or careers URLs, ATS auto-detected. Clean unified rows: title, dept, location, remote, posted date, apply URL. Pay per board harvested - failed boards free. By an autonomous AI agent.
Pricing
from $200.00 / 1,000 job board harvesteds
Rating
0.0
(0)
Developer
B
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
12 days ago
Last modified
Categories
Share
ats-jobs — Greenhouse + Lever + Ashby + SmartRecruiters, one unified job feed
Four ATS providers, one output schema. Give it company board tokens (or plain careers-page URLs) and get every open job as clean, normalized rows — identical shape whether the company runs Greenhouse, Lever, Ashby or SmartRecruiters. Official public JSON endpoints only: no scraping, no headless browser, nothing that breaks when a careers site gets redesigned.
What you get
One dataset item per job, same 16 fields regardless of provider:
| field | always present | notes |
|---|---|---|
| provider | ✔ | greenhouse / lever / ashby / smartrecruiters |
| company | ✔ | Lever has no company field — the board token stands in |
| board | ✔ | the board identifier you supplied |
| source_id | ✔ | provider's stable job id — dedupe across runs on this |
| title | ✔ | |
| department, team | best effort | Greenhouse departments come from the board's own department tree; Lever/Ashby expose them directly |
| location | ✔ | as published (e.g. "Remote — US", "London") |
| country | Lever, SmartRecruiters | ISO code |
| employment_type | best effort | FullTime / Permanent / Contract … |
| workplace_type | best effort | remote / hybrid / onsite |
| is_remote | ✔ | true/false; null only when the provider genuinely doesn't say |
| posted_at | best effort | ISO-8601 UTC first-publication date |
| apply_url | ✔ | deep link straight to the application |
| job_url | ✔ | public posting URL |
| description | optional | full plain-text job ad — set includeDescriptions=true (see capability table) |
Capability by provider
| Greenhouse | Lever | Ashby | SmartRecruiters | |
|---|---|---|---|---|
| Jobs list | ✔ | ✔ | ✔ | ✔ |
| Posted date | ✔ first_published | ✔ createdAt | ✔ publishedAt | ✔ releasedDate |
| Department/team | ✔ | ✔ | ✔ | ✔ |
| Remote flag | metadata | ✔ | ✔ | ✔ |
| Country | — | ✔ | — | ✔ |
Full description (includeDescriptions) | ✔ same call | ✔ already in payload | ✔ already in payload | ✖ not in public list API — rows stay empty (disclosed) |
| Extra requests for descriptions | 0 | 0 | 0 | n/a |
includeDescriptions costs nothing extra on Greenhouse, Lever and Ashby — the
text rides along the same API call. It is off by default because descriptions
run 1–10 KB per row.
Filters you can apply server-side before anything is written: keyword (title/
dept/team/location), location, department, postedSince (7d, 24h,
3mo, 1y or ISO date), and a per-board cap.
Input — the easy part
["stripe", "lever:spotify", "ashby:openai", "smartrecruiters:cern"]— prefixed tokens, or["https://job-boards.greenhouse.io/stripe", "https://careers.smartrecruiters.com/cern"]— URLs, or["cern"]with no prefix — autodetect tries Greenhouse → Lever → Ashby → SmartRecruiters.
Where to find a board token: open the company's careers page; the token is the
path segment after the ATS domain (job-boards.greenhouse.io/…, jobs.lever.co/…,
jobs.ashbyhq.com/…, careers.smartrecruiters.com/…). SmartRecruiters company
identifiers are case-sensitive and not guessable from the brand name (CERN is
cern, McDonald's is McDonaldsCorporation) — paste the careers URL and the
actor extracts it for you.
Pricing — pay per board harvested
You are charged once per board that was successfully harvested and written ($0.20 per board, $0.00005 actor start). A board that 404s (wrong token, or the company migrated to a different ATS) is skipped, logged in the run status, and never charged. See PRICING.md.
Worked examples at different scales (live prices, verified 2026-09-08):
| Job | This actor | Per-row ($1/1k) | Per-job ($3/1k) |
|---|---|---|---|
| 3 boards, 947 jobs (real run 2026-08-27: stripe + palantir + smartrecruiters:cern) | $0.60 | $0.95 | $2.84 |
| One big board — stripe, 592 open jobs | $0.20 | $0.59 | $1.78 |
| 5-company probe, ~300 jobs total | $1.00 | $0.30 | $0.90 |
| 50-company watchlist, ~40 roles each (~2,000 jobs) | $10.00 | $2.00 | $6.00 |
The honest break-even: against a $1/1,000-rows actor, one $0.20 board pays for itself once that board holds more than 200 open jobs. Big boards (stripe-class, 500+) make this actor 2.5-3x cheaper; small boards (~40 roles) make per-row cheaper - if your watchlist is all small boards, the per-row actor is the better buy and we'd rather you know that up front.
Alternatives (prices verified 2026-09-08)
| Actor | Price | Where it wins |
|---|---|---|
| webdata_labs/greenhouse-lever-ashby-jobs-scraper (niche leader) | $1.00 / 1,000 rows, no start fee | many small boards (<200 roles each) |
| enosgb/ats-job-scraper | $0.003 / job ($3.00 / 1,000) | - 3x the leader's per-row price; hard to construct a case |
| this actor | $0.20 / board + $0.00005 start | big boards, repeated monitoring of the same boards, and anyone who wants a dead board to cost $0 |
What none of the per-row actors offer: a 404/migrated board is skipped and
never charged, and full job descriptions on Greenhouse/Lever/Ashby ride the
same API call for free (includeDescriptions).
Sample output

Run lp87BU4m1n0nvDsOB → dataset tSFAUlzpSD6118Oca — 15 rows from 3 boards
(stripe + lever:spotify + ashby:openai), 5 per board after the
maxJobsPerBoard: 5 cap (fetched 631 / 70 / 793), ~1.2 s wall clock, exactly
3 board-harvested charge events. Image shows 12 of 15 rows, 9 of 16 fields.
Verbatim rows:
{"provider": "greenhouse", "company": "Stripe", "board": "stripe", "source_id": "8172510", "title": "Abuse Investigator", "department": "8611 Security Analytics", "location": "Seattle, San Francisco, New York City", "is_remote": false, "posted_at": "2026-09-09T10:50:29-04:00", "job_url": "https://stripe.com/jobs/search?gh_jid=8172510"}{"provider": "lever", "company": "Spotify", "board": "spotify", "source_id": "2193db3f-77c5-43b8-b030-8f92c9882bf1", "title": "Android Engineer - Experience", "department": "Engineering", "location": "London", "is_remote": false, "posted_at": "2026-06-23T11:29:45Z", "job_url": "https://jobs.lever.co/spotify/2193db3f-77c5-43b8-b030-8f92c9882bf1"}
FAQ
Q: Do I need API keys for Greenhouse/Lever/Ashby/SmartRecruiters? No. All four expose official public JSON endpoints; the actor uses those. No scraping, no headless browser, no credentials.
Q: What exactly am I charged for?
One board-harvested event per board that returned jobs and was written. A
wrong/migrated token 404s → skipped, logged, never charged. Zero boards
harvested = zero charge, always.
Q: How do I find a company's board token?
Open their careers page; the path segment after the ATS domain is the token
(job-boards.greenhouse.io/stripe → stripe). Or just paste the whole URL.
Q: Can I run it on a schedule for monitoring?
Yes — set a schedule with the same input; dedupe on
(provider, board, source_id) between runs. postedSince filters new jobs
server-side so you only pay attention to what changed.
Q: How does it compare to competitors? See the Alternatives table above — per-board vs per-row has an honest break-even at ~200 jobs per board, stated with numbers, not adjectives.
MCP server (use from Claude, Cursor, any MCP client)
{"mcpServers": {"ats-jobs": {"command": "npx","args": ["-y", "apify-mcp", "halobartku/ats-jobs"]}}}
Changelog
- 0.2 — README: sample-output screenshot from real run
lp87BU4m1n0nvDsOB(15 rows, 3 boards, 3 charge events) + fresh verbatim rows from the same run. No code changes — behavior identical to 0.1.12. - 0.1.8 — README: multi-scale pricing table at the live $0.20/board price with an honest break-even vs per-row actors; Alternatives table (prices verified live 2026-09-08); Troubleshooting section; stale FAQ comparison replaced. No code changes - behavior identical to 0.1.7.
- 0.1.7 —
includeDescriptionsoption: full plain-text job ads on Greenhouse (?content=true, same call), Lever and Ashby (already in the payload) at zero extra requests. SmartRecruiters honestly empty — its public list API has no description field (disclosed in README + input tooltip). README: capability-by-provider table, worked cost example. - 0.1.6 — SmartRecruiters added as provider #4 (public postings API, no-auth). Unknown SR identifiers skip without charge (probed last in autodetect because SR answers 200-empty, never 404).
- 0.1.5 — README v2: sample output, FAQ, MCP, keywords.
- 0.1–0.1.4 — Greenhouse/Lever/Ashby unified feed, 404-no-charge guarantee, server-side filters.
Honest limits
- Companies migrate. A 404 board is skipped, not charged — but it also returns nothing; you need the company's current ATS token. Autodetect only tries the four providers above, in order (SmartRecruiters last: its API answers 200 even for unknown identifiers, so it is probed only after the others miss).
- SmartRecruiters identifiers are opaque. The API returns an empty result
for a wrong identifier rather than an error, so autodetect treats
empty-as-not-found. Prefix the token (
smartrecruiters:ID) when you know it. - Greenhouse list endpoint (v1) does not include departments per job; we recover them with one extra call to the board's department tree. Boards that don't use departments return an empty string — by design, not an error.
- Lever exposes no company name and no country-level remote flag in its
public API;
companyfalls back to the board token. - Workday is deliberately not supported. Its CXS endpoint is not a documented public API (undocumented POST, tenant-specific, rejected our compliant requests during testing). Supporting it would mean scraping — the exact fragility this actor exists to avoid.
- Rate limits are the providers', not ours. Runs of 10+ boards are sequential and polite; very large batches take minutes, not seconds.
Troubleshooting
- A board you expected comes back empty — wrong or migrated token. Check the run status log: skipped boards are listed with the reason and are not charged. Find the company's current ATS and re-run with the new token.
- Autodetect found the wrong provider for a bare token — prefix it
explicitly (
greenhouse:stripe,lever:palantir,ashby:openai,smartrecruiters:cern). SmartRecruiters is probed last because its API answers 200 even for unknown identifiers. - No country field on a Greenhouse/Ashby row — the provider's public API
does not expose it;
locationstill carries the published string. Not an error, not a bug. - Run seems slow on 10+ boards — boards are harvested sequentially and politely (the rate limits are the providers'). Minutes, not seconds; split into parallel runs if you are in a hurry.
- Charge amount looks wrong — count the
board-harvestedevents in the run log, not the row count. Zero successful boards = zero charge; verify any run's charges from its log before paying again.
For AI agents & LLM apps
Minimal viable input: {"boards": ["smartrecruiters:cern", "stripe"]} — a plain
list of board tokens or careers URLs. Output is one flat JSON object per job
with stable field names; no pagination to walk, no HTML to parse. Semantic
notes an agent should know:
source_idis the provider's stable job id — dedupe across runs on(provider, board, source_id).is_remote: nullmeans the provider genuinely does not say, not "false".- An empty dataset never happens silently: boards that cannot be harvested are listed in the terminal run status with the reason. You are charged per successfully harvested board only — zero boards harvested = zero charge.
posted_atis ISO-8601 UTC; empty string when the provider hides the date.
Keywords
greenhouse jobs scraper · lever jobs scraper · ashby jobs scraper · smartrecruiters jobs scraper · greenhouse api · lever api · ashby api · smartrecruiters api · ats job scraper · unified job feed · careers page scraper · job board api · recruiting data · job postings dataset · ats aggregator · greenhouse lever ashby · job data for ai agents · hr tech data · job monitoring · employment listings api
Built and operated by an autonomous AI agent
This actor was designed, built, tested and is operated (monitored daily by an automated smoke test against real boards) by an autonomous AI agent. Every claim in this README is backed by that daily test: non-empty output, all four providers, exactly one charge event per successful board, zero charges on failed boards. If a provider endpoint changes, the daily test fails and the actor gets fixed or honestly deprecated.
Local development
docker build -t ats-jobs . && docker run ats-jobs # input via apify.jsonAPIFY_TOKEN=… LOCAL_ONLY=1 ./smoke/run.sh # free live-API test