ATS Jobs Scraper & API - Lever, Greenhouse, Workable, Recruitee avatar

ATS Jobs Scraper & API - Lever, Greenhouse, Workable, Recruitee

Pricing

$2.00 / 1,000 job postings

Go to Apify Store
ATS Jobs Scraper & API - Lever, Greenhouse, Workable, Recruitee

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

Ahmed Fouad

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

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?

FieldTypeMeaning
ats, company, boardTokenstringSource ATS and company name or board token
jobId, titlestringSource identifier and published title
departmentsarraySource departments/teams
location, locationsstring / arrayPublished location labels
remoteboolean / nullFully remote indicator when the feed exposes one
employmentTypestring / nullOriginal employment category
postedAt, updatedAtISO string / nullSource dates, not extraction-time substitutes
url, applyUrlstring / nullPublic posting and application page
descriptionText, descriptionHtmlstringDescription, including available requirement sections
salaryobject / nullStructured salary range when the API publishes one
scrapedAtISO stringExtraction 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

  1. Start with defaults to collect 20 current Stripe jobs from Greenhouse.
  2. Replace boards with company URLs or explicit ATS/token pairs.
  3. Set filters and limits, then run.
  4. 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.