Company Hiring Signals — Detect Any ATS & Pull Open Roles
Pricing
$3.00 / 1,000 job postings
Company Hiring Signals — Detect Any ATS & Pull Open Roles
Give it a company name or domain and it finds which applicant tracking system the company uses — Greenhouse, Lever, Ashby, SmartRecruiters, Teamtailor, Personio, Workable or Recruitee — then returns every open role from it. One actor instead of eight.
Pricing
$3.00 / 1,000 job postings
Rating
0.0
(0)
Developer
Berkan Kaplan
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
18 days ago
Last modified
Categories
Share
Company Hiring Signals — Detect Any ATS & Pull Open Roles 🎯
foXLabs hiring series: Greenhouse · Lever · Ashby · Workday · SmartRecruiters · Personio · Teamtailor · LinkedIn jobs
🎉 Give it a domain or a company name — it finds which applicant tracking system that company uses, then pulls every open role from it. One actor instead of seven. No key, no login. Built for recruiters, sales teams scoring hiring intent, and anyone who does not know in advance which ATS a target runs.
🔍 What is this Actor — and when should you use it?
Companies post jobs on whichever ATS they bought — Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Personio or Teamtailor. You usually do not know which. This Actor detects the ATS automatically from a domain or company name, then returns that company's open roles as clean rows, with the same schema whichever system it found.
Use it when you need: hiring signals across a list of companies whose ATS you do not know; a one-shot check of what a target is hiring for; or a headcount-growth signal for account scoring. Set detectOnly to just identify the ATS without pulling roles.
Use something else when: you already know the ATS and want its deepest fields — then use the dedicated Actor for it from the series above. They share this schema, so outputs concatenate.
🤖 Use with AI agents
Already on the Apify MCP server? Ask for this Actor by name: foxlabs/company-hiring-signal-multi-ats.
Your agent can pay for its own runs. This Actor is pay-per-event with agentic payments, so an agent can discover it, run it and settle the bill over x402 (USDC on Base) or Skyfire — no Apify account or API token of its own. Billing is the same either way: per delivered job row.
Otherwise paste this into Claude, ChatGPT, Cursor or any MCP-enabled assistant:
Run the Apify actor foxlabs/company-hiring-signal-multi-ats with{"queries":["stripe.com","ramp","monzo.com"],"maxResultsPerQuery":25}and tell me which ATS each uses and what they are hiring for.
📋 Overview
| Source | Seven applicant tracking systems, detected automatically |
| Coverage | Any company running Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Personio or Teamtailor |
| Auth needed | None. No API key, no login, no proxy required |
| Row | One open role (or one detection result with detectOnly) |
| Measured run | 100 rows in 5.3 s for 4 companies (2026-09-20, build 0.1.8) |
| Pricing | $0.003 per delivered row — $3 per 1,000 |
✨ Features
- 🔍 ATS auto-detection — pass a domain or a name, it works out the system
- 🧩 One schema across seven systems — outputs concatenate into a single hiring table
- 📊
openRoleCounton every row — the company's total, not just the page you fetched - 🌍 Remote flag and location on every role
- 🏷️ Department on every role — the growth signal that matters for account scoring
- ⚡
detectOnlymode — identify the ATS without pulling roles - 🔗 Direct apply URL per role
🎬 Quick Start
curl -X POST "https://api.apify.com/v2/acts/foxlabs~company-hiring-signal-multi-ats/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"queries":["stripe.com","ramp","spotify","monzo.com"],"maxResultsPerQuery":25}'
🚀 Getting Started (3 steps)
- Put domains or company names into
queries. The default run mixes both forms. - Decide the depth.
maxResultsPerQuerycaps roles per company;detectOnly: truereturns just the ATS. - Run it. Rows arrive in the dataset; export to CSV/JSON/Excel or read them over the API.
📥 Input
| Field | Type | Default | Description |
|---|---|---|---|
queries | array | ["stripe.com","ramp","spotify","monzo.com"] | Company domains or names |
detectOnly | boolean | false | Only identify the ATS; do not pull roles |
maxResultsPerQuery | integer | 25 | Cap on roles returned per company |
maxConcurrency | integer | 3 | Parallel requests |
requestDelayMs | integer | 0 | Optional pause between requests |
includeRaw | boolean | false | Attach the untouched source record to each row |
proxyConfiguration | object | proxy off | The boards answer direct requests |
Example — which ATS does each company use?
{ "queries": ["stripe.com", "notion.so", "figma.com"], "detectOnly": true }
Example — deep pull for one company:
{ "queries": ["ramp"], "maxResultsPerQuery": 200 }
📤 Output
One row per open role. Fill rates from the measured run (100 rows, 4 companies, 2026-09-20):
| Field | Type | Fill | Description |
|---|---|---|---|
companyName | string | 100% | Company |
companyBoard | string | 100% | Board token/slug on the detected ATS |
ats | string | 100% | Which system was detected |
openRoleCount | number | 100% | Total open roles at the company |
jobId | string | 100% | Role id on the source system |
jobTitle | string | 100% | Role title |
department | string | 100% | Department or team grouping |
location | string | 100% | Location as the board publishes it |
isRemote | boolean | 100% | Remote flag |
applyUrl | string | 100% | Direct application link |
description | string | 95% | Full role description |
postedAt | string | 75% | Posting date, where the ATS exposes it |
employmentType | string | 50% | Full-time/contract, where the ATS exposes it |
sourceUrl | string | 100% | Source board URL |
source / query / scrapedAt | string | 100% | Provenance fields |
postedAt and employmentType are not at 100% because not every ATS publishes them — those two fields are the honest cost of covering seven systems with one schema. Cross-ATS fields that no system in this set exposes (team, separate city/country, seniority, salary, last-updated) were removed rather than shipped permanently empty.
A real row from the default run:
{"companyName": "Ramp","companyBoard": "ramp","jobTitle": "Security Engineer, Cloud","department": "Engineering","location": "New York, NY (HQ)","isRemote": true,"employmentType": "FullTime","postedAt": "2026-04-07"}
💼 Use cases
- Hiring-intent scoring —
openRoleCountand department mix tell you where a company is investing - Recruiter sourcing — open roles across a target list, regardless of ATS
- Sales timing — a company staffing up a function is a company buying tools for it
- Competitive watch — track a rival's engineering or sales headcount plans
- ATS market research —
detectOnlyacross a list shows which systems a segment runs
🔗 Integration
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('foxlabs/company-hiring-signal-multi-ats').call({queries: ['ramp'], maxResultsPerQuery: 25,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_TOKEN")run = client.actor("foxlabs/company-hiring-signal-multi-ats").call(run_input={"queries": ["ramp"], "maxResultsPerQuery": 25})items = client.dataset(run["defaultDatasetId"]).list_items().items
No-code: Make, n8n and Zapier reach this Actor through the Apify app — schedule it and push hiring signals into a CRM or a sheet.
📊 Pricing
Pay-per-event: job-posting — $0.003 per delivered row ($3 per 1,000). Compute and traffic are included; you pay for rows, not run time. Rows without a job id are not charged.
❓ FAQ
What if the company is not on any of the seven systems? The run reports that it could not detect a supported ATS rather than inventing rows.
Domain or company name — which works better? A domain is more reliable because detection follows the careers page. Names work when the board slug matches.
Can I just find out which ATS a company uses? Yes — detectOnly: true.
Why is employmentType only on half the rows? Some ATS platforms publish it, others do not. The percentage above is measured, not estimated.
Does it include salary? No — none of the systems in this set expose salary consistently, so the column was removed rather than shipped empty.
Is the schema the same as the single-ATS Actors? Yes. Outputs from this Actor and the seven dedicated ones concatenate into one table.
🐛 Troubleshooting
Detection fails for a company you know is hiring. They may run an ATS outside this set (or a custom careers page). Try the domain rather than the name.
Fewer roles than the company's careers page shows. maxResultsPerQuery caps per company — openRoleCount on each row tells you the true total.
A role looks stale. Boards keep filled roles up for a while; postedAt helps where the ATS publishes it.
⚠️ Trademark
Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Personio and Teamtailor are trademarks of their respective owners. This Actor is an independent tool, is not affiliated with or endorsed by any of them, and reads only publicly published job boards.
⚖️ Is it legal to scrape this data?
Company job boards are published for candidates to read. The rows this Actor returns are role listings and company-level hiring signals — business information. Role descriptions occasionally name a hiring manager; that content comes from the employer's own public posting. You remain responsible for how you use the output.
🤝 Support & contact
Questions, a field you need, or a bug: info@foxlabs.com.tr — or open an issue on the Actor's Apify page.
Changelog
0.1.8
- Removed permanently-empty columns (team, city, countryName, seniority, salary, updatedAt) — no ATS in this set exposes them. Row went from 23 columns to 17, with zero permanently-empty columns left.
0.1
- Automatic ATS detection across seven systems, with a shared job schema and
detectOnlymode. - Pay-per-event billing on delivered rows (
job-posting).