ATS Jobs Scraper & API - Lever, Greenhouse, Workable, Recruitee
Pricing
$2.00 / 1,000 job postings
ATS Jobs Scraper & API - Lever, Greenhouse, Workable, Recruitee
ATS jobs scraper: public job postings from Lever, Greenhouse, Workable and Recruitee boards in one schema, with salary, remote flags and dedup. No login.
Pricing
$2.00 / 1,000 job postings
Rating
0.0
(0)
Developer
Ahmed Fouad
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
ATS Jobs Scraper & API - Lever, Greenhouse, Workable, Recruitee
This ATS jobs scraper collects public job postings from Lever, Greenhouse, Workable and Recruitee into one consistent dataset. Use ATS-hosted careers URLs or { "ats": "lever", "token": "palantir" } pairs. This is a public job-board API collector—not an applicant search, employee directory, global job search index, or browser scraper.
The Actor checks current robots.txt before each API origin, uses plain HTTP with polite delays, and does not use proxies, login sessions, CAPTCHA solving, or access-control workarounds. Source references: Lever, Workable, Recruitee, and Greenhouse.
Why use a unified ATS jobs feed?
Build job dashboards, monitor hiring demand, synchronize an internal opportunity database, or research published job descriptions. One schema replaces four separate integrations. Apify provides scheduled runs, API access, monitoring, integrations, and dataset exports.
Features include title/location filters, remote filtering, source update-date filtering, run-level deduplication, per-board and global result limits, and optional cross-run saved-ID tracking. No applicant records or separate recruiter contact fields are collected.
What data can this ATS jobs scraper extract?
| Field | Type | Meaning |
|---|---|---|
ats, company, boardToken | string | Source ATS and company name or board token |
jobId, title | string | Source identifier and published title |
departments | array | Source departments/teams |
location, locations | string / array | Published location labels |
remote | boolean / null | Fully remote indicator when the feed exposes one |
employmentType | string / null | Original employment category |
postedAt, updatedAt | ISO string / null | Source dates, not extraction-time substitutes |
url, applyUrl | string / null | Public posting and application page |
descriptionText, descriptionHtml | string | Description, including available requirement sections |
salary | object / null | Structured salary range when the API publishes one |
scrapedAt | ISO string | Extraction timestamp |
Missing data remains null. Salary figures embedded only in prose remain in the description; no salary is invented. Source field availability differs: Workable and Lever often lack update dates, Greenhouse often lacks employment type and explicit remote status. Lever postedAt uses the source creation timestamp. Company names fall back to the token where a feed omits the name. Greenhouse application links use the posting page. Raw HTML is untrusted; sanitize before rendering.
How to scrape public ATS jobs
- Start with defaults to collect 20 current Stripe jobs from Greenhouse.
- Replace
boardswith company URLs or explicit ATS/token pairs. - Set filters and limits, then run.
- Download the dataset in various formats such as JSON, HTML, CSV, or Excel, or use the API tab.
{"boards": ["https://jobs.lever.co/palantir","https://apply.workable.com/huggingface/","https://bunq.recruitee.com/","https://job-boards.greenhouse.io/stripe"],"maxResults": 100,"maxResultsPerBoard": 25,"remote": "all"}
ATS detection supports those ATS-hosted board URLs and the corresponding API URLs. Arbitrary custom career domains, links embedded in custom websites, Lever EU boards, Ashby, and SmartRecruiters are not supported in this release. Ashby's API origin returned HTTP 401 for robots.txt; SmartRecruiters' API robots.txt disallowed general crawlers. Neither is fetched by this Actor. Requests fail closed when robots rules cannot be obtained (except 404/410), disallow access, or endpoints deny access. Standard robots redirects are followed only to HTTPS hosts resolving publicly; API redirects are not followed.
How much does scraping ATS jobs cost?
First 25 jobs of every run are free; after that, $2 per 1,000 jobs. One result = one job posting saved.
First 25 jobs of every run are free; after that, pay $2 per 1,000 saved jobs (result event, $0.002/job). The Pricing tab is authoritative. Filtered and duplicate jobs are not charged as results. After the free prefix, the Actor checks the remaining charge allowance before fetching/saving and stops at the reported charge limit. Account plan terms and any separately displayed platform charges still apply.
Input and advanced options
See the input tab for full configuration options. Up to 20 boards are accepted. maxResults is global; maxResultsPerBoard keeps a large first company from consuming the entire budget. Requests have a minimum one-second interval and respect published crawl delays.
titleContains and locationContains are case-insensitive substrings. updatedSince is inclusive and applies strictly to updatedAt; records with no update timestamp are excluded rather than treating publication as an update. remote: "only" requires true, while "exclude" requires false; unknown remote values match only "all". Hybrid is not classified as fully remote.
For incremental mode, create a dedicated Apify key-value store, select it in incrementalStoreId, and set incremental: true. The input grants read/write access only to that selected store. Its SEEN record remembers ATS + board + job ID for jobs actually saved. Reuse that store on later scheduled runs. Use sequential runs: concurrent runs can race when updating shared state. Existing job IDs are suppressed even if their descriptions change. Clear SEEN or use a new store to reset. IDs are retained without automatic expiry; periodically rotate the store for very large histories. Without incremental mode, deduplication is within the current run only. A platform interruption between a dataset write and its checkpoint can cause an at-least-once replay; transactional exactly-once delivery is not promised.
Output example
Illustrative format, not a claim that this particular job exists:
{"ats": "lever","company": "example-company","boardToken": "example-company","jobId": "00000000-0000-0000-0000-000000000001","title": "Software Engineer","departments": ["Engineering"],"location": "Remote","locations": ["Remote"],"remote": true,"employmentType": "Full-time","postedAt": "2026-01-15T12:00:00.000Z","updatedAt": null,"url": "https://jobs.lever.co/example-company/00000000-0000-0000-0000-000000000001","applyUrl": "https://jobs.lever.co/example-company/00000000-0000-0000-0000-000000000001/apply","descriptionText": "Build useful products.","descriptionHtml": "<p>Build useful products.</p>","salary": null,"scrapedAt": "2026-01-16T12:00:00.000Z"}
The default key-value store contains SUMMARY with per-board counts, errors and stop reason, plus STATE for recovery. Partial success is possible: a failed board is recorded while other boards continue. A run fails if no jobs were saved and board errors occurred; zero matching jobs with no source errors is a valid success.
FAQ and responsible use
Why did a board return no jobs?
Check the board token, source availability, filter settings, incremental history, and SUMMARY. ATS providers or companies may close boards or change policies. This Actor does not bypass a 401, 403, CAPTCHA, or robots prohibition.
Does this collect applicant or employee data?
No applicant APIs, application submissions, private profiles, or employee records are requested. Public job descriptions can contain incidental contact details supplied by the employer. You are responsible for a lawful purpose, source terms, and applicable privacy rules such as GDPR; consult legal counsel if unsure. No contact-enrichment fields are produced.
Use the Issues tab for reproducible problems and the API tab for programmatic access. Include the board URL and run ID, not credentials or applicant information.