ATS Jobs Scraper & API - Greenhouse, Lever, Ashby
Pricing
from $0.96 / 1,000 jobs
ATS Jobs Scraper & API - Greenhouse, Lever, Ashby
Scrape open jobs from career boards on five ATS platforms in one run: Greenhouse, Lever, Ashby, Workable and SmartRecruiters. No login, no API key. Every board returns one schema: title, departments, team, location, remote flag, employment type, posting date, apply link. JSON, CSV or API.
Pricing
from $0.96 / 1,000 jobs
Rating
0.0
(0)
Developer
Automation Craft
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 hours ago
Last modified
Categories
Share
ATS Jobs Scraper & API - Greenhouse, Lever, Ashby
This ATS jobs scraper collects open jobs from company career boards on five applicant-tracking systems in one run, in one unified format: Greenhouse, Lever, Ashby, Workable and SmartRecruiters. Paste careers URLs (or company tokens), press Start, and get clean job records: title, department, team, location, remote flag, employment type, salary where published, posting date, apply link and (optionally) the full description. No login, no API keys, no proxies, no code.
Built to be complete and fair:
- Deduplicated, billed once. Duplicates inside a run are removed. Give your search a memory name and every later run returns only the jobs that appeared since; jobs you already received are skipped and never charged again. Schedule it daily or weekly and you have a change feed.
- Filters run before billing. Keywords (must contain / must not contain), locations, remote only, employment type and an exact posting-date window. You only pay for jobs that pass.
- Exact caps, fair share. Per-company and per-run caps are honored exactly (the top competitor's 3-star review is "I set maximum 500 but got 200"). When several companies share a cap, each gets a fair share and unused budget flows to the companies with more jobs.
- Honest about what you get. Every run ends with a
run-summaryitem: jobs per board, how many were filtered or already known, exactly what was charged, and how often each field was populated.
If you mostly need one platform, the sibling listings at the bottom are the same engine with that platform preset.
30-second start
- Under Companies / careers pages, paste one careers URL per line, for example
https://boards.greenhouse.io/stripe. Accepted forms: a careers URL from any of the five ATS platforms (boards.greenhouse.io/ - Optional: tick Include full job descriptions, add keyword / location / date filters.
- Give it a Memory name if you will run it again and only want new jobs.
- Start. Download JSON, CSV or Excel from the Dataset tab, or read it through the API.
Nothing is charged until a job that passed your filters is delivered. Prices and worked examples are in the cost section below.
What you get
Every job record has the same fields whatever the ATS. Where a platform does not publish a field you get null; the Actor never guesses. This table is the exact contract:
| Field | Greenhouse | Lever | Ashby | Workable | SmartRecruiters |
|---|---|---|---|---|---|
title, url, applyUrl, jobId | yes | yes | yes | yes | yes |
departments | yes | yes | yes | yes | yes |
team | no | yes | yes | yes (function) | yes (function) |
location and allLocations | yes (+ offices) | yes | yes (+ secondary) | yes | one per posting |
remote flag | only when the location says Remote | yes | yes | yes | yes |
employmentType | no | yes | yes | yes | yes |
compensation | no | when published | structured ranges | no | no |
publishedAt | yes | yes | yes | yes | yes |
updatedAt | yes | no | no | no | no |
descriptionHtml and descriptionText | yes | yes | yes | yes | yes (one extra request per job) |
companyName | yes | no (token only) | no (token only) | yes | yes |
Measured fill rates from a live run at build time (share of delivered jobs where the field was populated):
| Field populated | Greenhouse | Lever | Ashby | Workable | SmartRecruiters |
|---|---|---|---|---|---|
companyName | 100% | 0% | 0% | 100% | 100% |
departments | 100% | 100% | 100% | 100% | 76% |
team | 0% | 100% | 100% | 57% | 100% |
location | 100% | 100% | 100% | 100% | 100% |
remote | 8% | 100% | 100% | 100% | 100% |
employmentType | 0% | 100% | 100% | 100% | 100% |
compensation | 0% | 0% | 100% | 0% | 0% |
publishedAt | 100% | 100% | 100% | 100% | 100% |
description | 100% | 100% | 100% | 100% | 100% |
Output
One item per job, plus status items when a company could not be read and one run-summary item at the end. Nested values (departments, allLocations, compensation) for developers; flat fields for spreadsheets.
| Field | Meaning |
|---|---|
provider, company, companyName | Which ATS, the board token you gave, and the company name when the platform publishes it. |
jobId, url, applyUrl | Stable id (always a string) and links. |
title, departments, team, location, allLocations, country | The role and where it is. |
remote, workplaceType, employmentType, compensation | Work arrangement and pay, exactly as the platform publishes them (null when it does not). |
publishedAt, updatedAt | ISO timestamps from the platform. |
descriptionHtml, descriptionText | Full description when requested. |
changeType, isDuplicate, firstSeenAt, lastSeenAt, contentHash, scrapedAt | Dedup and provenance. changeType is NEW, UPDATED or DUPLICATE. |
Sample item from a live run:
{"type": "job","provider": "ashby","company": "linear","companyName": null,"jobId": "d3bc1ced-3ce4-4086-a050-555055dbb1ff","title": "Senior / Staff Fullstack Engineer","departments": ["Product"],"team": "Engineering","location": "Europe","allLocations": ["Europe"],"country": null,"remote": true,"workplaceType": "Remote","employmentType": "FullTime","compensation": {"compensationTierSummary": null,"scrapeableCompensationSalarySummary": null,"compensationTiers": [],"summaryComponents": []},"publishedAt": "2021-04-27T20:13:45.158Z","updatedAt": null,"url": "https://jobs.ashbyhq.com/linear/d3bc1ced-3ce4-4086-a050-555055dbb1ff","applyUrl": "https://jobs.ashbyhq.com/linear/d3bc1ced-3ce4-4086-a050-555055dbb1ff/application","descriptionHtml": "<p style=\"min-height:1.5em\">At Linear, we're building the product development system for teams and agents. AI is fundamentally changing how software gets built,...","descriptionText": "At Linear, we're building the product development system for teams and agents. AI is fundamentally changing how software gets built, and we’re shaping the tools this new era requires. \n\nFounded in 201...","changeType": "NEW","isDuplicate": false,"firstSeenAt": "2026-08-31T11:22:17.996Z","lastSeenAt": "2026-08-31T11:22:17.996Z","contentHash": "d8b766cc90b3f15428344d1d8277a90a0e61d22a","scrapedAt": "2026-08-31T11:22:17.996Z"}
The run-summary item reports per board: jobsOnBoard, matchedFilters, knownFromMemory, deliveredNew, deliveredDuplicates, withDescription, plus totals, filteredOut counts, charges, fillRates and a plain-language hint whenever a run delivers nothing.
How much does it cost to scrape ATS career boards?
Pay per event, no Actor start fee, no monthly minimum. Two events are charged:
| Event | Charged when | Price per 1,000 | Silver (10% off) | Gold (20% off) |
|---|---|---|---|---|
Job (job-result) | A new, unique job is delivered to the dataset | $1.20 | $1.08 | $0.96 |
Job description (job-description) | That job also arrives with its full description | $0.50 | $0.45 | $0.40 |
A complete record (job plus description) therefore costs $1.70 per 1,000 jobs at the base price. The Silver and Gold columns are the Apify Store subscription discounts, applied automatically to both result events; there is no start event to discount.
Worked examples at the base price: 200 new jobs across 3 companies = $0.24. The same 200 with descriptions = $0.34. A weekly re-run that finds 12 new jobs among 200 known ones = $0.014. A re-run that finds nothing new = $0.00.
Always free: duplicates across runs (under the same memory name), jobs removed by your filters, unknown companies, empty boards, status items and the run-summary.
Input reference
| Input | What it does |
|---|---|
| Companies / careers pages | One entry per company: careers URL, provider:token, or bare token. Case, http/https, www. and trailing paths do not matter. EU-hosted Greenhouse and Lever boards are detected from eu. URLs. SmartRecruiters identifiers are case-sensitive. |
| ATS for bare company names | Which platform a plain token belongs to. "Detect" probes all five providers for each bare name. URLs always win. |
| Include full job descriptions | Adds descriptionHtml and descriptionText. SmartRecruiters needs one extra request per job for this, which is why it is priced separately. |
| Must contain / Must not contain / Fields to check | Case-insensitive keyword filters over title, departments, team, location and (Greenhouse, Lever, Ashby, Workable) the description text. |
| Locations | Substring match over the job's location, every listed office and the country, e.g. London, Remote, United States. |
| Remote jobs only | Keeps jobs the ATS explicitly marks remote. Greenhouse has no remote flag, so Greenhouse jobs match only when the location text says "Remote". |
| Employment types | Substring match over the platform's employment type, e.g. Full, Contract, Intern. Greenhouse does not publish it. |
| Posted within / Posted after / Posted before | Exact window on publishedAt (the date the platform reports the job was first published). |
| Memory name | The key that makes repeat runs return only new jobs. Stored in a named key-value store in your account (ats-jobs-memory-v2-<name>). |
| Also return already-known jobs | Re-sends known jobs flagged isDuplicate: true with changeType DUPLICATE or UPDATED (the posting changed since you last received it). Free. |
| Reset this memory first | Forgets everything under the memory name before running. |
| Max new jobs per company / total | Exact caps on new, charged jobs. Known duplicates do not count towards them. |
Using the API
Same input as the form.
curl -X POST "https://api.apify.com/v2/acts/automation_craft~ats-jobs-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"companies": ["https://boards.greenhouse.io/stripe"],"includeDescription": true,"postedWithinDays": "30","dedupMemoryName": "auto-watch","maxJobsTotal": 500}'
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation_craft/ats-jobs-scraper').call({companies: ['https://boards.greenhouse.io/stripe'],includeKeywords: ['engineer'],keywordFields: ['title'],dedupMemoryName: 'engineering-watch',});const { items } = await client.dataset(run.defaultDatasetId).listItems();const jobs = items.filter((i) => i.type === 'job');
from apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("automation_craft/ats-jobs-scraper").call(run_input={"companies": ["https://boards.greenhouse.io/stripe"], "remoteOnly": True, "maxJobsTotal": 200})jobs = [i for i in client.dataset(run["defaultDatasetId"]).iterate_items() if i.get("type") == "job"]
Scheduling: create a Schedule in Apify (daily or weekly) with a memory name set; each run then delivers only the jobs that appeared since the previous run, and a run that finds nothing new costs nothing.
What this Actor does NOT do
- It does not scrape job boards such as LinkedIn, Indeed or Naukri. It reads company career boards hosted on Greenhouse, Lever, Ashby, Workable and SmartRecruiters.
- It does not discover companies for you. You supply the careers pages; it gets every open job they list.
- It does not return fields the platform does not publish (see the coverage table), applicant data, or anything behind a login.
- It cannot see unlisted or internal-only postings.
FAQ
Which ATS platforms does this cover?
Company career boards on Greenhouse, Lever, Ashby, Workable and SmartRecruiters. Other systems such as Workday or iCIMS are not supported, and job boards such as LinkedIn or Indeed are a different Actor.
Do I need a separate scraper for each ATS?
No. One run can mix careers pages from all five platforms and every board comes back in the same schema. If you only ever need one platform, the sibling listings at the bottom are the same engine with that platform preset.
Do I need an API key or a login for any of these boards?
No. The Actor reads the same public, unauthenticated endpoints the companies' own careers pages use. No key, no cookies, no account.
How do I get only the jobs that appeared since my last run?
Set a Memory name and re-run (or schedule) with the same name. Jobs you already received are skipped and never charged again, so a run that finds nothing new costs nothing.
What do I paste in: a careers URL or a company name?
Either. A careers URL from any of the five platforms, a provider:token pair such as greenhouse:stripe, or a bare token, which is probed against all five providers. Case, http/https, www. and trailing paths do not matter.
Which fields are missing on which platform?
The coverage table above is the exact contract. In short: Greenhouse publishes no team, employment type or salary; Lever and Ashby publish no company name; only Ashby publishes structured pay ranges. Missing fields are null, never guessed.
Why does this Actor run with limited permissions?
Least privilege: it only needs to read public careers pages and write its own storages, so it runs with limited permissions and cannot touch the rest of your account. The cross-run memory is a named key-value store (ats-jobs-memory-v2-<name>) that the Actor creates and owns itself.
Fair use
This Actor reads the same public, unauthenticated job-board endpoints the companies' own careers pages use, at a polite request rate. It collects no personal data and never logs in. You are responsible for complying with applicable laws and the target sites' terms in your jurisdiction and use case.
Support
Something missing or wrong? Open an issue on the Actor's Issues tab. Fixes usually ship within a day.
More data tools by Automation Craft
- Greenhouse Jobs Scraper & API
- Lever Jobs Scraper & API
- Ashby Jobs Scraper & API
- Workable Jobs Scraper & API
- SmartRecruiters Jobs Scraper & API
- LinkedIn Jobs Scraper - No Login, Real Dates: LinkedIn public job search, no login, real posted dates.
- SEEK Job Scraper: Australia & New Zealand Jobs: SEEK jobs, deduplicated, pay once per job.
- JobStreet Job Scraper: Malaysia, Singapore, PH, ID: JobStreet jobs across South East Asia.
- JobsDB Job Scraper: Hong Kong & Thailand Jobs: JobsDB listings for Hong Kong and Thailand.
- US New Business Registrations Scraper - LLC Leads: newly registered companies from official state registers.
- Meta Ad Library Scraper - All Placements, Filters: ads a company is running on Facebook and Instagram.