ATS Hiring & Competitor Intelligence avatar

ATS Hiring & Competitor Intelligence

Pricing

from $1.20 / 1,000 hiring intelligence jobs

Go to Apify Store
ATS Hiring & Competitor Intelligence

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

DataHunter Labs

Maintained by Community

Actor 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, and skills classifications.
  • 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, and removed jobs without falsely calling the first run new.
  • onlyChangedJobs=true turns 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.txt
python -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.