Company Hiring Signals Scraper | Open Roles, ATS & Growth
Pricing
from $1.60 / 1,000 jobs
Company Hiring Signals Scraper | Open Roles, ATS & Growth
Company domains or career/ATS URLs in → who is hiring, for what, where and how fast. Reads Greenhouse, Lever, Ashby, SmartRecruiters, Recruitee & Workday boards: open roles by function/location, remote share, hiring velocity, new roles since last run + every job. No API key. $1.60 per 1,000 jobs.
Pricing
from $1.60 / 1,000 jobs
Rating
0.0
(0)
Developer
Mr Zack
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 hours ago
Last modified
Categories
Share
Company Hiring Signals Scraper | Open Roles, ATS & New Jobs by Domain
Give it a list of company domains (or careers / ATS URLs) and get back who is hiring, for what, where and how fast — straight from each company's applicant tracking system (Greenhouse, Lever, Ashby, SmartRecruiters, Recruitee, Workday). One company-signal row per company (open roles, roles by function, remote share, hiring velocity, new roles since your last run) plus one job row per open role. HTTP-only, pay per result ($1.60 / 1,000 jobs · $4 / 1,000 company signals · $0.001 start), MCP-ready. No API key, no login, no proxies.
Who uses it and why
- Sales / SDR teams & agencies — a company that just opened 5 SDR roles is buying sales tooling; 12 new data-engineering roles = infra budget. Feed your account list, get the hiring signal, prioritize outreach. Pair with Contact Details Scraper for emails.
- Recruiting agencies — find which target accounts are actively hiring for your specialty (
keywords: ["account executive"],postedWithinDays: 14) and pitch them first. - Job boards & aggregators — clean, normalized postings (title, department, location, remote, type, posted date, salary when disclosed, apply URL) from career sites, without scraping HTML.
- Investors / analysts / competitive intel — headcount intent by function and location for a watchlist of companies, refreshed daily with
onlyNew. - AI agents — "Which of these 50 companies is hiring salespeople in London right now?" is a single Actor call via MCP.
How it finds the jobs
- Direct ATS URL —
boards.greenhouse.io/x,jobs.lever.co/x,jobs.ashbyhq.com/x,jobs.smartrecruiters.com/X,x.recruitee.com,x.wd5.myworkdayjobs.com/Siteare used as-is. - Domain / website URL — fetches the homepage, follows the careers link (up to 2 hops), and looks for ATS references (embeds, links, API calls).
- Slug guess — if the site hides its ATS, tries the domain label on Greenhouse, Lever, Ashby, Recruitee and SmartRecruiters and keeps it only when a real board with jobs comes back (flagged
discovery: "slug-guess"). - Jobs are read from the ATS's public JSON API (Workday via its
cxsendpoint, paginated) — the same data the career site renders, so fields are exact.
Companies with no detectable / supported ATS (custom career sites, iCIMS, Jobvite, SuccessFactors, Workable without a public list) produce a free company-not-found row with the careers URL that was found, so you know what to check by hand.
Input
| Field | Type | Default | Notes |
|---|---|---|---|
companies | list | 4 demo companies | Domains, website / careers URLs or ATS board URLs, one per line. Duplicates are merged. |
keywords | list | – | Keep roles whose title / department / team contains any keyword (case-insensitive). |
excludeKeywords | list | – | Drop roles matching any of these. |
locations | list | – | Substring match on location / country. Remote matches remote roles. |
remoteOnly | boolean | false | Only remote roles. |
postedWithinDays | integer | 0 | 0 = no age filter. Workday dates are approximate ("Posted 3 Days Ago"). |
maxJobsPerCompany | integer | 200 | Cap before filters (max 5,000). Big employers list 1,000+ roles. |
includeJobs | boolean | true | Push one row per role (charged as job). Off = signals only. |
includeCompanySignal | boolean | true | Push one row per company with a found board (charged as company-signal). |
includeDescription | boolean | false | Full plain-text description (≤ 5,000 chars) instead of a 500-char snippet. Not available from Workday / SmartRecruiters list APIs. |
onlyNew | boolean | false | Monitor mode — remembers job ids per board in a named key-value store; later runs push only new roles and fill newRoles. |
Output
company-signal row (one per company with a board)
| Field | Description |
|---|---|
company, domain, ats, atsBoardUrl, careersUrl, discovery | Identity, ATS vendor, board URL, how it was found (input-url / homepage / careers-page / slug-guess). |
openRoles | Total roles on the board (before your filters / cap). |
matchedRoles, newRoles | Roles after filters; roles not seen in the previous run (monitor mode). |
remoteRoles, remoteShare, rolesWithSalary | Remote count / % and how many roles disclose pay. |
postedLast7d, postedLast30d, hiringVelocityPerWeek, newestPostedAt, oldestPostedAt | Freshness of the pipeline (when the ATS exposes posting dates). |
byFunction, engineeringRoles, salesRoles, salesToEngineeringRatio | Roles bucketed into engineering / sales / marketing / product / customer / operations / finance / people / legal / other. |
topDepartments, topLocations, employmentTypes, topTitles | Top 8 departments and locations with counts, employment-type mix, first 10 titles. |
isHiring, isNew, scrapedAt | isNew = company seen for the first time in monitor mode. |
job row (one per open role)
| Field | Description |
|---|---|
company, domain, ats, jobId | Which board the role belongs to. jobId is stable per ATS (used for monitor mode). |
title, department, team, employmentType | As published. |
location, locations, isRemote | Primary location, all locations, remote flag (from the ATS or the location / title text). |
postedAt, updatedAt | ISO timestamps where the ATS provides them. |
url, applyUrl | Job page and application page. |
salary | {min, max, currency, text} when disclosed in structured fields or the description. |
description | 500-char snippet, or full text with includeDescription. |
extra | Vendor specifics: requisition id, offices, workplace type, experience level, industry, tags, country. |
isNew, scrapedAt | Monitor flag and run time. |
Free company-not-found rows: company, domain, careersUrl, reason, tried.
The run's SUMMARY key-value record has counts: companies, atsFound, byVendor, jobsFetched, jobsPushed, signals, notFound, slugGuesses, requests.
Example output (one real row, 8 Sep 2026)
{"type": "company-signal", "company": "Stripe", "domain": "stripe.com", "ats": "greenhouse","atsBoardUrl": "https://boards.greenhouse.io/stripe", "careersUrl": "https://stripe.com/careers", "discovery": "slug-guess","openRoles": 619, "matchedRoles": 619, "newRoles": null, "remoteRoles": 100, "remoteShare": 16, "rolesWithSalary": 13,"postedLast7d": 80, "postedLast30d": 218, "hiringVelocityPerWeek": 50.9, "newestPostedAt": "2026-09-07T18:53:00.000Z", "oldestPostedAt": "2023-03-21T16:01:12.000Z","byFunction": { "engineering": 220, "sales": 97, "operations": 80, "customer": 62, "other": 42, "marketing": 41, "product": 36, "finance": 18, "people": 14, "legal": 9 },"engineeringRoles": 220, "salesRoles": 97, "salesToEngineeringRatio": 0.44,"topDepartments": [ { "name": "Account Executives (EMEA)", "count": 18 }, { "name": "Global Operations", "count": 17 } ],"topLocations": [ { "name": "Singapore", "count": 46 }, { "name": "Dublin", "count": 30 }, { "name": "Bengaluru", "count": 29 } ],"isHiring": true, "isNew": null, "scrapedAt": "2026-09-08T03:30:28.493Z"}
{"type": "job", "company": "Stripe", "domain": "stripe.com", "ats": "greenhouse", "jobId": "8172487","title": "Abuse Investigator", "department": "8611 Security Analytics", "team": null, "location": "Dublin", "locations": ["Dublin"],"isRemote": false, "employmentType": null, "postedAt": "2026-09-03T17:30:34.000Z", "updatedAt": "2026-09-04T18:12:20.000Z","url": "https://stripe.com/jobs/search?gh_jid=8172487", "applyUrl": "https://stripe.com/jobs/search?gh_jid=8172487","salary": null, "description": "Who we are. About Stripe. Stripe is a financial infrastructure platform for businesses…", "extra": { "requisitionId": "See Opening ID", "offices": ["Ireland Locations"] }}
Cost of that run (4 demo companies, 200-role cap): 4 signals × $0.004 + ~420 jobs × $0.0016 + $0.001 start ≈ $0.69. Signals-only run (includeJobs: false) for 100 companies ≈ $0.40.
Schedule it (hiring monitor)
Create a Schedule in Apify Console (daily is the sweet spot — ATS boards change a few times a day) with your account list and onlyNew: true. Each run then returns only roles that appeared since the last run plus the updated company-signal rows (newRoles > 0 = the account just opened positions). Push the dataset to Google Sheets, Slack or your CRM with an integration, or read it via API:
https://api.apify.com/v2/acts/tactful_anvil~company-hiring-signals-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN
Example input for an SDR team selling to sales orgs:
{ "companies": ["stripe.com", "linear.app", "gopuff.com", "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],"keywords": ["account executive", "sdr", "bdr", "sales development", "revenue"], "postedWithinDays": 14, "onlyNew": true }
Use with AI agents (MCP)
Add the Actor to your Apify MCP server (https://mcp.apify.com with tools=tactful_anvil/company-hiring-signals-scraper) and ask: "Which of these companies are hiring engineers in Europe this month?" — the agent passes the domains, sets keywords / locations / postedWithinDays, and reads the company-signal rows first (cheap), then jobs for the interesting ones. Deterministic JSON, stable field names, one row per fact — no HTML for the agent to interpret.
Limits & honesty
- Supported ATS with public list APIs: Greenhouse, Lever, Ashby, SmartRecruiters, Recruitee, Workday. Workable is detected (vendor + board URL in the free row) but its list API is not public. iCIMS, Jobvite, SuccessFactors, Taleo, BambooHR, Personio and fully custom career sites are reported as
company-not-found— free. - Slug guessing can pick a same-named company on a shared board host; rows are flagged
discovery: "slug-guess"so you can review them. - Workday list pages give relative dates ("Posted 3 Days Ago") and no department; descriptions require the job page (not fetched).
postedAtreflects what the ATS exposes (Greenhousefirst_published, LevercreatedAt, AshbypublishedAt, SmartRecruitersreleasedDate, Recruiteepublished_at).- Rate: ~4 companies in parallel, one request per board page. 100 companies ≈ 1–3 minutes.
Related Actors
- LinkedIn Jobs Scraper — Full Description, Salary & Applicants — search jobs across all companies by keyword / location.
- Contact Details Scraper — emails, phones and socials for the companies that are hiring.
- Ad Budget Signals — are these companies also running ads? Combine both signals for account scoring.
- Bulk Email Verifier — verify the addresses before outreach.
Changelog
- 0.1.0 (8 Sep 2026) — first release: 6 ATS list APIs, homepage → careers → slug discovery, keyword / location / remote / age filters, company-signal aggregation (functions, velocity, remote share), monitor mode, free not-found rows.
Found this useful? Bookmark & review
If this Actor saves you a scraping pipeline, a ⭐ review and a bookmark help other sales and recruiting teams find it. Missing an ATS you need? Open an issue with a careers URL and I'll look at adding it.