1. Anatomy of Direct ATS Endpoints: Why DIY Scrapers Break at Scale
Before writing a custom Python crawler, understand how the Big Four enterprise ATS platforms serve job listings and where maintenance bottlenecks emerge.
| ATS Platform | Raw Endpoint Pattern | Main Scraping Bottleneck | Unified API Filter |
|---|---|---|---|
| Workday | POST https://{tenant}.wd5.myworkdayjobs.com/wday/cxs/{tenant}/{site}/jobs | Requires tenant + cluster (wd1–wd12) + site slug discovery; list call omits full job description HTML | source=workday (1,280+ employer portals) |
| Greenhouse | GET https://boards-api.greenhouse.io/v1/boards/{token}/jobs?content=true | Unstructured HTML entities in content; free-text location strings without ISO country or remote flags | source=greenhouse (6,294+ active boards) |
| Lever | GET https://api.lever.co/v0/postings/{site}?mode=json | Nested lists[] array for requirements; inconsistent compensation fields across employers | source=lever (2,135+ active boards) |
| Ashby | GET https://api.ashbyhq.com/posting-api/job-board/{board}?includeCompensation=true | Board slug differs from company domain; custom compensation tiers require currency normalization | source=ashby (2,684+ active boards) |
2. Production Python Scraper: Paginating Across Workday, Greenhouse, Lever & Ashby
Instead of maintaining 12,000+ separate board URLs and four parser schemas, query all four enterprise ATS ecosystems in one cursor-paginated Python loop.
Cursor-Paginated Python & Node.js ATS Job Harvester
Fetch newly posted software & AI engineering roles from Workday, Greenhouse, Lever, and Ashby with normalized USD compensation:
curl "https://api.jobpostingsapi.com/v1/jobs/search?source=workday,greenhouse,lever,ashby&q=engineer&remote=true&posted_since=7d&limit=25" \
-H "x-api-key: jp_live_your_api_key"3. Cost & Engineering Maintenance Breakdown: DIY ATS Crawlers vs. JobPostings API
Running headless browsers and residential proxies for Workday, iCIMS, and Taleo alongside 10,000+ Greenhouse/Lever/Ashby boards quickly exceeds $500/month in infra alone.
- Board Discovery & Slug Churn: Companies rebrand, migrate from Lever to Ashby, or change Workday tenant URLs every week. JobPostings API continuously maps 434 ATS & career-site connectors to canonical company domains.
- Zero Proxy or Headless Browser Overhead: Pay $19/mo for 25,000 Credits ($0.76/1K jobs) or $25 non-expiring PAYG instead of managing Playwright worker fleets and residential proxy pools.
- Built-In Dead Link & Closed Job Detection: Every ATS requisition is re-verified on a 1h–4h cadence. Closed roles emit a closed event on GET /v1/feeds/closed so your database never serves 404 application links.
Interactive Engineering Workbench · GET /v1/jobs/search
Verify real-time latency, pagination math & JSON schema
Frequently Asked Questions
- Why is Workday harder to scrape in Python than Greenhouse or Lever?
- Greenhouse and Lever expose single-call public JSON endpoints per employer slug. Workday hosts employers across regional clusters (wd1, wd3, wd5, wd12) and requires a POST request to /wday/cxs/{tenant}/{site}/jobs for pagination plus a separate GET request per job slug to retrieve the full HTML description. JobPostings API normalizes 1,280+ Workday portals into the exact same schema as Greenhouse, Lever, and Ashby.
- How do I find which ATS a company uses from its domain?
- Call GET /v1/companies/{slug} with a company domain (e.g., stripe.com or anthropic.com) or use our free interactive Company ATS & Career URL Detector at /tools/ats-detector.
- How many Credits does a multi-ATS search query consume?
- 1 Credit per returned job record ($0.000199 to $0.00076 depending on tier). If your filter matches 0 jobs, 0 Credits are deducted.