ATS Jobs API: Greenhouse, Lever, Ashby & Workable Jobs avatar

ATS Jobs API: Greenhouse, Lever, Ashby & Workable Jobs

Pricing

from $2.00 / 1,000 jobs

Go to Apify Store
ATS Jobs API: Greenhouse, Lever, Ashby & Workable 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

Dodi Abak

Maintained by Community

Actor 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.co or Notion and 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 summary per 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

  1. 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 the boardUrl it found)
  2. Optionally add filters (keywords, locations, remote…).
  3. 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

FieldMeaning
jobIdStable id ats:companySlug:postingId, the same on every run
ats, companySlug, company, boardUrlWhere the job came from
title, department, teamAs published
location, locations, countryCodeAll published locations
workplaceType, isRemoteremote / hybrid / onsite
employmentType, employmentTypeRawNormalized and original
seniorityFrom the title: intern … executive
salary{min, max, currency, interval, text, source}, where source is ats (structured) or description (parsed)
postedAt, updatedAtISO 8601
url, applyUrlJob page and application page
descriptionMarkdown / descriptionTextFull description
summaryOne line for humans and LLMs
isNewtrue 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-api to 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_TOKEN with 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.