ATS Jobs Scraper - Greenhouse, Lever & Ashby Boards
Pricing
Pay per usage
ATS Jobs Scraper - Greenhouse, Lever & Ashby Boards
Pull every open job from any company's Greenhouse, Lever or Ashby board in one schema, or give it company domains and let it discover which ATS and board token they use.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Bora Sipahi
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Most companies do not run their own job site. They rent one from an applicant tracking system, and the three most common for technology and growth companies, Greenhouse, Lever and Ashby, all publish every open job through a public, keyless JSON API. ATS Jobs Scraper reads those APIs and returns every job in one consistent schema, whichever system the company uses.
It also solves the part nobody else sells: finding the board in the first place. Give it company domains and it visits their careers pages, probes all three APIs, and tells you which ATS and which board token each company uses. That index is cached, so you pay for a discovery once and reuse it for free on every later run.
No proxies, no browser, no login. A run over three boards with a thousand jobs finishes in seconds.
Two ways to use it
Boards you already know. Fill Boards with the system and token from the board URL:
boards.greenhouse.io/stripeis{"ats": "greenhouse", "token": "stripe"}jobs.lever.co/veevais{"ats": "lever", "token": "veeva"}jobs.ashbyhq.com/rampis{"ats": "ashby", "token": "ramp"}
Companies you only know by website. Fill Company domains with ["stripe.com", "ramp.com"]. The Actor resolves each domain to its board, then fetches the jobs. Turn on Discover only to get just the board list without the jobs.
Then filter with Search query, Departments, Locations, Remote only and Posted within (days), and download the dataset as JSON, CSV or Excel. For a daily feed of only new postings, turn on Incremental mode and add a Schedule.
Output
Every job row has the same fields regardless of system:
| Field | Meaning |
|---|---|
ats, boardToken, companyName, companyDomain | Where the job came from |
jobId, requisitionId | Stable ids, e.g. greenhouse:stripe:8172508 |
title, department, team, employmentType | Basics; employment type is normalised to full-time, part-time, contract, internship |
locationName, locationCountry, isRemote | Location as published plus a remote flag |
minSalary, maxSalary, currency | When the board publishes a range (Lever and Ashby do for many jobs, Greenhouse for some) |
descriptionSnippet | First 300 characters of the description, always included |
descriptionHtml, descriptionText | The full text, only when Include full description is on |
applyUrl, canonicalUrl | Deep links to the official listing and application form |
publishedAt, updatedAt | ISO timestamps |
aiDisclaimer, aiOptOutRequestUrl | Greenhouse's automated-decision disclosure fields, carried through unchanged |
scrapedAt | Run timestamp |
In Discover only mode each row is a board: companyDomain, ats, boardToken, boardUrl, jobCount, companyName, discoveredVia.
Pricing
Three events, all listed on the Pricing tab:
job-listing, once per job row saved. Filtered-out, duplicate and already-delivered jobs are never charged.job-detail, once per job row when Include full description is on. Off by default.board-discovered, once per board found for a company domain. Cached boards and boards you supply yourself are free.
Set Maximum jobs to cap a run. No platform usage is passed on to you.
Input example
{"companyDomains": ["stripe.com", "ramp.com", "zoox.com"],"searchQuery": "engineer, developer","remoteOnly": true,"postedWithinDays": 14,"includeFullDescription": false,"maxItems": 500}
Output example
{"ats": "lever","boardToken": "zoox","companyName": "Zoox","jobId": "lever:zoox:f4746da4-8eb8-43e2-b7ce-bf3c7cf9640d","title": "Autonomy System Test Engineer","department": "Software","team": "Software Quality Assurance","employmentType": "full-time","locationName": "Foster City, CA","locationCountry": "US","isRemote": false,"minSalary": 144000,"maxSalary": 193000,"currency": "USD","descriptionSnippet": "Zoox is building the first ground-up, fully autonomous vehicle fleet...","applyUrl": "https://jobs.lever.co/zoox/f4746da4-8eb8-43e2-b7ce-bf3c7cf9640d/apply","canonicalUrl": "https://jobs.lever.co/zoox/f4746da4-8eb8-43e2-b7ce-bf3c7cf9640d","publishedAt": "2026-08-12T16:02:11.000Z","scrapedAt": "2026-09-07T00:30:00.000Z"}
Data sources and what we do with them
All three vendors document their job board endpoints as public, unauthenticated read APIs. The Actor only reads listed, open postings; it never touches applications, candidates or anything behind a login. Job descriptions are the employer's text, so the full description is opt-in and every row deep-links to the official listing and apply page. Recruiter e-mail addresses and phone numbers pasted into descriptions are removed by default. Greenhouse's AI-disclosure fields are passed through so downstream users who need them for local hiring law can keep them.
Workday is deliberately not included: it has no documented public API and blocks datacenter traffic.
Related Actors
- Pair with a Slack or e-mail integration and Incremental mode for a daily "new jobs at these companies" digest.
- Use Discover only to build a company-to-ATS index once and feed the tokens into any other tooling you run.
FAQ
Discovery found nothing for a domain. The company either uses a different ATS (Workday, SmartRecruiters, iCIMS, a custom site) or embeds the board in a way the careers page does not expose. Supply the board token directly if you know it.
Why are salaries empty for a company? The board only exposes salary when the employer publishes one. Lever and Ashby expose a structured range when present, Greenhouse exposes pay ranges on some boards.
Is the same job across two boards deduplicated? Within a run each job id is delivered once. The same role posted on two different systems is rare; if you need cross-system deduplication, use the title and companyName fields downstream.
Something broke? Open an issue on the Actor's Issues tab. The three APIs are checked several times a day and the Actor is updated when a vendor changes its payload.