ATS Jobs API | $2/1K | Any Company Domain, 10 Free avatar

ATS Jobs API | $2/1K | Any Company Domain, 10 Free

Pricing

Pay per event + usage

Go to Apify Store
ATS Jobs API | $2/1K | Any Company Domain, 10 Free

ATS Jobs API | $2/1K | Any Company Domain, 10 Free

Give a company domain like stripe.com and get every open role. $2 per 1,000 listings, first 50 free on every run. Finds which ATS it runs - Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Rippling, Breezy, Personio, BambooHR - and reads its public endpoint. Filter by keyword, location or date.

Pricing

Pay per event + usage

Rating

0.0

(0)

Developer

omar khandji

omar khandji

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

an hour ago

Last modified

Share

ATS Jobs API — Give a Company Domain, Get Every Open Job

You type stripe.com. You get all 545 open roles.

This Actor works out which applicant-tracking system a company runs, then reads that ATS's own public endpoint. Official endpoints only — no cookies, no proxies, no login, nothing that can be blocked. Clean, deduplicated, structured rows. 10 job listings free on every run.

Nine ATS providers, one schema, one call: Greenhouse, Lever, Ashby, SmartRecruiters, Rippling, Breezy HR, Workday, Personio, BambooHR.

You do not need to know the company's ATS

Many ATS scrapers ask you for a board token — the internal handle a company registered with Greenhouse or Lever. Finding it means opening the careers page and reading the HTML, which is the work you came here to avoid.

Give this Actor a domain instead:

You giveIt findsYou get
stripe.comGreenhouse → stripe545 roles
anthropic.comGreenhouse → anthropic399 roles
figma.comGreenhouse → figma177 roles
ramp.comAshby → ramp123 roles
notion.soAshby → notion110 roles
vercel.comGreenhouse → vercel81 roles
monzo.comGreenhouse → monzo75 roles

(Measured 2026-08-03 — 1,550 live roles from eight bare domains, nothing else supplied.)

It works in two passes: it reads the company's careers page and looks at where it links, and if nothing is linked it derives the likely handle from the domain and asks the providers directly. A company running its own careers page with no hosted ATS comes back as "ats": null — an answer, not an error.

Board tokens still work if you have them, and you can mix both in one run.

What a run costs

Two parts, and the second is the one that keeps this Actor alive:

$0.04 per searchone run, charged only when the run delivered at least one job
$2 per 1,000 job listings$0.002 each, and only for listings actually delivered to you

The search fee exists because a run costs real compute whether it returns six rows or six hundred. It is flat, so batching is the cheap way to use this Actor: fifty companies in one run pay the fee once.

A run that finds nothing is never charged at all.

Free tier — 10 job listings on every run

The first 10 job listings of every run are free. Not a trial, not a first-run coupon: it applies to every run you ever make, so you can wire this Actor into a pipeline and evaluate it on your own target companies before a cent is billed.

Beyond the free 10 you pay $0.002 per job listing — $2 per 1,000 — and only for listings actually delivered to you.

One guard, stated plainly: the free allowance never covers more than half of a run, so a run returning 20 listings gets 10 free rather than 20. That is what stops the free tier from becoming an unlimited free plan for anyone willing to split one job into many tiny runs, and what lets us keep offering it.

Quick start

Paste company websites into Company domains and press Start. That is the whole setup — no tokens, no provider to choose.

Or call it as an HTTP API — see Use it as a live HTTP API.

Filter before you pay

Filters are applied before billing, so you are never charged for a job you excluded. A run over 20 companies that keeps only remote engineering roles bills for the remote engineering roles, not the fan-out.

InputEffect
keywordsKeep jobs whose title, department, company or location contains one of these
excludeKeywordsDrop jobs matching any of these — intern, senior, sales
locationsKeep jobs whose location contains one of these — Berlin, United Kingdom
remoteOnlyKeep only roles whose location says remote, anywhere or distributed
postedAfterKeep jobs posted on or after YYYY-MM-DD

Keywords match whole words and do not stem. engineer returns "Backend Engineer" but not "Engineering Intern" — pass both words if you want both. That strictness is deliberate: a substring filter for ai matches "maintainer" and, measured on a real board, kept 40% of unrelated roles. Jobs from providers that publish no date are kept by postedAfter rather than silently dropped.

