ATS Job Board Scraper - Greenhouse, Lever, Ashby, Workable
Pricing
$0.75 / 1,000 job posting records
ATS Job Board Scraper - Greenhouse, Lever, Ashby, Workable
Beta (v0.1): Scrape live job postings directly from Greenhouse, Lever, Ashby, and Workable career sites with zero index delay. Deduplicates multi-city postings into one record, filters full job descriptions without timeouts, tracks NEW/ACTIVE/CLOSED hiring signals, and supports a free dryRun count.
Pricing
$0.75 / 1,000 job posting records
Rating
0.0
(0)
Developer
Radosław Szal
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
The ATS Job Board Scraper is an ultra-fast company career site job listing API and Greenhouse, Lever, Ashby, and Workable job scraper designed as a real-time new and expired jobs tracker with built-in hiring signals.
It connects directly to the public career site endpoints used by modern companies to publish their job openings, providing structured, clean, and deduplicated job data with zero indexing latency.
What It Does
- Direct ATS Integration: Extracts live job postings straight from public JSON feeds of Greenhouse, Lever, Ashby, and Workable.
- Zero Index Delay: Unlike secondary job aggregators that refresh hourly or daily, data is fetched in real time directly from the employer's applicant tracking system, preserving exact
postedAttimestamps. - Flexible Company Input: Accepts bare company slugs (e.g.
stripe,notion,figma) or full career board URLs (boards.greenhouse.io/stripe,jobs.lever.co/netflix,jobs.ashbyhq.com/linear,apply.workable.com/invision). Bare slugs are automatically probed across all supported ATS platforms. - Deep In-Memory Filtering:
- Title keywords: Include and exclude keywords (case-insensitive substring matching).
- Full description keywords: Filter by full job description locally in-memory — instant, reliable, and completely immune to network timeouts.
- Location & country filtering: Built-in normalization for city aliases (
Munich=München,Cologne=Köln,Warsaw=Warszawa) and country codes/names (US,UK,PL,DE,CA, etc.). - Workplace type: Target
remote,hybrid, oronsiteroles.
- Hiring Signals & Delta Tracking:
- Automatically identifies whether an opening is
NEW,ACTIVE, orCLOSED. - Tracks
firstSeenAtand computesdaysOpenfor every job. - Delta Mode (
onlyNew): Emits only newly posted jobs since the previous run. - Closed Jobs Tracking (
emitClosed): Emits jobs that disappeared since the last run to detect hiring freezes or filled positions.
- Automatically identifies whether an opening is
- Multi-Location Deduplication: Postings advertised across multiple cities are consolidated into a single record with a clean
locations[]list and ISO-2countries[]array. - Free Pre-Flight Check (
dryRun): Verify filters and count matching listings without pushing dataset items or incurring event charges.
Why Choose Us
| Feature | Typical Market Alternatives | ATS Job Board Scraper |
|---|---|---|
| Data Freshness | Stale secondary indexes (1–2 hour delay) | Direct from source (zero index delay) |
| Delta & Expired Jobs | Paid add-on ($20+/month separate actor) | Included natively in standard pricing |
| Full Description Filtering | Slow or causes gateway timeouts | Fast, in-memory local filtering (no timeouts) |
| Multi-City Postings | Emits separate records (charges multiple times) | 1 job = 1 record with locations[] array |
| Pre-Flight Estimation | Not available | Free dryRun mode ($0 cost) |
| Company Discovery | Unverified bloated lists | Precise targeting via your slugs or board URLs |
Specific Advantages
- Direct from the Source with Zero Index Delay: Many scrapers query third-party aggregators whose indexes lag by 1 to 2 hours. This actor queries the public career feeds of the ATS providers directly, delivering openings the moment they go live with accurate source timestamps.
- Delta Mode & Closed Job Detection Included:
Tracking expired roles and changes typically requires paying for an auxiliary actor or a costly monthly subscription. Our scraper tracks state per board in the Key-Value Store (
ats-state), deliveringNEW,ACTIVE, andCLOSEDhiring signals at no extra monthly fee. - Full-Description Filtering Without Timeouts: Competitors often warn that filtering through full job descriptions is "VERY intensive, risk of time-out" or disable it entirely. We fetch the complete payload and filter locally in memory, giving you fast, bulletproof keyword matching across the full text.
- Consolidated Multi-City Postings:
When an employer lists a single position across multiple locations (e.g., London, Berlin, and Paris), other scrapers create separate duplicate items and charge you for each one. We normalize the listing into a single record containing a unified
locations[]array, saving you budget and downstream cleanup effort. - Free
dryRunVerification: Test new keyword combinations, location filters, or company lists without spending your budget. Setting"dryRun": truecalculates matching job counts and stores the breakdown in your Key-Value Store underDRY_RUNat $0 cost.
Input
Configure your target companies, platforms, filters, and run modes using standard JSON input:
{"companies": ["stripe","airbnb","https://jobs.ashbyhq.com/linear","https://apply.workable.com/invision"],"atsPlatforms": ["greenhouse","lever","ashby","workable"],"titleInclude": ["engineer", "developer"],"titleExclude": ["intern", "senior"],"descriptionInclude": ["python", "typescript"],"descriptionExclude": ["clearance required"],"locations": ["US", "remote", "Berlin"],"workplaceType": "remote","onlyNew": false,"emitClosed": false,"dryRun": false,"includeDescription": true,"maxItems": 500}
Input Parameters Reference
| Field | Type | Default | Description |
|---|---|---|---|
companies | string[] | Required | List of company slugs (e.g. "stripe", "notion") or full board URLs (boards.greenhouse.io/..., jobs.lever.co/..., jobs.ashbyhq.com/..., apply.workable.com/...). |
atsPlatforms | string[] | ["greenhouse", "lever", "ashby", "workable"] | Priority order of ATS platforms to check when a bare slug is provided. |
titleInclude | string[] | [] | Keep only jobs whose title contains at least one of these keywords (case-insensitive). |
titleExclude | string[] | [] | Exclude any job whose title contains any of these keywords. |
descriptionInclude | string[] | [] | Keep only jobs whose full description contains at least one of these keywords (evaluated locally). |
descriptionExclude | string[] | [] | Exclude any job whose description contains any of these keywords. |
locations | string[] | [] | Filter by city, state, or country with automatic alias expansion (e.g., "US", "UK", "Munich", "NY"). |
workplaceType | string | "" | Filter by workplace type: "remote", "hybrid", "onsite", or "" for any. |
onlyNew | boolean | false | Delta mode: emit only newly added jobs not present in the previous run. |
emitClosed | boolean | false | Also emit postings that were removed since the previous run with hiringSignal="CLOSED". |
dryRun | boolean | false | Count matching jobs for free. Writes count breakdown to Key-Value Store key DRY_RUN and emits 0 dataset items ($0 charge). |
includeDescription | boolean | true | Include plain-text job description in the descriptionText field. |
maxItems | integer | 1000 | Maximum number of records to return (controls maximum spend per run; 0 = safety cap of 50,000). |
Output
Each scraped job posting is normalized into a flat, consistent schema ready for databases, spreadsheets, or AI pipelines:
{"id": "gh-6124589002","atsPlatform": "greenhouse","companySlug": "stripe","companyName": "Stripe","title": "Staff Software Engineer - Infrastructure","department": "Engineering","team": "Core Platform","employmentType": "full_time","workplaceType": "remote","locations": ["San Francisco, CA","Seattle, WA","Remote - US"],"countries": ["US"],"salaryMin": 185000,"salaryMax": 235000,"salaryCurrency": "USD","salaryPeriod": "year","postedAt": "2026-10-24T14:30:00Z","updatedAt": "2026-10-25T09:15:00Z","firstSeenAt": "2026-10-24T15:00:00Z","daysOpen": 2,"applyUrl": "https://boards.greenhouse.io/stripe/jobs/6124589002#app","jobUrl": "https://boards.greenhouse.io/stripe/jobs/6124589002","descriptionText": "As a Staff Software Engineer on Core Platform, you will design and scale...","hiringSignal": "ACTIVE","scrapedAt": "2026-10-26T12:00:00Z"}
Pricing
This Actor operates on a transparent Pay-Per-Event (PPE) model: you only pay for the exact job records successfully delivered to your dataset.
- Standard Price: $0.00075 per job ($0.75 per 1,000 jobs)
- Actor Startup Cost: $0.00 (Free to start)
dryRunPre-Flight Check: $0.00 (Zero dataset items = zero charges)
No Hidden Fees: Unlike tools requiring a separate monthly subscription to track expired positions or delta changes, delta monitoring (
onlyNew) and closed job signals (emitClosed) are included at standard per-record rates.
FAQ
1. Which ATS platforms are supported and how are they identified?
We support Greenhouse, Lever, Ashby, and Workable. If you pass a full career page URL (such as jobs.ashbyhq.com/linear), the platform is identified automatically. If you provide a bare slug (such as stripe), the scraper sequentially checks each platform until it finds an active board.
2. Why is SmartRecruiters not supported?
SmartRecruiters' API endpoint explicitly specifies Disallow: / in its robots.txt file. We strictly respect web scraping ethics and legal compliance rules, meaning we do not bypass robots.txt restrictions. As a result, SmartRecruiters is deliberately excluded.
3. How do delta mode (onlyNew) and hiring signals work?
The scraper stores job board state in an Apify Key-Value Store named ats-state. In delta mode (onlyNew: true), it compares current active openings against previously observed jobs, emitting only newly listed positions. When emitClosed: true is enabled, it additionally emits positions that have closed or been unlisted, marking them with hiringSignal: "CLOSED" and calculating total daysOpen.
4. How does the free dryRun mode work?
When "dryRun": true is enabled, the scraper contacts the job boards, applies your filters, and calculates the exact number of matching postings. Instead of writing items to the dataset, it saves a breakdown object ({count, perCompany}) to the Key-Value Store key DRY_RUN. Because zero dataset items are written, you are billed $0.00.
5. How are multi-location postings handled?
Employers often post a single position with multiple eligible cities (e.g., London, Paris, and Remote). Rather than splitting these into multiple entries and billing you multiple times, our normalization engine merges all cities into a clean locations: [...] list and deduplicated ISO-2 countries: [...] array.
Legality & Compliance
- Publicly Accessible Data: The Actor extracts listings solely from public career endpoints made freely available by ATS vendors for embedding job listings on company career pages.
- No Authentication Bypass: The scraper does not access private accounts, bypass login walls, crack CAPTCHAs, or circumvent paywalls.
- Privacy & GDPR Compliance: The output contains only public job vacancy information. Recruiter contact information (personal names, emails, phone numbers) and applicant data are never collected or stored.
- Ethical Crawling: Honors
robots.txtdirectives across all endpoints, respects crawl delays (including Lever's 1-second delay), bounds concurrency to a maximum of 4 requests, respectsRetry-Afterheaders, and declares a transparent User-Agent. - User Responsibility: The Actor collects publicly posted job requisitions. Users are responsible for ensuring that their downstream use and storage comply with third-party source terms of service and applicable local regulations (e.g. respecting Workable's
Content-Signal: ai-train=no).
Feedback & Reviews
If this Actor saved you time or powered your hiring data pipeline, please consider leaving a rating and review on the Apify Store! Your feedback helps us maintain these integrations, add new ATS platforms, and continually improve data quality. If you encounter any issues or have feature suggestions, feel free to open an issue in the Actor's repository.