ATS Jobs API: Greenhouse, Lever, Ashby & Workable Jobs
Pricing
from $2.00 / 1,000 jobs
ATS Jobs API: Greenhouse, Lever, Ashby & Workable Jobs
Get every open job from company career sites on Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee and Personio as one normalized JSON schema: salary, remote/hybrid, seniority, Markdown description. Auto-detects the ATS. $2 per 1,000 jobs.
Pricing
from $2.00 / 1,000 jobs
Rating
0.0
(0)
Developer
Dodi Abak
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Get every open job from any company's career site as clean, normalized JSON, straight from the company's own applicant tracking system (ATS). Supports Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee and Personio. Give it careers URLs, company websites or just company names. It finds the ATS for you and returns one schema for every system: title, department, locations, remote / hybrid / on-site, salary range, seniority, employment type, posting date, apply link, and the full description as LLM-ready Markdown.
$2 per 1,000 jobs. No login, no cookies, no proxies, no browser. Data comes from the public job-board APIs that companies publish for their own career pages, so it's fresh, first-party and complete.
What can this ATS Jobs API do?
- 🏢 7 ATS in one Actor. Greenhouse, Lever (US + EU), Ashby, Workable, SmartRecruiters, Recruitee and Personio. Each one maps to the same 25+ field schema.
- 🔎 Auto-detects the ATS. Pass
huggingface.coorNotionand the Actor reads the company's website for a careers link, or tries the company's slug on every supported ATS. - 💰 Salary ranges. Uses the ATS's structured pay data where it exists (Ashby, Lever, Recruitee) and otherwise parses pay-transparency text in the description (
$190,000 — $230,000 USD,€60k–80k,USD 45 to 60 per hour). - 🌍 Remote, hybrid or on-site, from the ATS flag first and the title/location text second.
- 🧭 Seniority and employment type, normalized (
senior,staff,manager,intern… /full_time,contract,internship…). - 🧹 Filters that save money. Title keywords, excluded words, locations, countries, workplace type, departments, seniority, employment type, posted within N days, salary-only. You only pay for jobs that pass.
- 🔔 Monitoring mode. Turn on Only new jobs, schedule the Actor, and each run returns (and charges for) only jobs no earlier run delivered. Perfect for job alerts and hiring-signal feeds.
- 🤖 Built for AI agents. Stable field names, a one-line
summaryper job, Markdown descriptions, and free error rows with clear codes. Works through the Apify MCP server in Claude, Cursor, ChatGPT and other MCP clients.
Who uses it?
- Job boards and aggregators: build niche boards (remote AI jobs, climate jobs, jobs in Germany…) from first-party ATS data.
- Sales and recruiting teams: hiring is a buying signal. Track which companies are hiring for which roles, and where.
- Market and salary research: compare pay ranges, remote share and seniority mix across companies.
- AI agents and job-search copilots: "find senior remote data engineering jobs at these 50 startups, posted this week".
How to use it
- Add companies to Companies, one per line, in any of these forms:
- a careers URL:
https://boards.greenhouse.io/stripe,https://jobs.lever.co/palantir,https://jobs.ashbyhq.com/openai,https://apply.workable.com/huggingface,https://careers.smartrecruiters.com/BoschGroup,https://bunq.recruitee.com,https://personio.jobs.personio.de - a shortcut:
greenhouse:stripe,lever:palantir,ashby:notion - a company website:
huggingface.co - a company name:
Notion(the Actor tries the slug on each ATS; check theboardUrlit found)
- a careers URL:
- Optionally add filters (keywords, locations, remote…).
- Click Start. Open the Overview view, or download JSON, CSV, Excel or XML, or call the API.
Input example
{"companies": ["greenhouse:stripe", "https://jobs.ashbyhq.com/openai", "https://jobs.lever.co/palantir", "huggingface.co"],"keywords": ["engineer", "data", "product manager"],"workplaceTypes": ["remote", "hybrid"],"postedWithinDays": 30,"descriptionFormat": "markdown","onlyNewJobs": false}
Output example (one job, description shortened)
{"recordType": "job","jobId": "ashby:openai:c857b732-3556-4b65-8ae9-f64b92091729","ats": "ashby","company": "OpenAI","title": "Engineering Manager, Preparedness","department": "Safety Systems","team": "Preparedness","location": "San Francisco","locations": ["San Francisco"],"workplaceType": "hybrid","isRemote": false,"employmentType": "full_time","seniority": "manager","salary": { "min": 445000, "max": 510000, "currency": "USD", "interval": "year", "text": "$445K - $510K", "source": "ats" },"postedAt": "2026-10-19T21:55:42.352Z","url": "https://jobs.ashbyhq.com/openai/c857b732-3556-4b65-8ae9-f64b92091729","applyUrl": "https://jobs.ashbyhq.com/openai/c857b732-3556-4b65-8ae9-f64b92091729/application","summary": "Engineering Manager, Preparedness at OpenAI · San Francisco · hybrid · USD 445k–USD 510k/year · posted 2026-10-19","descriptionMarkdown": "**About the Team**\n\nThe Preparedness Engineering team is responsible for…","descriptionChars": 5467,"isNew": null,"input": "https://jobs.ashbyhq.com/openai"}
A company that can't be read becomes a free error row: {"recordType": "error", "input": "acme", "errorCode": "ATS_NOT_FOUND", "error": "No supported ATS board found…"}. A per-company run report (boards found, detection method, open / matched / delivered counts) is saved as the OUTPUT record in the key-value store.
Output fields
| Field | Meaning |
|---|---|
jobId | Stable id ats:companySlug:postingId, the same on every run |
ats, companySlug, company, boardUrl | Where the job came from |
title, department, team | As published |
location, locations, countryCode | All published locations |
workplaceType, isRemote | remote / hybrid / onsite |
employmentType, employmentTypeRaw | Normalized and original |
seniority | From the title: intern … executive |
salary | {min, max, currency, interval, text, source}, where source is ats (structured) or description (parsed) |
postedAt, updatedAt | ISO 8601 |
url, applyUrl | Job page and application page |
descriptionMarkdown / descriptionText | Full description |
summary | One line for humans and LLMs |
isNew | true in Only-new-jobs mode |
How much does it cost?
Pay per event: $0.002 per job delivered ($2 per 1,000 jobs), plus Apify's tiny per-run start fee. Error rows, filtered-out jobs and (in monitoring mode) jobs you already received are never charged. The Actor respects your Max cost per run and stops cleanly when it's reached.
Examples: all 726 open Stripe jobs ≈ $1.45. A daily alert on 100 startups that returns 40 new jobs a day ≈ $2.40 a month.
Use it from AI agents (MCP) and code
- MCP: add
https://mcp.apify.com?tools=actors,dodiabak/ats-jobs-apito Claude Desktop, Cursor, VS Code or any MCP client, then ask "List remote senior backend jobs at Stripe, Notion and Hugging Face posted this month, with salaries." - API:
POST https://api.apify.com/v2/acts/dodiabak~ats-jobs-api/run-sync-get-dataset-items?token=YOUR_TOKENwith the input JSON as the body. - Integrations: Make, Zapier, n8n, Google Sheets, Slack and webhooks through Apify integrations.
Tips
- For company names, slug guessing can match a different company with the same name. Check
boardUrl, or pass the careers URL for 100% accuracy. - SmartRecruiters lists no descriptions, so the Actor fetches them only for jobs that pass your filters. Use
descriptionFormat: "none"for the fastest runs. - Schedule with Only new jobs to get a clean daily feed of new openings.
- Workday, iCIMS, Taleo and other systems are not supported yet. Open an issue if you need one.
FAQ
Is this legal? The Actor reads public job-board endpoints that the ATS vendors provide so companies can show their jobs on their own websites. It collects job postings, not personal data, and needs no login. You're responsible for how you use the data.
How fresh is the data? Live. Every run reads the ATS directly.
Why is a field null? Not every ATS publishes every field. For example, Greenhouse has no structured remote flag or salary, so those come from the text when present.
Support: use the Issues tab. Feature requests are welcome.