Hiring Intent Scraper — Greenhouse, Lever & Ashby ATS avatar

Hiring Intent Scraper — Greenhouse, Lever & Ashby ATS

Pricing

from $1.50 / 1,000 company returneds

Go to Apify Store
Hiring Intent Scraper — Greenhouse, Lever & Ashby ATS

Hiring Intent Scraper — Greenhouse, Lever & Ashby ATS

Turn public ATS job boards into company-level hiring intent signals. Detects Greenhouse, Lever, Ashby, Workable and Recruitee from a company domain and returns one scored row per company — new roles, top department and growth velocity — not a list of jobs.

Pricing

from $1.50 / 1,000 company returneds

Rating

0.0

(0)

Developer

Renan Teles

Renan Teles

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 hours ago

Last modified

Share

Turn public ATS job boards into company-level hiring intent data. One scored row per company — not a job list.


What does Hiring Intent Scraper do?

Most job scrapers hand you a pile of job postings and leave the analysis to you. This one answers the question you actually have: which of these companies is scaling right now, in which department, and how fast?

Give it a list of company domains. It finds each company's applicant tracking system (ATS), reads the public job board, and returns one scored row per company with a hiring intent signal — new roles in your window, the department they cluster in, seniority mix, and a 0–100 score.

No login. No API key. No browser automation. It reads the same public feeds that job aggregators read.

Hiring Intent Scraper allows you to:

  • Detect hiring surges before they show up on job boards or LinkedIn
  • Score companies by hiring intensity relative to their size, not raw headcount
  • See where the money is going — the department that new roles cluster in
  • Filter out frontline noise — store, warehouse and shift roles are classified separately from corporate hiring
  • Work from domains, not board URLs — ATS detection is automatic
  • Feed a CRM or sequencer with timing signals, not static firmographics

Why one row per company, not one row per job?

Here is the same company, both ways.

Gopuff has 784 open roles. A job scraper returns 784 rows and an SDR opens the file thinking there is a hiring surge happening.

This Actor returns one row:

companysignalscorenew roles (30d)top department
Gopuffquiet75marketing

Gopuff opened 24 roles in the window. Nineteen were frontline — delivery, warehouse, store. Corporate hiring: five roles. That is not a surge, and the score says so.

Compare a real signal from the same run:

companysignalscorenew roles (30d)top department
Elastichot83189engineering
Stripegrowing51248sales
Rampsteady5048sales
Sweetgreensteady287operations
Linearquiet184engineering
Gopuffquiet75marketing

Six rows, six decisions. Sweetgreen — a restaurant chain — scores 28 despite opening 27 roles, because 20 of them are store-level and classified as frontline. Elastic tops the list with 137 of its 189 new roles in engineering.

That table is the product.


What data can I extract?

🏢 Company identity📊 Hiring volume
Company nameTotal open roles
DomainNew roles in window
ATS platformWindow length (days)
Job board URLRoles truncated flag
🎯 Signal🧭 Breakdown
Signal score (0–100)New roles by department
Signal labelNew roles by seniority
Top departmentRemote ratio
Detection confidenceRole class split (corporate / frontline)
📝 Context⏱️ Metadata
Sample job titlesScraped at
Top department countRole classes included

Optionally, set includeJobRows to also get the individual normalized job rows behind each company's score.


Which ATS platforms are supported?

ATSSupported
Greenhouse
Lever
Ashby
Workable
Recruitee
SmartRecruiters

Expect roughly 50% coverage on a mixed domain list. Measured: on a list of 179 mixed domains, 95 resolved. Many companies run Workday, Taleo, SuccessFactors or a custom careers page — those are not supported and are reported as not detected.

Domains where no supported ATS is found are never charged. You pay only for companies that were actually analysed.


How much will it cost?

EventPrice
Company returned$1.50 / 1,000
Company screened$0.20 / 1,000
Actor start$0.00005

Platform usage (compute, storage) is included — no separate usage bill.

Company screened fires for every company successfully analysed. Company returned fires for every row actually delivered to your dataset after your filters.

What that looks like in practice:

InputCost
100 domains, ~50 detected$0.09
1,000 domains, ~500 detected$0.85
5,000 domains, ~2,500 detected$4.25

The Apify Free plan's monthly credits cover a few thousand domains per month.


