ATS Hiring Signal Radar
Pricing
from $20.00 / 1,000 company scanneds
ATS Hiring Signal Radar
Turn public ATS job changes into company-level hiring intent signals. Monitor Greenhouse, Lever, Ashby to detect first hires, team buildouts, geo expansion, and function-specific buying signals.
Pricing
from $20.00 / 1,000 company scanneds
Rating
0.0
(0)
Developer
Juyeop Park
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
0
Monthly active users
15 days ago
Last modified
Categories
Share
Monitor target accounts on public Greenhouse, Lever, and Ashby boards, then turn job-posting changes into explainable hiring-intent signals for SDR, RevOps, and founder-led sales workflows.
This Actor helps prioritize when to investigate an account and what hiring evidence to reference. Hiring activity is a sales-research signal, not proof that a company will buy.
Quickstart: monitor 3 target accounts
Start with three public ATS boards and a hard company cap. A small run typically completes in under five minutes, but ATS availability can affect run time.
{"companies": [{"name": "Stripe","domain": "stripe.com","boardUrl": "https://boards.greenhouse.io/stripe","tags": ["target-account", "fintech"]},{"name": "Spotify","domain": "spotify.com","boardUrl": "https://jobs.lever.co/spotify","tags": ["target-account", "media"]},{"name": "Linear","domain": "linear.app","boardUrl": "https://jobs.ashbyhq.com/linear","tags": ["target-account", "dev-tools"]}],"changesOnly": false,"triggerPack": "all","minConfidence": 0.3,"maxCompaniesPerRun": 3,"emitSignalsOnFirstScan": false,"snapshotNamespace": "starter-pack-sales-accounts"}
What to expect
- First run = baseline. The Actor records current jobs. With
emitSignalsOnFirstScan: false, each successfully processed company is labeled as a baseline rather than a new signal. - Later runs = deltas. Reuse the same
snapshotNamespace, setchangesOnly: true, and run daily or weekly. Dataset rows appear only for companies whose jobs changed;RUN_SUMMARYis still written for the run. - Route completed runs. An Apify
ACTOR.RUN.SUCCEEDEDwebhook can notify Make, Zapier, or your own endpoint, which can fetch the Dataset andRUN_SUMMARYbefore posting selected fields to Slack or a CRM.
Optional immediate demo vs. normal monitoring
The quickstart above is the recommended monitoring path: emitSignalsOnFirstScan stays false, so the first run is a clean baseline.
To inspect populated signal fields immediately, run one company once with emitSignalsOnFirstScan: true and a separate demo namespace:
{"companies": [{"name": "Stripe","domain": "stripe.com","boardUrl": "https://boards.greenhouse.io/stripe","tags": ["target-account", "fintech"]}],"changesOnly": false,"triggerPack": "all","minConfidence": 0.3,"maxCompaniesPerRun": 1,"emitSignalsOnFirstScan": true,"snapshotNamespace": "starter-pack-immediate-demo"}
Demo mode compares all current roles with an empty snapshot, so it can populate intentEvent, whyNow, and recommendedAngle while isFirstScan is still true. It is not a measured hiring delta or purchase-intent proof. Use the normal false path and a stable production namespace for scheduled monitoring.
Cost guardrail
At the current event prices, three successfully processed companies create up to $0.06 in company-scanned events. Actor-start events are separate and depend on selected memory (the current 4 GB default is about $0.0002 per run). These are estimates; check the current Pricing tab before scheduling larger account lists.
Why This Actor?
Raw job scrapers return listings. This Actor adds monitoring context.
| Raw job data | This Actor |
|---|---|
| "Acme has 23 open roles" | "Acme added RevOps roles; evaluate a CRM or pipeline-tooling outreach hypothesis" |
| Job listing dump | Named hiring-intent event with confidence and evidence |
| One-time snapshot | Namespaced snapshots for scheduled change detection |
| Manual row filtering | signalScore, whyNow, and recommendedAngle fields for account research |
No login or proxy is required for the three supported public ATS APIs. External provider availability and API behavior can still change.
Who Is It For
Primary buyer: B2B SDR, RevOps, or founder-led sales operators.
Use this Actor when your job is to monitor a defined target-account list and prepare an evidence-backed outreach hypothesis after public ATS changes. It is not positioned as a general-purpose recruiter job scraper.
Supported ATS Platforms
| Platform | Method | Auth Required | Proxy Needed | Region |
|---|---|---|---|---|
| Greenhouse | Official Job Board API | No | No | Global |
| Lever | Official Postings API | No | No | US + EU |
| Ashby | Official Public API | No | No | Global |
Only these three providers are supported in the current release. Workday, Rippling, BambooHR, and JazzHR are not currently supported.
Key Features
10 Intent Triggers Across 3 Packs
Pre-built detection patterns that convert raw job deltas into named, explainable events:
GTM Pack — Sales, Marketing, RevOps signals
| Trigger | Fires When | Recommended Angle |
|---|---|---|
first_revops_buildout | First Sales Ops / CRM / Salesforce role appears | CRM, pipeline visibility, forecasting |
sales_team_expansion | 3+ new sales roles posted | Sales enablement, lead gen, outreach tools |
marketing_ramp | 2+ new marketing roles posted | Marketing automation, ABM, analytics |
Engineering Pack — Dev, Security, Data, AI signals
| Trigger | Fires When | Recommended Angle |
|---|---|---|
ai_platform_buildout | First ML/AI/LLM role appears | MLOps, GPU infra, vector DBs, LLM tooling |
first_security_hire | First security role with no prior security team | SIEM, compliance, identity management |
engineering_surge | 5+ new engineering roles posted | Dev tools, CI/CD, cloud infra, observability |
data_team_buildout | 2+ new data roles posted | Data warehousing, ETL, BI platforms |
Expansion Pack — Geo, Leadership, New Functions
| Trigger | Fires When | Recommended Angle |
|---|---|---|
geo_expansion | Jobs posted in previously unseen locations | Localization, compliance, local partnerships |
leadership_hiring | 2+ director/VP/C-level roles posted | Org restructuring, strategic planning |
new_function_launch | Entirely new function (e.g. legal, finance) appears | Function-specific tooling, consulting |
Snapshot Diffing
Automatically stores and compares job snapshots between runs:
- New roles added since last scan
- Roles removed (filled or closed)
- Net headcount change
- Function distribution shifts (engineering vs. sales vs. marketing...)
Signal Scoring
Each company receives a 0-100 signal score:
- high (70+) — Strong hiring momentum with clear intent triggers
- medium (40-69) — Notable changes worth monitoring
- low (15-39) — Minor activity detected
- none (0-14) — Stable or no meaningful changes
First Scan Behavior
For normal monitoring, keep emitSignalsOnFirstScan: false. The first scan stores a baseline without signals; later runs compare against that snapshot.
Setting emitSignalsOnFirstScan: true is an optional demonstration mode. It evaluates the current board against an empty snapshot and may populate signal fields immediately, but the row remains a first-scan baseline and is not a real period-over-period delta.
Input
Full Input Reference
| Field | Type | Default | Description |
|---|---|---|---|
companies | array | required | List of companies to monitor. Each needs name and ideally boardUrl. |
changesOnly | boolean | false | Only output companies with changes since last run. Ideal for scheduled alerts. |
triggerPack | string | "all" | Which triggers to run: all, gtm, engineering, or expansion. |
minConfidence | number | 0.3 | Only report signals above this confidence (0.0 - 1.0). |
maxCompaniesPerRun | integer | 100 | Cap companies per run to control cost. Max 1000. |
emitSignalsOnFirstScan | boolean | false | Emit signals even on the first scan (normally suppressed for baseline). |
snapshotNamespace | string | auto | Custom namespace for snapshot storage. Useful for separate monitoring contexts. |
Company Object
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Company name |
domain | string | No | Company domain (e.g. stripe.com). Used for auto-detection. |
boardUrl | string | No | Direct ATS board URL. Recommended for reliable detection. |
tags | string[] | No | Custom tags for filtering (e.g. "competitor", "prospect", "portfolio") |
Scheduled Monitoring Input
Use this input for the first baseline run. After it succeeds, keep the same snapshotNamespace and change only changesOnly to true for the scheduled Task.
{"companies": [{"name": "Stripe","domain": "stripe.com","boardUrl": "https://boards.greenhouse.io/stripe","tags": ["target-account", "fintech"]},{"name": "Spotify","domain": "spotify.com","boardUrl": "https://jobs.lever.co/spotify","tags": ["target-account", "media"]},{"name": "Linear","domain": "linear.app","boardUrl": "https://jobs.ashbyhq.com/linear","tags": ["target-account", "dev-tools"]}],"changesOnly": false,"triggerPack": "all","minConfidence": 0.3,"maxCompaniesPerRun": 3,"emitSignalsOnFirstScan": false,"snapshotNamespace": "starter-pack-sales-accounts"}
Output
Each successfully processed company produces one Dataset record unless changesOnly: true filters an unchanged company. Skipped or failed companies do not produce a result row.
Output Fields Reference
| Field | Type | Description |
|---|---|---|
company | string | Company name |
domain | string | Company domain |
tags | string[] | User-provided tags |
provider | string | ATS provider (greenhouse, lever, ashby) |
slug | string | ATS board slug |
boardUrl | string | Full ATS board URL |
intentEvent | string | Primary trigger ID (e.g. first_revops_buildout) or no_signal |
intentLabel | string | Human-readable trigger label |
signalScore | number | 0-100 composite signal score |
signalStrength | string | high, medium, low, or none |
confidence | number | Confidence of the primary signal (0.0 - 1.0) |
whyNow | string[] | Evidence array explaining why this signal fired |
recommendedAngle | string | Suggested outreach angle or use case |
allSignals | object[] | All detected signals (not just primary) |
newRoles | number | New roles since last scan |
removedRoles | number | Removed roles since last scan |
netChange | number | Net headcount change |
totalOpenRoles | number | Current total open roles |
previousOpenRoles | number | Total open roles at last scan |
isFirstScan | boolean | Whether this is the first scan for this company |
functionDistribution | object | Role count by function (engineering, sales, data...) |
newJobDetails | object[] | Detailed new job info (only in changesOnly mode) |
scannedAt | string | ISO timestamp of this scan |
snapshotAge | string | ISO timestamp of previous snapshot |
Actual Baseline Output (public latest smoke)
The proposed three-company quickstart was run on public build 1.0.14 / v38fugaIfthTTrCTI on 2026-07-14. This selected-field Dataset row shows normal first-run semantics:
{"company": "Linear","provider": "ashby","intentEvent": "no_signal","signalScore": 0,"whyNow": [],"recommendedAngle": "","newRoles": 24,"totalOpenRoles": 24,"isFirstScan": true}
Actual Immediate-Demo Output (unchanged runtime, local validation)
A one-company validation run used emitSignalsOnFirstScan: true. The current Stripe board was evaluated against an empty snapshot and produced these selected fields:
{"company": "Stripe","provider": "greenhouse","intentEvent": "sales_team_expansion","intentLabel": "Sales Team Expansion","signalScore": 84,"signalStrength": "high","confidence": 0.95,"whyNow": ["Account Executive, AI Sales (Grower) posted","Account Executive, Commercial Grower (Japanese Fluency) posted","Account Executive, Commercial Hunter (Japanese Fluency) posted","Account Executive, Cross Border China posted","Account Executive - Enterprise, Grower posted"],"recommendedAngle": "Sales enablement, lead generation, outreach tooling","newRoles": 523,"totalOpenRoles": 523,"isFirstScan": true}
These values are time-sensitive public job-board observations, not guaranteed future output. The demo row is still a baseline; it is not a later-run delta or proof of buying intent.
The following actual RUN_SUMMARY came from the public three-company baseline smoke and was stored separately in the Key-Value Store:
{"totalCompanies": 3,"processed": 3,"skipped": 0,"signalsDetected": 0,"errors": 0,"triggerPack": "all","changesOnly": false,"completedAt": "2026-07-14T07:56:50.465Z"}
Schedule Weekly Monitoring
Use one Apify Task so the input and snapshot context remain stable:
- Create a Task with the Starter Pack input and a unique, stable
snapshotNamespacefor this account list. - Run the Task once with
changesOnly: false. This baseline run records current roles. A normal first run does not imply that no hiring exists; it means no prior snapshot was available for comparison. - Change only
changesOnlytotrue. Keep the same company list andsnapshotNamespace. - Attach a daily or weekly Apify Schedule to that Task. A Schedule is time-based; it does not wait for a separate upstream workflow.
- Add an
ACTOR.RUN.SUCCEEDEDwebhook to Make, Zapier, or your own endpoint. The receiver can fetch:- Dataset items for companies with detected changes;
RUN_SUMMARYfor processed/skipped/signal/error counts;intentEvent,signalScore,whyNow, andrecommendedAnglefor Slack or CRM formatting.
- Treat an empty Dataset as “no changed companies for this run,” not as a failed run. Check
RUN_SUMMARYand the run status before deciding whether to notify a sales channel.
Use a separate snapshotNamespace for each distinct account list or monitoring workflow. Raising minConfidence to 0.5 can reduce lower-confidence signal rows, but does not guarantee sales relevance.
Pricing
This Actor uses pay-per-event (PPE) pricing with two existing events:
company-scanned: $0.02 for each company successfully processed;apify-actor-start: $0.00005 per GB when the Actor starts (one event per GB, minimum one).
The company-scanned event is not charged for a company that is skipped or fails. The Actor-start charge remains separate.
| Company outcome | company-scanned events |
|---|---|
| Company scanned and a result returned | 1 |
| ATS board not found or unsupported | 0 |
changesOnly mode with no changes | 0 |
| Suspicious data drop awaiting confirmation | 0 |
| Processing error | 0 |
Estimated company-scan cost at $0.02/event
| Companies | Frequency | Estimated events/month | Estimated company-scan cost |
|---|---|---|---|
| 50 | Daily | ~1,500 | ~$30/month |
| 100 | Daily | ~3,000 | ~$60/month |
| 200 | Daily | ~6,000 | ~$120/month |
| 200 | Weekly | ~800 | ~$16/month |
These estimates assume every listed company is successfully processed on every run. Actor-start events and any current platform charges are separate; verify the Pricing tab before enabling a large schedule.
Changelog
v1.0.0
- Initial release
- Greenhouse, Lever (US + EU), Ashby support
- 10 intent triggers across GTM, Engineering, Expansion packs
- Snapshot diffing with signal scoring
- First-scan baseline capture (false positive prevention)
- Retry/timeout handling with exponential backoff
- Namespaced snapshot storage for multi-context monitoring