Multi-ATS Jobs & Hiring Signals API (7 platforms) avatar

Multi-ATS Jobs & Hiring Signals API (7 platforms)

Pricing

from $1.20 / 1,000 job delivereds

Go to Apify Store
Multi-ATS Jobs & Hiring Signals API (7 platforms)

Multi-ATS Jobs & Hiring Signals API (7 platforms)

Normalized jobs and hiring signals (tools, seniority, salary, visa) from 7 ATS platforms, incl. Greenhouse, Lever, Ashby and Workday. Pay per delivered job.

Pricing

from $1.20 / 1,000 job delivereds

Rating

0.0

(0)

Developer

Asnim Ariff

Asnim Ariff

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 hours ago

Last modified

Features

Limited permissions

Share

Multi-ATS Career Site Jobs & Hiring Signals API

Name a company. Get its open jobs — normalized, with the tools each role mentions, seniority, salary and visa signals.

One input line (["stripe","nvidia","palantir"]) returns live open roles from seven ATS platforms, fetched over HTTP at run time. No logins, no proxies, no browser.

Built for lead generation (find companies hiring for a tool you sell), recruiting intelligence (track competitors' openings and stated salaries), job boards and AI agents that need structured hiring data.

Why this Actor

✅ Filter by tools — toolsFilter: ["snowflake","dbt"] finds jobs mentioning either tool; only matching open jobs are charged. ✅ Live company boards — data comes from the public ATS at run time, not a stale cache. ✅ Seven ATS platforms — Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee and Workday. ✅ Signals on each row — tools, title-based seniority, stated yearly USD salary and a negation-aware visa-sponsorship flag. ✅ Monitor changes — delta mode reports NEW_ROLE, SALARY_CHANGED and ROLE_CLOSED events; see limitations below. ✅ Pay for delivered jobs — filtered, closed, unknown and error rows carry no job-delivered charge; an Actor start charge applies. ✅ Agent-friendly input — accept company names, domains, URLs and aliases; bad entries return free error items.

Quick start

1. Apify Console — open the Actor, paste an input, press Start:

{ "companies": ["stripe"], "maxJobsPerCompany": 5 }

2. API (any language, or the apify-client SDK) — replace <YOUR_TOKEN>:

curl -X POST "https://api.apify.com/v2/acts/reedy_flagon~multi-ats-hiring-signals-api/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"companies":["stripe","nvidia"],"toolsFilter":["snowflake","dbt"],"maxJobsPerCompany":100}'

The response is the dataset itself — one JSON object per delivered job.

3. Agents / MCP — the Actor also runs from an LLM agent through the Apify MCP server; the same input object is all the agent needs.

Sample data (free, no signup)

Browse 115 real jobs delivered by this Actor — Stripe, Nvidia, Palantir, Linear and Hugging Face, filtered to roles mentioning kubernetes, dbt, snowflake or airflow:

https://api.apify.com/v2/datasets/ebfwuRYPrNuXXw3mX/items?format=json&clean=1

The dataset is public and reads without a token. Raw endpoint, no UI: pipe it into jq or open it in the Apify Console dataset viewer if you prefer a table.

What you get back

FieldMeaning
globalIdStable cross-run key (greenhouse:stripe:8172510) — use it to deduplicate and to detect changes.
company, companyDomain, atsWho is hiring, their domain, and which ATS the board runs on.
title, department, location, workplaceTypeRole details; workplaceType can be null.
seniorityintern → vp, inferred from the title.
salaryMinUsd, salaryMaxUsd, salaryRaw, currencyOnly stated yearly USD ranges are parsed — no conversion, no guessing.
toolsMentionedTools detected in the posting text, matched against a fixed lexicon.
visaSponsorshipNegation-aware text signal (not legal advice).
status, changeEvents, firstSeen, lastSeenOPEN plus delta events when onlyNewOrChanged is on.
jobUrl, publishedAt, inputIndex, jobsFoundApply link, ATS publication date (when given), and which input entry produced the row.

Coverage

ATSDiscoveryNotes
Greenhousename / domain / URLPublic board API.
Levername / domain / URLPublic postings API.
Ashbyname / domain / URLPublic job board API.
Workablename / domain / URLPublic widget API.
SmartRecruitersname / domain / URLMay need extra detail requests for tool filtering.
Recruiteename / domain / URLPublic offers API.
Workdaycareer URL recommendedpublishedAt is always null; salary changes are not detected in delta mode.

Use cases

Use caseHow to use the data
Sales and lead generationFind companies hiring for roles that mention a tool.
Recruiting intelligenceTrack new roles and stated salary changes.
Job boardsCollect normalized open roles across supported ATS platforms.
AI agentsFeed structured jobs and hiring signals into an agent workflow.
Hiring monitoringSchedule delta runs to spot new and closed roles.

Pricing (pay per event)

EventPriceWhen it is charged
Actor start$0.00005once per run (automatic)
job-delivered$0.0012for each matched OPEN job saved to the dataset
Jobs deliveredCost
100$0.12
1,000$1.20
10,000$12.00

Free ($0): closed roles (ROLE_CLOSED records), roles removed by your seniority filter, roles beyond maxJobsPerCompany, unknown companies (ATS_NOT_FOUND), empty boards, invalid inputs and error items. You are charged only after the job has been saved. The Actor respects your maximum total charge per run and stops gracefully (partial results are kept) when the limit is reached.

In delta mode, unchanged roles are not delivered or charged. The first run treats every role as new, and each run has an Actor start charge.

Input

FieldTypeDescription
companiesarray of stringsNames (stripe), domains (stripe.com) or career URLs (https://jobs.lever.co/palantir).
maxJobsPerCompanyinteger, default 50Maximum open jobs delivered per company.
onlyNewOrChangedboolean, default falseDelta mode (see below).
minSenioritystring, optionalintern, junior, mid, senior, staff, principal, director, vp.
titleKeywordstring, optionalDeliver only jobs whose title contains this text (case-insensitive substring).
toolsFilterarray of strings, optionalDeliver only jobs whose toolsMentioned contains ANY listed tool (case-insensitive, lexicon spelling, e.g. ["snowflake","dbt","kubernetes"]). Empty or unknown entries are ignored.
locationstring, optionalDeliver only jobs whose location contains this text (case-insensitive).
remoteOnlyboolean, default falseDeliver only jobs with workplace type remote or remote / home-office wording in the location. Jobs with no remote signal are dropped (free).
postedAfterstring YYYY-MM-DD, optionalDeliver only jobs with publishedAt on or after this date. Jobs for which the ATS gives no date are dropped (free).
snapshotStoreNamestring, optionalNamed key-value store used for delta snapshots.

Filters combine with AND; toolsFilter matches ANY listed tool. Filters run before delivery, so filtered jobs are free. Invalid filter values are ignored and produce one free FILTER_INVALID warning per company. If every tool is invalid, no tools filter is applied; check the warning before using the results.

Aliases merged into companies: urls, startUrls (strings or { "url": ... }), domains, websites, url, company. Comma- or newline-separated strings also work. Invalid entries produce free error items.

Input examples

{ "companies": ["stripe"], "maxJobsPerCompany": 5 }
{
"companies": ["palantir", "linear.app", "https://apply.workable.com/huggingface"],
"maxJobsPerCompany": 100,
"minSeniority": "senior"
}
{ "urls": ["https://stripe.com"] }

Recipes

Tools-filtered lead generation:

{"companies":["stripe","nvidia"],"toolsFilter":["snowflake","dbt","cuda"],"titleKeyword":"engineer","maxJobsPerCompany":100}

New-roles-only monitor (also emits salary changes and free closed-role events):

{"companies":["stripe"],"onlyNewOrChanged":true}

Remote roles at senior level or above:

{"companies":["palantir"],"minSeniority":"senior","remoteOnly":true}

Output example

{
"jobId": "8172510",
"globalId": "greenhouse:stripe:8172510",
"company": "Stripe",
"companyDomain": "stripe.com",
"ats": "greenhouse",
"title": "Abuse Investigator",
"department": "8611 Security Analytics",
"location": "Seattle, San Francisco, New York City",
"workplaceType": null,
"seniority": "mid",
"salaryMinUsd": null,
"salaryMaxUsd": null,
"salaryRaw": null,
"currency": null,
"visaSponsorship": false,
"toolsMentioned": ["python", "databricks", "trino", "pyspark", "pandas"],
"jobUrl": "https://stripe.com/jobs/search?gh_jid=8172510",
"publishedAt": "2026-09-09T10:50:29-04:00",
"inputIndex": 0,
"jobsFound": 6,
"firstSeen": "2026-11-07T14:26:01+00:00",
"lastSeen": "2026-11-07T14:26:01+00:00",
"status": "OPEN",
"changeEvents": []
}

globalId is a cross-run job key; inputIndex identifies the input entry; jobsFound is the board count available to the Actor. publishedAt is the ATS publication date when available. companyDomain can be null when it cannot be determined.

An unknown company produces an ATS_NOT_FOUND error item at no job-delivered charge. Other errors include INVALID_INPUT, EMPTY_BOARD, FETCH_ERROR and PROCESSING_ERROR.

Delta mode

Set onlyNewOrChanged: true and schedule runs to compare boards against saved snapshots. The default key-value store is ats-hiring-signal-snapshots; use snapshotStoreName to change it.

  • NEW_ROLE: absent from the previous snapshot. On the first run, every role is new.
  • SALARY_CHANGED: the parsed salary differs from the snapshot, subject to the ATS limitations below.
  • ROLE_CLOSED: a previously seen role is no longer on the board. Closed records are free.

Unchanged roles are not emitted or charged. Snapshots cover the whole board, not just the first maxJobsPerCompany roles.

Limitations

  • Coverage: only the seven listed ATS platforms are supported. Unsupported or undiscovered boards can return ATS_NOT_FOUND. Public boards may hide jobs.
  • Detection: names and domains are used to guess board slugs; if the slug differs, pass the supported career URL. Workday discovery can require its specific career URL.
  • Salary: only stated yearly USD ranges fill salaryMinUsd and salaryMaxUsd; other salary text stays raw. No conversion or guessing. When several regional ranges are listed, the first found is used.
  • Seniority: inferred from titles; unrecognized titles default to mid, and ambiguous titles can be misclassified.
  • Tools: matched against a fixed lexicon, not every possible tool. Unknown toolsFilter entries are ignored with a free warning. If none are valid, the filter is inactive. Mentions can have false positives.
  • Visa sponsorship: a negation-aware text signal, not legal advice or a guarantee of eligibility.
  • Dates: postedAfter drops undated jobs. Workday publishedAt is always null, so that filter returns no Workday jobs.
  • Remote: remoteOnly drops jobs without a remote signal; workplace type can be null.
  • Details and delta: SmartRecruiters and Workday may require extra detail requests for tool filtering. Workday salary changes are not detected in delta mode. SmartRecruiters salary changes may be missed for roles whose details were not delivered.
  • Domains: companyDomain comes from the input or a company-hosted job URL; it is not guessed from an ATS-hosted URL.

FAQ

Is this a scraper? It calls public career-site endpoints over HTTP. No logins, proxies or browser are needed.

What if a company isn't found? You get a free ATS_NOT_FOUND item. Try its supported ATS career URL instead.

Do you charge for closed roles? No. ROLE_CLOSED records have no job-delivered charge. The Actor start charge still applies.

Does delta mode find every salary change? No. Workday salary changes are not detected, and SmartRecruiters has the detail-fetch limitation described above.

How do I find companies hiring for a specific tool? Pass the tool to toolsFilter along with the companies you care about: {"companies":["stripe","nvidia"],"toolsFilter":["snowflake"]}. Only jobs that mention it are delivered and charged.

Can I monitor new job postings automatically? Yes — run with "onlyNewOrChanged": true on a schedule (for example daily). New roles, closed roles and salary changes come back as events; unchanged roles cost nothing.

Changelog and support

See CHANGELOG.md for version history. Questions, a missing ATS platform, or a board that should be found? Open an issue on the Actor's page — platform requests are read.