Greenhouse, Lever, Ashby & Workday Jobs Scraper (ATS API)
Pricing
from $1.50 / 1,000 jobs
Greenhouse, Lever, Ashby & Workday Jobs Scraper (ATS API)
Every open job from any company's careers page in one clean schema. Eight ATSs auto-detected, incl. Workday and Rippling, with salary, location, remote flag and full description. Official public job-board APIs only: no login, no proxies.
Pricing
from $1.50 / 1,000 jobs
Rating
0.0
(0)
Developer
Panthalus
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
3 days ago
Last modified
Categories
Features
Share

Every open job at any company, from its own careers page, in one clean schema. Paste careers-page URLs or company names; the Actor finds which applicant-tracking system (ATS) the company uses and returns every live posting with title, team, location, remote flag, salary (where published), posting date, apply link and the full description as plain text.
Eight ATSs in one Actor: Greenhouse, Lever (US + EU), Ashby, Workable, Recruitee, SmartRecruiters, Workday and Rippling.
What people use it for
- Hiring-signal and sales intelligence: track which target accounts are hiring for "data engineer" or "SOC analyst" this week. Hiring is one of the strongest buying signals.
- Job boards and aggregators: fill a niche board (remote, climate, crypto, AI) straight from employer sources, so postings stay fresh and links never die.
- Competitor and market research: watch a competitor's headcount plan by team and location, and spot new offices or new product lines before they're announced.
- Salary benchmarking: Ashby, Lever, Recruitee and Rippling publish structured pay ranges; the rest (including Workday's US pay-transparency lines) are parsed from the description text.
- AI agents and RAG: a JSON job feed for agents that answer "who is hiring X in Y?", and clean description text for embeddings.
- Job seekers and recruiters: one daily scheduled run with
postedWithinDays: 1gives a new-jobs alert across your 200 favourite companies.
Why this one
- Official public job-board APIs only. These are the same JSON feeds the companies' own careers pages load. No login, no cookies, no proxies, no headless browser. So runs are fast (thousands of jobs in seconds) and don't break when a site redesigns.
- Auto-detects the ATS. Give it
notion,https://www.figma.com/careers/,greenhouse:stripeor amyworkdayjobs.comlink and it works out the rest. Stale leftover boards are ignored. - One schema across eight ATSs. You don't write eight parsers.
- No personal data. Recruiter names, creator fields and application mailboxes are dropped. You get job data only.
- Pay per job returned, after your filters. Filtered-out jobs cost nothing.
Input
| Field | What it does |
|---|---|
companies | Careers URLs, board URLs, ats:slug, or bare slugs. Workday: https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite or workday:nvidia.wd5/NVIDIAExternalCareerSite. Rippling: https://ats.rippling.com/chess/jobs or rippling:chess |
keywords / excludeKeywords | Title contains any / none of these |
locations, departments, remoteOnly | Location/country text, team, remote flag |
postedWithinDays | Only jobs first published in the last N days |
includeDescription | Plain-text description (default on). SmartRecruiters, Workday and Rippling need one extra request per job for it, and Workday/Rippling take the exact posting date from that request |
maxJobsPerCompany, maxJobs | Caps (also cap the per-job detail requests on SmartRecruiters, Workday and Rippling) |
{"companies": ["https://boards.greenhouse.io/airbnb", "https://jobs.lever.co/spotify", "openai", "https://www.figma.com/careers/"],"keywords": ["engineer", "analyst"],"remoteOnly": false,"postedWithinDays": 7}
Output (one row per job)
{"ats": "ashby", "company": "ramp", "companySlug": "ramp", "jobId": "34413f8d-…","title": "Security Engineer, Cloud", "department": "Engineering", "team": "Backend","employmentType": "FullTime", "workplaceType": "Hybrid", "isRemote": true,"location": "New York, NY (HQ)", "locations": ["New York, NY (HQ)", "Remote (Canada)", "Remote (US)", "Miami, FL"],"country": "USA", "postedAt": "2026-04-07T17:12:35Z","salaryMin": 211400, "salaryMax": 290600, "salaryCurrency": "USD", "salaryPeriod": "1 YEAR", "salaryText": "$211.4K - $290.6K","url": "https://jobs.ashbyhq.com/ramp/34413f8d-…", "applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-…/application","descriptionText": "ABOUT RAMP …", "input": "ramp", "scrapedAt": "2026-11-06T13:36:13Z"}
A SUMMARY record in the key-value store lists, per input, which board was found, how many jobs it had and any error (e.g. "not found").
Pricing
Pay per event:
- USD 1.50 per 1,000 jobs returned.
- A small start fee per run (USD 0.005).
| Example | Cost |
|---|---|
| 50 companies daily, ~5 new jobs each | about USD 0.38/day |
| 6 large employers, full pull (3,195 jobs, tested) | USD 4.80 |
Set a maximum cost per run in Apify Console and the Actor stops cleanly when it reaches it.
Run it from code or an AI agent
Everything the Console does is one API call away. Get your token under Settings > API & Integrations.
Python (pip install apify-client)
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("panthalus/ats-jobs-api").call(run_input={"companies": ["stripe", "https://jobs.lever.co/spotify", "ashby:notion"], "postedWithinDays": 7})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
JavaScript (npm i apify-client)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<APIFY_TOKEN>' });const run = await client.actor('panthalus/ats-jobs-api').call({"companies": ["stripe", "https://jobs.lever.co/spotify", "ashby:notion"], "postedWithinDays": 7});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
cURL (runs the Actor and returns the results in one request)
curl -X POST "https://api.apify.com/v2/acts/panthalus~ats-jobs-api/run-sync-get-dataset-items?token=<APIFY_TOKEN>" \-H "Content-Type: application/json" \-d '{"companies": ["stripe", "https://jobs.lever.co/spotify", "ashby:notion"], "postedWithinDays": 7}'
AI agents (MCP). Add this Actor as a tool in Claude, Cursor, VS Code or any MCP client:
https://mcp.apify.com?tools=panthalus/ats-jobs-api
Then just ask, for example: "Which of these 50 companies posted a data engineer job this week?" The Actor uses pay-per-event pricing with limited permissions, so it is eligible for Apify's agentic payments.
Schedules and integrations. Run it daily with an Apify Schedule, and send new rows to Google Sheets, Slack, Zapier, Make, n8n or a webhook from the Integrations tab.
FAQ
Is this legal? The Actor reads public job-board endpoints that the ATS vendors document for public use (e.g. Greenhouse Job Board API, Lever Postings API, Ashby Posting API). For Workday and Rippling it reads the same public JSON their hosted careers pages load in your browser (Workday's /wday/cxs/{tenant}/{site}/jobs feed on myworkdayjobs.com, Rippling's ats.rippling.com/api/v2/board/{slug}/jobs), without login and within each host's robots.txt. It collects no personal data. You are responsible for how you use the data, for example when republishing postings.
A company isn't found. For Workday, paste the myworkdayjobs.com careers link (a bare company name can't be matched to a Workday site, and some company careers pages only load the Workday link with JavaScript). iCIMS, Taleo and SuccessFactors are not covered yet. Open an issue with the careers URL and we'll look at adding it.
Workday limits. Workday's own search returns at most 2,000 postings per site, so very large employers are capped there. Without includeDescription, Workday gives only a relative date ("Posted 5 Days Ago"; "30+ Days Ago" becomes the latest possible date, today minus 30) and no department.
Duplicate jobs? If one company runs two live boards, both are returned with their ats field. Stale boards (under 20% of the main board's size) are skipped during auto-detection.