Company Hiring Signals: Open Roles by Domain Across 10 ATS
Pricing
from $10.00 / 1,000 company signal returneds
Company Hiring Signals: Open Roles by Domain Across 10 ATS
Hiring signals for a list of companies: paste domains, we find each one's job system (Greenhouse, Lever, Ashby, Workable, Workday + 5 more) and return open roles, departments, locations, remote share and new job postings since the last run. To Google Sheets or Clay. Pay per company found.
Pricing
from $10.00 / 1,000 company signal returneds
Rating
0.0
(0)
Developer
Adrian Voss
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Hiring signals for a list of companies, from nothing but their domains. Paste stripe.com,
n26.com, notion.so. For each company the actor finds its job system (Greenhouse, Lever,
Ashby, Workable, SmartRecruiters, Personio, Recruitee, Teamtailor, Workday or iCIMS), reads its
live job board and returns one row: open roles, roles by department, top locations, remote share,
newest and oldest posting, median posting age. Turn on monitoring and every scheduled run adds new
roles and closed roles since the last run: a new job postings alert for each company on your list.
Charged per company found. A company whose job system can't be found costs nothing.
You don't need to know which ATS a company uses, or its board slug. The actor reads the company's own homepage and careers pages for board links, embeds and redirects, and only when the site names none does it try each system's public job-board endpoint with the company's name. Every row says how the job system was found and how sure that is.
Who it's for
- Sales and GTM teams who prioritise accounts by hiring: a company opening 12 sales roles in
Germany is buying tools for them. Filter on
byDepartment,byLocationandnewRolesSinceLastRunin Clay or Google Sheets. - Recruiters and staffing agencies who watch target companies for new openings in their specialty, and want the new postings the day they appear.
- Investors and analysts tracking headcount intent across a portfolio or a market map: who is growing, who stopped hiring, where they hire.
- Job-board and data builders who need fresh company-level job data from the source ATS, optionally one row per posting.
Why this one
- Domain in, job system out. No slugs, no guessing which of ten vendors a company uses. The
actor finds it from the company's own site, including redirects (
getresponse.com/careers→ Workable) and embedded boards (n26's Greenhouse embed), and from Workday and iCIMS links that no slug guess could ever find. - Company-level signal, not a dump. One row per company with the counts a list-builder filters on, computed over the whole board: departments, top 10 locations, remote share, posting age.
- New and closed roles since the last run. Scheduled as a watchlist, each row says what opened and what closed, with a sample of the new roles (title and link).
- Honest about what it knows.
detectionMethodanddetectionConfidencesay how each job system was found. A probe that lands on a same-named board of a different company is rejected and not billed. Estimates are flagged (openRolesExact: false), and fields a platform doesn't publish stay empty instead of being guessed. - Straight from the ATS. Every number comes from the company's own live job board, not a resold database, so it is as fresh as the run.
What you get
One company row per input:
| Field | What it is |
|---|---|
domain, companyName | The company, named the way its site or board names it |
ats, atsName, careersUrl | Job system found, and the public job board |
detectionMethod | input (you pasted a board URL), redirect, link, probe, or none |
detectionConfidence | high (redirect/link/input), medium (probe confirmed by the board's own company name or postings), low (probe with nothing on the board to confirm it) |
detectedOn, otherAtsFound, pagesChecked | Where the job system was found, other systems also found, pages read |
openRoles, openRolesExact, jobsAnalyzed | Open roles on the whole board; false when it's an estimate; postings read |
byDepartment | { "Engineering": 16, "Sales": 41, ... } for the whole board |
byLocation | Top 10 locations, { "San Francisco, California": 60, ... } |
remoteShare | Share of open roles that are remote, 0 to 1 |
newestPostingAt, oldestPostingAt, medianPostingAgeDays | How fresh the board is |
firstRun, newRolesSinceLastRun, closedRolesSinceLastRun, newRoles | Monitoring only: the change since the last run, and up to 10 new roles (title + link) |
note | Anything worth knowing about this row, in plain words |
With "Also return one row per open job" on, each company row is accompanied by one job
row per open role (rowType: "job"): jobTitle, jobDepartment, jobLocation, jobRemote,
jobPostedAt, jobUrl, and with monitoring isNewRole. Every row carries the same columns, so
filter on rowType in Sheets or Clay.
Per-platform notes. Teamtailor publishes no departments, so byDepartment is empty there.
Workday lists only relative dates ("Posted 3 Days Ago"), so only newestPostingAt is given, and
whole-board counts come from Workday's own filters (which also corrects its 2,000-result cap).
Large iCIMS boards are read 5 pages deep and openRoles is then an estimate. SmartRecruiters'
counts cover the whole board; dates cover the first 300 postings.
Monitoring: new job postings alert per company
Tick Monitor: report new and closed roles since the last run, save the input as a Task and schedule it daily or weekly.
- Run 1 remembers each company's board. Its rows show
firstRun: trueand no counts yet. - Every later run fills
newRolesSinceLastRun(roles never seen on this watchlist),closedRolesSinceLastRun(roles on the board last run that are gone now) andnewRoles, a sample of up to 10 new roles, newest first. - With job rows on, a monitoring run returns job rows only for the new roles, so a quiet day costs only the company rows. The first run returns every open role once, as the baseline.
closedRolesSinceLastRunis only given when both runs read the whole board; for a sampled board (big Workday, iCIMS or SmartRecruiters boards) it stays empty rather than counting roles that merely fell off the pages read.- If a company moves to another job system, that run re-baselines and says so in
note. - The memory lives in your Apify account (a named key-value store), per watchlist and company. Leave Watchlist name empty for one shared memory, or name it to keep separate schedules apart.
Price
- Company signal returned: $20 per 1,000 companies
- Job row returned: $1 per 1,000 companies
Plus a $0.00005 start fee per run. Each event above is billed independently, only when it actually returns data — misses (found:false) are never charged.
- Companies: $20 per 1,000 companies whose job system was found (a board with 0 open roles is a real answer and counts). A company where nothing was found is free.
- Job rows (only with the checkbox on): $1 per 1,000 job rows. Cap them with Max job rows per company (default 200).
- A small start fee per run.
A weekly watchlist of 500 companies is about 2,000 company rows a month, about $16 a month, plus job rows only if you ask for them.
How to use
- In the Apify Console. Open the actor page and click Start — the
companiesfield is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found. - Via the API. Call it directly with a POST request — no Console needed once you have an API token:
curl "https://api.apify.com/v2/acts/accountable_eel~company-hiring-signal/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"companies":["n26.com","getresponse.com","parcellab.com"]}'
- On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.
Hiring signals to Google Sheets or Clay without code. Save your list as a Task with monitoring
on and schedule it weekly. In n8n or Make, trigger on "Apify: run succeeded", read the run's
dataset, keep rows where rowType is company, and append companyName, ats, openRoles,
newRolesSinceLastRun and careersUrl to a Google Sheet. In Clay, use the HTTP API column below
with the company's domain.
Input
{"companies": ["n26.com","getresponse.com","parcellab.com"]}
One company per line: its website domain, or its careers-page URL if you have it. A job-board URL (Greenhouse, Lever, Workday...) works too. Accepted formats: n26.com, https://www.palantir.com/careers, https://jobs.lever.co/palantir, https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite.
includeJobs(default off): also one row per open job, billed per job row.maxJobsPerCompany(default 200, up to 5,000): caps job rows and job charges per company.deltaMode,deltaName: monitoring, see above.- Tip: for a Workday company, paste its careers-page URL. Workday can't be guessed from a domain, only found from a link on the company's site.
Sample output
| query | found | status | rowType | domain | companyName | ats | atsName | careersUrl | detectionMethod | detectionConfidence | detectedOn | otherAtsFound | pagesChecked | openRoles | openRolesExact | jobsAnalyzed | byDepartment | byLocation | remoteShare | newestPostingAt | oldestPostingAt | medianPostingAgeDays | firstRun | newRolesSinceLastRun | closedRolesSinceLastRun | newRoles | jobId | jobTitle | jobDepartment | jobLocation | jobRemote | jobPostedAt | jobUrl | isNewRole | note | scrapedAt |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| n26.com | true | OK | <row type (company or job)> | <job system (ats)> | <open roles is exact?> | <open roles by location (top 10)> | <share of roles that are remote (0-1)> | <median posting age (days)> | <first run of this watchlist?> | <new roles (sample of 10)> | <job id (job rows)> | <job title (job rows)> | <job department (job rows)> | <job location (job rows)> | <remote? (job rows)> | <job posted (job rows)> | <job link (job rows)> | <new since last run? (job rows)> | 1970-01-01T00:00:00.000Z |
A real company row (live run, 2026-09-25, first run of a watchlist, so the since-last-run counts are still empty; trimmed to 4 departments and locations):
{"rowType": "company","domain": "palantir.com","companyName": "Palantir","ats": "lever","careersUrl": "https://jobs.lever.co/palantir","detectionMethod": "link","detectionConfidence": "high","detectedOn": "https://www.palantir.com/careers","openRoles": 324,"byDepartment": { "Dev": 80, "Delta": 68, "Echo": 36, "Information Security": 21 },"byLocation": { "New York, NY": 100, "London, United Kingdom": 42, "Palo Alto, CA": 29, "Seattle, WA": 13 },"remoteShare": 0,"newestPostingAt": "2026-09-25T15:29:56.130Z","oldestPostingAt": "2009-12-05T00:00:00.000Z","medianPostingAgeDays": 427,"firstRun": true,"newRolesSinceLastRun": null,"closedRolesSinceLastRun": null}
And one of its job rows (with "Also return one row per open job" on):
{"rowType": "job","domain": "palantir.com","ats": "lever","jobTitle": "Administrative Business Partner","jobDepartment": "Administrative","jobLocation": "Singapore, Singapore","jobRemote": false,"jobPostedAt": "2026-08-11T17:38:11.368Z","jobUrl": "https://jobs.lever.co/palantir/6ed76ce8-4156-4b60-b120-403538bd66cd","isNewRole": true}
Use it from Clay, n8n, Make, or an AI agent
This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.
curl "https://api.apify.com/v2/acts/accountable_eel~company-hiring-signal/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"companies":["n26.com","getresponse.com","parcellab.com"]}'
n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~company-hiring-signal/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"companies":["n26.com","getresponse.com","parcellab.com"]} (swap in an expression from an earlier node for a real value).
Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~company-hiring-signal/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"companies":["{{company}}"]}, mapping the row's company into the companies array.
MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "Company Hiring Signals API: Open Roles by Domain" — the agent will find and run this actor.
vs. alternatives
| What it costs | What you get | Trade-off | |
|---|---|---|---|
| This actor | $20 per 1,000 companies found, misses free; job rows $1 per 1,000 | Job system detected from a domain; open roles, departments, locations, remote share, posting age; new and closed roles since last run | Ten job systems; companies on a custom-built careers site aren't covered |
| Career-site job APIs on the Apify Store | From about $12 per 1,000 jobs | Every posting as a row | You pay per posting and aggregate yourself; you still need to know which companies are on which system |
| Hiring-signal data vendors | Subscriptions, usually per company per month | Pre-aggregated signals | A resold database updated on their schedule, not your list read live |
| Checking careers pages by hand | Your time | Everything | Doesn't scale past a handful of companies, and no history |
Store figures as of September 2026.
FAQ
Which job systems are covered?
Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Personio, Recruitee (Tellent), Teamtailor,
Workday and iCIMS. Companies on another system, or on a careers site they built themselves, come
back with ats empty and are not charged.
How is the job system found?
The homepage (or the careers URL you gave), then /careers, /jobs, /karriere, /join-us and
careers links on the site, looking for board links, embeds and redirects. If none, one request to
each system's public job-board endpoint with the company's name taken from its domain. A board
found that way must name the company, or mention it in its postings, to be accepted at medium
confidence.
Why was I charged for a company with 0 open roles? Its job system was found and read: "on Greenhouse, not hiring right now" is a real answer, and on a watchlist it is exactly the heartbeat that shows the company is still being checked.
Why did a company come back empty?
Its site names no supported job board and no probe matched. The note says what was checked.
If the site names a board that didn't answer this time, the row says so, keeps ats and
careersUrl, has no counts, and is not charged; run it again later.
Workday boards can only be found from a link; paste the careers-page URL to help. A site that
refuses every request from cloud servers (5xx or no DNS) comes back as REQUEST_FAILED, free.
What do medium and low confidence mean?
Both mean the board was found by guessing the slug from the domain, not from the company's own
site. medium: the board's company name, or its postings' text, names the company. low: the
board publishes nothing to confirm it. Two different companies can share a name, so for either
one, glance at careersUrl. A probe that lands on a board naming a different company is rejected
outright and not billed.
Does it log in or use personal data? No. It reads public careers pages and the public job-board endpoints each ATS vendor publishes for embedding. No login, no candidate data, no personal data about anyone. Check that your use fits each site's terms and your local law.
Can an AI agent call this? Yes, through the Apify MCP server or the API call above.
One company's full job list instead? The same parsers run as dedicated actors per job system, for example Greenhouse Jobs and Workday Jobs, with title, location and date filters.