Company Hiring Signals: Open Roles by Domain Across 10 ATS avatar

Company Hiring Signals: Open Roles by Domain Across 10 ATS

Pricing

from $10.00 / 1,000 company signal returneds

Go to Apify Store
Company Hiring Signals: Open Roles by Domain Across 10 ATS

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

Adrian Voss

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

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, byLocation and newRolesSinceLastRun in 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. detectionMethod and detectionConfidence say 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:

FieldWhat it is
domain, companyNameThe company, named the way its site or board names it
ats, atsName, careersUrlJob system found, and the public job board
detectionMethodinput (you pasted a board URL), redirect, link, probe, or none
detectionConfidencehigh (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, pagesCheckedWhere the job system was found, other systems also found, pages read
openRoles, openRolesExact, jobsAnalyzedOpen roles on the whole board; false when it's an estimate; postings read
byDepartment{ "Engineering": 16, "Sales": 41, ... } for the whole board
byLocationTop 10 locations, { "San Francisco, California": 60, ... }
remoteShareShare of open roles that are remote, 0 to 1
newestPostingAt, oldestPostingAt, medianPostingAgeDaysHow fresh the board is
firstRun, newRolesSinceLastRun, closedRolesSinceLastRun, newRolesMonitoring only: the change since the last run, and up to 10 new roles (title + link)
noteAnything 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: true and 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) and newRoles, 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.
  • closedRolesSinceLastRun is 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

  1. In the Apify Console. Open the actor page and click Start — the companies field is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found.
  2. 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"]}'
  3. 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

queryfoundstatusrowTypedomaincompanyNameatsatsNamecareersUrldetectionMethoddetectionConfidencedetectedOnotherAtsFoundpagesCheckedopenRolesopenRolesExactjobsAnalyzedbyDepartmentbyLocationremoteSharenewestPostingAtoldestPostingAtmedianPostingAgeDaysfirstRunnewRolesSinceLastRunclosedRolesSinceLastRunnewRolesjobIdjobTitlejobDepartmentjobLocationjobRemotejobPostedAtjobUrlisNewRolenotescrapedAt
n26.comtrueOK<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 costsWhat you getTrade-off
This actor$20 per 1,000 companies found, misses free; job rows $1 per 1,000Job system detected from a domain; open roles, departments, locations, remote share, posting age; new and closed roles since last runTen job systems; companies on a custom-built careers site aren't covered
Career-site job APIs on the Apify StoreFrom about $12 per 1,000 jobsEvery posting as a rowYou pay per posting and aggregate yourself; you still need to know which companies are on which system
Hiring-signal data vendorsSubscriptions, usually per company per monthPre-aggregated signalsA resold database updated on their schedule, not your list read live
Checking careers pages by handYour timeEverythingDoesn'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.