How to use Hiring Intent Scraper

No coding required.

  1. Create a free Apify account
  2. Open Hiring Intent Scraper
  3. Paste your company domains into the Domains field — one per line, stripe.com style
  4. Set Window days (default 30) and, if you want, a Minimum signal score
  5. Click Start and wait
  6. Download the results as JSON, CSV, Excel or HTML — or pull them through the API

The output opens in a Call list view by default: company, signal, score, new roles, top department.


How to use hiring intent data

  • Time your outbound. A company that opened five sales roles this month is building a revenue team right now. Reach them while the budget is being spent, not after.
  • Prioritise a cold list. Run 1,000 domains you already have and sort by score. Work the top 5% first.
  • Find agency clients. A company with a hiring surge and no recruiting team is a staffing lead.
  • Track accounts. Schedule a weekly run on your target list and watch which accounts turn hot.
  • Research a market. Aggregate by department to see where an entire sector is investing.
  • Feed an AI agent. Clean, typed JSON with no login, ready for your pipeline.

Input parameters

To run this Actor you must provide one field:

Domains (domains) — an array of company domains or job board URLs, e.g. ["stripe.com", "ramp.com"]

Everything else is optional:

  • Window days (windowDays) — how far back a role counts as "new". Default 30, range 7–180.
  • Role classes (roleClasses) — corporate, frontline, or both. Default: corporate only.
  • Departments (departments) — restrict the analysis to specific departments (engineering, sales, marketing, product, design, data, finance, hr, operations, support, legal, clinical, other). Default: all.
  • Minimum signal score (minSignalScore) — only return companies scoring at or above this. Default 0, range 0–100.
  • Max companies (maxCompanies) — cap the number of companies processed. Default 100, range 1–5,000.
  • Max roles per company (maxRolesPerCompany) — cap roles collected per company. Default 500, range 10–2,000.
  • Max concurrency (maxConcurrency) — parallel companies. Default 3, range 1–10. Kept low on purpose: these are other people's public endpoints.
  • Include job rows (includeJobRows) — also write the individual normalized jobs. Default false.

Input examples

Basic — score a prospect list

{
"domains": ["stripe.com", "ramp.com", "elastic.co", "linear.app"],
"windowDays": 30
}

Only the hot ones, sales hiring only

{
"domains": ["stripe.com", "ramp.com", "elastic.co"],
"windowDays": 30,
"departments": ["sales"],
"minSignalScore": 50
}

Include frontline hiring (retail, warehouse, shift roles)

{
"domains": ["gopuff.com", "sweetgreen.com"],
"windowDays": 60,
"roleClasses": ["corporate", "frontline"]
}

Results

Each company becomes one item in the dataset. This is a real row, copied from a run:

{
"company": "Elastic",
"domain": "elastic.co",
"ats_type": "greenhouse",
"detection_confidence": "high",
"job_board_url": "https://job-boards.greenhouse.io/elastic",
"total_open_roles": 358,
"window_days": 30,
"new_roles_window": 189,
"new_roles_by_department": {
"finance": 9,
"engineering": 137,
"other": 3,
"data": 1,
"marketing": 4,
"hr": 1,
"support": 4,
"sales": 30
},
"new_roles_by_seniority": {
"lead": 59,
"senior": 76,
"mid": 47,
"junior": 1,
"director": 5,
"vp": 1
},
"new_roles_by_role_class": {
"corporate": 189,
"frontline": 0
},
"role_classes_included": [
"corporate"
],
"new_roles_remote_ratio": null,
"top_department": "engineering",
"top_department_count": 137,
"signal_score": 83,
"signal_label": "hot",
"sample_titles": [
"Consulting Architect - Search",
"Consulting Architect - Security (Canberra)",
"Consulting Architect - Security (EMEA / Public Sector eligible )",
"Customer Architect",
"Senior Customer Architect - West"
],
"roles_truncated": false,
"scraped_at": "2026-09-20T22:31:56.869Z"
}

A RUN_SUMMARY record is also written to the key-value store with per-ATS counts, parsing health and the list of domains that could not be resolved.


Notes for developers

How the score works

signal_score is intensity relative to company size, not raw volume. A 50-person startup opening five sales roles scores far above a 5,000-person company opening five.

