ATS Job Scraper: Greenhouse, Lever, Ashby, Workable, Recruitee
Pricing
from $1.00 / 1,000 job returneds
ATS Job Scraper: Greenhouse, Lever, Ashby, Workable, Recruitee
Returns open jobs from career boards on Greenhouse, Lever, Ashby, Workable and Recruitee in one normalized JSON format: title, department, location, country, remote/hybrid/onsite, employment type, salary range, posted date, job and apply URLs, plain-text description. Filter by title keywords.
Pricing
from $1.00 / 1,000 job returneds
Rating
0.0
(0)
Developer
OpenQuarry
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
16 days ago
Last modified
Categories
Share
Returns the open jobs on companies' career boards hosted by Greenhouse, Lever, Ashby, Workable and Recruitee, all in one normalized JSON format. Each job comes with its title, department, location, country, remote/hybrid/onsite status, employment type, salary range, posted date, job and apply URLs, and the description as plain text. Give it a list of board URLs, optionally with title keywords. It reads each ATS's public job-board API, so you don't need a login, proxy or API key.
What you get
You get one dataset item per job. All 22 fields are present on every item, in the same order. A field is null (or []) when the ATS doesn't provide it.
| Field | Type | Description |
|---|---|---|
ats | string | greenhouse, lever, ashby, workable or recruitee |
companySlug | string | Company identifier from the board URL, e.g. stripe |
companyName | string or null | Company name as the employer publishes it |
jobId | string | The ATS's own ID for the job |
title | string | Job title as published |
department | string or null | Department or team |
location | string or null | Main location as published, e.g. New York, NY or Remote (US) |
allLocations | string[] | Every location listed for the job, main location first |
countryCode | string or null | ISO 3166-1 alpha-2 code of the main location, e.g. US |
workplaceType | string or null | remote, hybrid or onsite |
employmentType | string or null | full_time, part_time, contract, internship or temporary |
salaryMin | number or null | Lowest base pay in the published range |
salaryMax | number or null | Highest base pay in the published range |
salaryCurrency | string or null | Currency of the pay range, e.g. USD |
salaryPeriod | string or null | year, month, week, day or hour |
salaryText | string or null | The employer's own pay summary, e.g. $211.4K – $290.6K • Offers Equity |
postedAt | string or null | When the job was published (ISO 8601, UTC) |
updatedAt | string or null | When the job was last updated (ISO 8601, UTC) |
jobUrl | string | Public job posting page |
applyUrl | string | Application page (same as jobUrl when the ATS has no separate one) |
descriptionText | string or null | Full job description as plain text; null when includeDescription is off |
sourceUrl | string | The input URL this job came from |
workplaceType, employmentType and salaryPeriod take their values only from the ATS's own fields. They are never guessed from the description text, so you can filter on them reliably.
Which fields each ATS fills
Each ATS's public API publishes different fields. This table shows which fields can be filled for each one. Salary appears only when the employer publishes it.
| Field | Greenhouse | Lever | Ashby | Workable | Recruitee |
|---|---|---|---|---|---|
companyName | ✓ | – | – | ✓ | ✓ |
countryCode | – | ✓ | ✓ | ✓ | ✓ |
workplaceType | – | ✓ | ✓ | remote only | ✓ |
employmentType | – | ✓ | ✓ | ✓ | ✓ |
| Salary range | – | ✓ | ✓ | – | ✓ |
salaryText | – | ✓ | ✓ | – | – |
updatedAt | ✓ | – | – | – | ✓ |
Input
{"urls": ["https://boards.greenhouse.io/stripe","https://jobs.lever.co/palantir","https://jobs.ashbyhq.com/ramp"],"titleKeywords": ["engineer", "data scientist"],"maxJobsPerCompany": 100,"includeDescription": true}
-
urls(required): career board URLs. A job URL on the board works too, and so does the board's API URL. These formats are recognized:ATS URL formats Greenhouse boards.greenhouse.io/{company},job-boards.greenhouse.io/{company},boards.greenhouse.io/embed/job_board?for={company}Lever jobs.lever.co/{company},jobs.eu.lever.co/{company}(EU accounts)Ashby jobs.ashbyhq.com/{company}Workable apply.workable.com/{company},{company}.workable.comRecruitee {company}.recruitee.comhttps://is optional. If the same board appears twice, it's fetched once. -
titleKeywords: return only jobs whose title contains at least one of these words or phrases. Matching ignores case and works at word starts, soengineermatches "Engineering Manager", butAIdoesn't match "Retail". Leave it empty to get every job. -
maxJobsPerCompany: the most jobs returned for each board, counted after the title filter (default 100;0means no limit). -
includeDescription: include the full description indescriptionText(defaulttrue). Turn it off when you only need titles, locations and links. Results get much smaller.
Sample output
The descriptions are shortened here.
[{"ats": "ashby","companySlug": "ramp","companyName": null,"jobId": "34413f8d-26bf-4bbc-8ade-eb309a0e2245","title": "Security Engineer, Cloud","department": "Engineering","location": "New York, NY (HQ)","allLocations": ["New York, NY (HQ)", "Remote (Canada)", "Remote (US)", "Miami, FL"],"countryCode": "US","workplaceType": "hybrid","employmentType": "full_time","salaryMin": 211400,"salaryMax": 290600,"salaryCurrency": "USD","salaryPeriod": "year","salaryText": "$211.4K – $290.6K • Offers Equity","postedAt": "2026-04-07T17:12:35.753Z","updatedAt": null,"jobUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245","applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application","descriptionText": "ABOUT RAMP\n\nRamp is building the smart infrastructure for finance teams...","sourceUrl": "https://jobs.ashbyhq.com/ramp"},{"ats": "greenhouse","companySlug": "stripe","companyName": "Stripe","jobId": "8172503","title": "Abuse Research Engineer","department": "8611 Security Analytics","location": "Remote from the US","allLocations": ["Remote from the US"],"countryCode": null,"workplaceType": null,"employmentType": null,"salaryMin": null,"salaryMax": null,"salaryCurrency": null,"salaryPeriod": null,"salaryText": null,"postedAt": "2026-09-09T14:52:09.000Z","updatedAt": "2026-09-25T20:45:00.000Z","jobUrl": "https://stripe.com/jobs/search?gh_jid=8172503","applyUrl": "https://stripe.com/jobs/search?gh_jid=8172503","descriptionText": "Who we are\n\nAbout Stripe\n\nStripe is a financial infrastructure platform for businesses...","sourceUrl": "https://boards.greenhouse.io/stripe"}]
Use cases
- Job aggregators and niche job boards: pull fresh postings from a list of target employers in one format, whichever ATS each one uses.
- Hiring signals for sales and investors: track which companies are hiring, for which teams and where, as a growth signal.
- Salary research: collect published pay ranges by title, location and company.
- Recruiting and job search: watch a shortlist of companies for new roles that match your keywords. Run it on a schedule and compare
jobIds between runs. - AI agents: one call returns structured, filterable jobs from many companies, with no HTML to parse.
How it handles problems
The run never fails because one board is broken. Jobs from the other boards are still returned, and the run's status message lists every input that produced no jobs, with the reason:
board not found (HTTP 404), check the company name in the URL: the company slug is wrong, or the company has left that ATS.not a Greenhouse, Lever, Ashby, Workable or Recruitee board URL: the input isn't in one of the formats above.no open jobs on this board: the board exists but lists no jobs right now.no job titles matched titleKeywords: the board has jobs, but none match your keywords.
Network errors, rate limits (HTTP 429) and server errors are retried twice with backoff, and each request times out after 30 seconds.
Limits
- Custom career domains aren't supported.
stripe.com/jobswon't work, but the company's ATS board (boards.greenhouse.io/stripe) will. To find it, open any job on the company's careers page and look for agreenhouse.io,lever.co,ashbyhq.com,workable.comorrecruitee.comlink. - The Actor doesn't look up companies by name. You need each company's board URL.
- Greenhouse publishes less. Its public API has no pay, country, remote status or employment type, so those fields are
nullfor Greenhouse jobs. Thelocationtext often says "Remote" anyway. - Only jobs the employer shows publicly are returned. Unlisted Ashby jobs are skipped, and pay is hidden when the employer hides it on its own board.
- No personal data is added. The Actor never extracts or adds contact names or emails. Recruitee's per-job reply inbox and screening questions are dropped. Descriptions are passed through as published.
- Other ATSs aren't supported: SmartRecruiters, Workday, BambooHR, Personio, Teamtailor and others.
- Big boards: some employers list 1,000+ jobs. The default limit of 100 per company keeps runs to a few seconds. With no limit, a run over several large boards takes longer and costs more.
Pricing
Pay per result: $1.00 per 1,000 jobs returned (all 718 jobs on Stripe's board cost about $0.72). Apify adds a small start fee of $0.00005 per run. Boards that return no jobs cost you nothing beyond that start fee. To cap spending, use maxJobsPerCompany, titleKeywords or the run's maximum cost setting. The Actor stops cleanly when your limit is reached.
Changelog
- 0.1 (2026-10): First release. Supports Greenhouse, Lever, Ashby, Workable and Recruitee.