Why read the ATS instead of a job aggregator

Most job scrapers scrape an aggregator — LinkedIn, Indeed, a job board. That means cookies, proxies, rate limits, and roles that are already stale or reposted by an agency.

This Actor goes to the source: the ATS the employer publishes from.

Aggregator scraperThis Actor
What breaks itanti-bot, layout changes, expired cookiesnothing — these are the companies' own public API endpoints
Freshnessan aggregator's copy, sometimes days oldthe role as the employer published it
Duplicatesthe same role reposted by three agenciesone row per role, deduplicated
Proxy billyesnone
Who reposted itunknowableirrelevant — it is first-hand

Supported ATS providers

Every provider below is fetched in parallel, and you can mix as many companies and providers as you like in one call.

Greenhouse jobs API

Pass the board token — the path segment in boards.greenhouse.io/<token> or job-boards.greenhouse.io/<token>. Example: stripe.

Greenhouse publishes the whole board in one document, so a company's full listing comes back in a single request. This is the fastest and most complete of the nine.

Workday jobs API

Pass the full careers URL exactly as it appears in your browser, with or without the /en-US/ locale segment:

https://redhat.wd5.myworkdayjobs.com/en-US/jobs

The Actor derives the search endpoint itself and pages through the results.

Workday is the one that matters for enterprises — it is what most large employers run on, and a single tenant can advertise thousands of roles. Two things to know: Workday returns 20 roles per page, and this Actor pages up to 200 roles per tenant per run so a single company cannot consume your whole budget. Need more from one tenant, run it again against a narrower Workday site URL (Workday tenants usually expose several, one per region or job family).

Lever postings API

Pass the company handle from jobs.lever.co/<handle>. Example: netflix.

Ashby jobs API

Pass the board name from jobs.ashbyhq.com/<board>. Common among venture-backed startups.

SmartRecruiters jobs API

Pass the company identifier from careers.smartrecruiters.com/<id>.

Rippling ATS jobs

Pass the company handle from ats.rippling.com/<handle>.

Breezy HR jobs

Pass the company handle from <handle>.breezy.hr.

Personio jobs API

Pass the company handle from <handle>.jobs.personio.de. Personio is widespread across European, especially German-speaking, employers.

BambooHR jobs

Pass the company handle from <handle>.bamboohr.com.

Output schema

One clean row per role:

{
"source_url": "https://boards.greenhouse.io/stripe/jobs/6789",
"title": "Account Executive, AI Sales",
"company": "stripe",
"location": "New York",
"department": "Sales",
"salary": "$120,000 - $160,000",
"posted_at": "2026-07-20T09:12:00Z",
"source": "greenhouse"
}
FieldWhat it holds
source_urlcanonical link to the role on the employer's own board
titlerole title as published
companythe handle or board you passed
locationas the employer wrote it
departmentteam or department, when the ATS exposes one
salaryposted range, when the employer published one
posted_atISO-8601 publication timestamp, when available
sourcewhich ATS the row came from

Duplicates across boards are removed. Seniority and job function are inferred and attached, so you can filter without post-processing.

Use it from an AI agent (MCP)

This Actor is a Model Context Protocol server. Point any MCP client at it and the tool appears with its full input schema — no wrapper code:

https://om-kh--ats-jobs-api.apify.actor/mcp
{
"mcpServers": {
"ats_jobs": {
"url": "https://om-kh--ats-jobs-api.apify.actor/mcp",
"headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
}
}
}

One tool, ats_jobs. It takes the same arguments as the Start form and returns the same rows, so an agent and a curl user can never get different answers.

Use it as a live HTTP API

With Standby enabled, the Actor answers HTTP directly — no run to start, no container to wait for:

curl -H "Authorization: Bearer $APIFY_TOKEN" \
"https://om-kh--ats-jobs-api.apify.actor/?companyDomains=stripe.com,figma.com&keywords=engineer&remoteOnly=true"
import requests
response = requests.get(
"https://om-kh--ats-jobs-api.apify.actor/",
params={"companyDomains": "stripe.com,figma.com", "keywords": "engineer", "maxTotalChargeUsd": 0.5},
headers={"Authorization": f"Bearer {token}"},
timeout=300,
)
for job in response.json()["jobs"]:
print(job["title"], "-", job["location"])