Three components:

  • Intensity — how much of the board is new, with Bayesian shrinkage so a company with one total role and one new role does not score 100
  • Concentration — whether new roles cluster in a single department
  • Seniority — lead and director hiring suggests a team being built, and acts as a tiebreaker

Absolute volume is deliberately excluded. If you want to rank by raw volume, sort by new_roles_window — it is in the output.

Labels are calibrated by percentile against a real run of 179 mixed domains: hot ≈ top 8%, growing ≈ next 23%, quiet ≈ bottom 24%. hot is rare by design — a label that applies to a third of your list tells you nothing.

Intent tags

top_department: "sales" is a fact. intent_tags: ["scaling-sales"] is a verdict — and a verdict you can filter on.

The rules are deterministic, not a language model: a department tag needs at least 5 new roles in the window, at least 3 in that department, and either 35% concentration or 20 roles in absolute terms. The absolute clause exists because 23 sales roles is a real commercial buildout even when the company is hiring everywhere else.

building-leadership requires director level or above — Staff and Principal are senior individual contributors, and "scaling engineering" already says that.

At most 3 tags per company, strongest concentration first. Measured on a real run of 95 companies: 61% get no tag, 28% get one, 10% get two or three. An empty array is the normal case — a label that applied to most rows would tell you nothing.

Corporate vs frontline

Classification uses the ATS department field first and the job title as fallback. A restaurant chain that names departments after store addresses still gets classified correctly, because the title rules catch it.

Limits

  • Up to 500 roles collected per company by default, and an internal ceiling of 25 pagination requests per company. When either is hit, roles_truncated is true.
  • Greenhouse, Lever, Ashby and Recruitee return everything in one request. Workable paginates 10 at a time and SmartRecruiters 100 at a time; both are sorted newest-first, so the Actor stops as soon as it passes your window. A 4,800-role SmartRecruiters board costs about 5 requests for a 30-day window instead of 49 for the whole board.
  • new_roles_remote_ratio can be null. Lever, Ashby, Workable and Recruitee expose a remote flag, so the ratio is exact. Greenhouse does not — remote status there is inferred from the location text. When no Greenhouse location says remote, the field is null, meaning unknown, not zero. A remote-first company that lists roles as "United States" is unknowable from the feed, and the output says so rather than claiming 0% remote.
  • posted_at is the first-published date from the ATS. Some companies refresh or repost roles; a repost can read as new.
  • Department and seniority are inferred from job titles and the ATS department field. Measured on 3,100 real postings, 2% fall into other. Non-English titles land in other more often.
  • One run, one snapshot. This version reads posted_at and does not compare against previous runs. Schedule it and diff the datasets yourself if you need trend lines.
  • The run-level spend cap you set in Apify is a stop signal, not a hard ceiling — a charge that crosses the limit is allowed before the Actor stops. Measured: a $0.005 cap billed $0.00535, a $0.02 cap billed $0.02045. The overage is bounded by roughly the price of one company and does not scale with the cap.

Detection

ATS detection is cached, with a TTL, so repeat runs on the same list are cheaper. Negative results expire after a day, so a company that adopts a supported ATS — or one that was missed during a brief ATS outage — is picked up on a later run.


FAQ

Is this legal? The Actor reads public job board feeds that ATS platforms publish for aggregators to consume. No login, no authentication, no paywalled content. As with any scraping, review the terms of the sites you target and your own compliance requirements.

Do I need proxies? No. These are public JSON feeds and the Actor does not require residential proxies.

Why did half my domains return nothing? They likely use an ATS that is not supported yet — Workday, Taleo, SuccessFactors or a custom careers page. Roughly 50% coverage on a mixed list is expected. You are not charged for those domains.

Can I get the individual job postings? Yes — set includeJobRows to true and the normalized job rows are written alongside the company rows.

How fresh is the data? Every run reads the live job board. Nothing is served from a stale index.

Can I schedule it? Yes. Schedule a weekly run on your target account list and watch which accounts move from quiet to hot.

Can I use it through the API? Yes. See the API tab for code examples in JavaScript and Python, or use the apify-client package.

What if an ATS changes its format? A daily canary run covers all five platforms — two domains each for Greenhouse, Lever and Ashby, one each for Recruitee and Workable — and fails loudly when a feed changes shape, so breakage is caught before it reaches your results.