ATS Hiring & Competitor Intelligence
Pricing
from $1.20 / 1,000 hiring intelligence jobs
ATS Hiring & Competitor Intelligence
Monitor hiring signals across Greenhouse, Lever, and Ashby public job boards with normalized jobs, skills, seniority, functions, remote status, salary data where structured, and change detection.
Pricing
from $1.20 / 1,000 hiring intelligence jobs
Rating
0.0
(0)
Developer
DataHunter Labs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
13 hours ago
Last modified
Categories
Share
Commercial Apify Actor for monitoring public hiring signals across Greenhouse, Lever (global/EU), and Ashby. It uses the ATS providers' public JSON APIs, normalizes jobs into one schema, enriches them with deterministic hiring intelligence, and tracks changes between runs.
What it does
- Accepts public board URLs or tagged slugs such as
greenhouse:stripe,lever:spotify,lever-eu:company,ashby:ramp. - Returns normalized current jobs with title, department/team, location, workplace type, employment type, URLs, timestamps, and structured salary fields where the source provides them.
- Adds deterministic
jobFunction,seniority, andskillsclassifications. - Redacts common email addresses and phone numbers from plain-text descriptions.
- Produces free per-company summaries: open jobs, remote/hybrid counts, salary coverage, top functions, seniority, skills, and locations.
- Monitoring mode detects
baseline,new,changed,unchanged, andremovedjobs without falsely calling the first run new. onlyChangedJobs=trueturns scheduled runs into a low-noise change feed after the baseline.
Sources
The Actor uses public ATS endpoints only:
- Greenhouse Job Board API:
GET /v1/boards/{board_token}/jobs?content=true - Lever Postings API:
GET /v0/postings/{site}?mode=json(global and EU) - Ashby Job Postings API:
GET /posting-api/job-board/{board}?includeCompensation=true
No login, browser, private API, candidate data, or CAPTCHA solving is used.
Reliability and cost controls
Direct HTTP is tried first. The configured Apify/custom proxy is only a fallback for blocking or transient failures. Retries are bounded with backoff, request count has a hard budget, concurrency is bounded, cache is Actor-scoped, and monitoring state is keyed by board plus filters. A bad board produces a diagnostic row without killing other boards.
Billing
The prepared PPE event is job-returned at $0.0012 per fresh useful job row ($1.20 / 1,000). Company summaries, removed-job rows, diagnostics, retries, proxy rotations, cached rows, and unchanged monitoring rows are not charged by the custom event. Actual Store monetization must still be configured in Apify Console.
Example
{"boards": ["greenhouse:stripe","lever:spotify","ashby:ramp"],"maxJobsPerBoard": 100,"monitorChanges": true,"onlyChangedJobs": false,"remoteOnly": false}
Limits
This is a current-open-jobs monitor, not a historical jobs archive. Fields differ by ATS; missing source data is returned as null rather than guessed. The Actor intentionally does not parse arbitrary free-text salary ranges into numeric pay fields. Source providers may change their public APIs; diagnostics and bounded failure handling are designed to fail visibly rather than return fake data.
Local verification
Test-only dependencies are intentionally kept out of the production Docker image. Before running the regression suite locally:
python -m pip install -r requirements-test.txtpython -m pytest -q
pytest-asyncio is required because the network, billing, proxy, and integration regression tests are asynchronous.
Remote eligibility semantics
workplaceType preserves the strongest/source-native classification (remote, hybrid, on-site, or unknown). remoteEligible is a separate boolean that is true when a role has an explicit remote option in its ATS locations. Therefore a multi-location role can legitimately have workplaceType: "hybrid" and remoteEligible: true. company_summary.remoteJobs counts remote-eligible jobs, while hybridJobs counts hybrid-classified jobs; these metrics can overlap by design. The remoteOnly input uses remoteEligible, so remote-capable hybrid/multi-location roles are not dropped.