The response is JSON: jobs, jobs_returned, jobs_charged, free_results_granted, filtered_out, domains_resolved (which ATS each domain turned out to use), hiring_signal and source_errors. List parameters take comma-separated values; a JSON body works too if you prefer POST.

Two limits worth knowing. Apify kills a Standby request at five minutes, so one HTTP call accepts up to 12 boards and reports any it skipped in boards_skipped — send more in a second call, or use the batch mode for a large sweep. The exact hostname for your account is shown on the Actor's Standby settings tab.

Bonus: only the new roles, plus a hiring signal

Pass the previous run's output as previousJobs and you get only what changed — roles opened, roles updated — plus a hiring-growth summary in HIRING_SIGNAL.json.

That turns the Actor into a hiring-intent feed: which teams a company is staffing up, in which cities, starting when. Useful for sales triggers ("they just opened 12 sales roles"), recruiting, and competitive research. Leave previousJobs empty and you simply get the full current list.

Frequently asked questions

Is there a free Workday jobs API?

Workday exposes a public search endpoint on every tenant's careers site, and this Actor reads it directly. No Workday account, key or partnership is needed. The first 10 listings of every run are free here; beyond that it is $0.002 per role.

How do I get jobs from a company's own careers page?

Find which ATS the company uses — the careers page URL usually gives it away (boards.greenhouse.io/..., jobs.lever.co/..., <tenant>.myworkdayjobs.com/...) — then pass that handle or URL in the matching field. If the URL does not match any of the nine providers above, the company is on something else and this Actor cannot read it.

Does this scrape LinkedIn or Indeed?

No, deliberately. Those are aggregators: their copies are second-hand, often stale, and reposted by recruiters. This Actor reads the employer's own ATS, so every row is first-hand. If you do want aggregator coverage, see the related scrapers at the bottom.

Will it break when a site changes its layout?

There is no layout involved. These are JSON API endpoints the companies publish for their own careers pages, so there is nothing to parse and no anti-bot to fight. A provider can still change its API — when a board is unreachable it is reported in source_errors and costs you nothing.

How many jobs will one run return?

As many as the companies have published, minus duplicates, subject to your own maxTotalChargeUsd cap and the 200-per-tenant Workday limit. For reference, a single large Greenhouse board typically returns 300–600 live roles.

What does it cost to try?

Nothing. The first 10 listings of every run are free, forever, and a board whose ATS fails is never billed.

Can an AI agent use it?

Yes. RUN_SUMMARY.json and HIRING_SIGNAL.json give an agent the outcome without re-reading the dataset, and the Standby endpoint above is a plain HTTP JSON API.

Is this a job posting API?

Yes. Give it a company domain and it returns that company's job postings as structured rows, read live from the applicant tracking system the employer publishes from. There is no index in between, so a posting appears here as soon as the employer publishes it.

Which ATS platforms are supported?

Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Rippling, Breezy HR, Personio and BambooHR — nine systems, one output schema.

Do I need an API key for the ATS?

No. Every endpoint used here is the public one the company's own careers page calls. No key, no cookie, no login, no proxy.

How do I get jobs from a company career site?

Put the company's website in Company domains. The Actor reads the careers page, finds which system sits behind it, and returns the roles. If you already know the board token you can pass that instead.

Can I filter to remote or recent jobs only?

Yes — remoteOnly, postedAfter, keywords, excludeKeywords and locations. Filters run before billing, so you are not charged for rows you excluded.

Limits and costs

  • Hard cost cap. Set maxTotalChargeUsd and the run can never bill above it.
  • A failed board is never billed. Unreachable ATS endpoints are reported in source_errors and cost you nothing.
  • Workday: up to 200 roles per tenant per run, 20 per page.
  • Standby: up to 12 boards per HTTP request, 5-minute platform timeout.
  • Free tier: 10 listings per run, never more than half of a run.

Same data, other sources — all with the same free tier, the same clean schema and the same pay-only-for-what-you-get billing:

Actor
[Careers Page Scraper
[Hiring Signals
Indeed Jobs Scraper - Listings, Companies & Salary
LinkedIn Jobs Scraper - Listings & Companies
Glassdoor Reviews Scraper - Employer Ratings
LinkedIn Company Scraper - Followers & Headcount