Hiring Signals | $0.02/company | Buying Triggers avatar

Hiring Signals | $0.02/company | Buying Triggers

Pricing

from $20.00 / 1,000 company profiles

Go to Apify Store
Hiring Signals | $0.02/company | Buying Triggers

Hiring Signals | $0.02/company | Buying Triggers

Buying triggers from hiring data. Paste your target list and get back the companies that changed since last run: first sales hire, started hiring, new office, executive hire, accelerating, hiring freeze. Each scored 0-100 with the reasons. $0.02 per company looked up, first 5 free on every run.

Pricing

from $20.00 / 1,000 company profiles

Rating

0.0

(0)

Developer

omar khandji

omar khandji

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 hours ago

Last modified

Share

Company Hiring Signals — Buying Triggers From Hiring Data

"These 12 accounts just posted their first sales role."

Paste your target list. Get back the short list that changed, scored 0-100, with the reason for every point. 5 companies free on every run.

Every other jobs Actor on this Store sells you rows. This one sells you the event: who started hiring, who opened an office, who hired their first VP, who froze. That is the thing a revenue team acts on.

The change events

Run it once to set a baseline. Every run after that reports what moved:

TriggerWhat it meansScore
first_sales_hireSales roles appear where there were none — the company decided to go to market+30
started_hiringWas dormant, now hiring+25
exec_hireA VP, Head of, Director or C-level title appears+20
hiring_acceleratingPosting at least 50% faster than last run+20
new_locationA city that was not there before — an office opening+15
scaling_fast10+ roles opened in 30 days and not slowing+15
first_engineering_hireEngineering roles appear where there were none+10
hiring_deceleratingPosting at least 50% slower−15
hiring_freezeWas hiring, now zero open roles−30

A real run, on vercel.com:

{
"domain": "vercel.com",
"intent_score": 100,
"triggers": ["first_sales_hire", "new_location", "hiring_accelerating", "scaling_fast"],
"roles_delta": 40,
"roles_delta_pct": 100.0,
"velocity_delta": 299.4,
"new_functions": ["Sales"],
"new_locations": ["Hybrid - London", "Remote - United States"],
"intent_reasons": {
"first_sales_hire": 30, "recent_activity": 25, "hiring_accelerating": 20,
"new_location": 15, "scaling_fast": 15, "hiring_sales": 10,
"open_roles": 8, "hiring_engineering": 5
}
}

intent_reasons is not decoration. A score your sales team cannot explain is a score they will not act on, so every point is attributed to a named component and the total is exactly their sum.

Set Only companies that changed to get just the short list, and Minimum intent score to raise the bar.

Three things this Actor refuses to fake

The first run invents nothing. No history means every company comes back as is_new with an empty triggers list. Telling a sales team that 200 accounts all started hiring on the day they first ran it would destroy the product's credibility in one run.

A new city only counts as an office opening if the company was already hiring. A company going from zero roles to its first roles has "new" locations by definition. That is not an expansion, and calling it one would be a lie.

A company we cannot date is unknown, not zero. Some ATS providers publish no timestamps, so roles_posted_30d comes back null rather than 0 and no velocity trigger fires. Reporting a hiring company as dormant is a false negative you would act on.

The problem this solves

A company's hiring is the cleanest public signal of what it is doing. A team that opened nine engineering roles this month is building something. A company that just posted its first three sales roles has decided to go to market — the classic buying trigger.

That signal is already public, in every company's applicant tracking system. It is just spread across nine different systems, none of which you can query without first knowing which one a given company uses.

You give a domain. This Actor does the rest.

Not another job scraper

If you want the jobs themselves, use the ATS Jobs API — same data, one row per opening, $0.002 each.

This Actor is for the other question. Prospecting 500 accounts through a job scraper means 40,000 rows you have to aggregate yourself. Here it is 500 rows, already aggregated, already ranked.

What one row looks like

{
"domain": "stripe.com",
"ats": "greenhouse",
"is_hiring": true,
"total_open_roles": 545,
"roles_posted_7d": 31,
"roles_posted_30d": 118,
"roles_posted_90d": 402,
"roles_per_week_30d": 29.5,
"latest_posting": "2026-08-03",
"by_function": {"Engineering": 210, "Sales": 96, "Other": 239},
"by_seniority": {"Senior": 288, "Mid": 190, "Junior": 67},
"top_locations": {"New York": 88, "Remote - US": 74, "Dublin": 51},
"top_titles": {"Account Executive": 9, "Software Engineer": 8},
"hiring_engineering": true,
"hiring_sales": true,
"hiring_marketing": true,
"hiring_support": false,
"checked_at": "2026-08-04"
}
FieldWhat it holds
domainthe company you asked about
atswhich system it publishes from, or null if it runs its own careers page
is_hiringwhether any role is currently open
total_open_rolesevery open role right now
roles_posted_7d / 30d / 90dhow many opened in that window
roles_per_week_30dhiring velocity — what the ranking sorts on
by_function / by_senioritythe shape of the hiring
top_locations / top_titleswhere, and for what
hiring_engineering / _sales / _marketing / _supportquick booleans to filter on
latest_postingdate of the most recent opening

Two things this Actor refuses to fake

A company we cannot date is reported as unknown, not as zero. Some ATS providers publish no timestamps. Reporting roles_posted_30d: 0 for them would mark a company that is actively hiring as dormant — a false negative you would act on. Those companies come back with null and dated_roles: 0, and the ranking places them below companies we could actually measure rather than dropping them.

A company with no public ATS still gets a row. is_hiring: false, ats: null. For a prospecting list, "we looked and they publish nothing" is a usable answer; a missing row just looks like the lookup failed.

Free tier — 5 companies on every run

The first 5 companies of every run are free, on every run you ever make, not just the first. Point it at your own target list and see the real output before a cent is billed.

The free allowance never covers more than half of a run, so a run of 6 companies gets 3 free rather than 5 — that is what stops it becoming an unlimited free plan for anyone willing to split one list into many tiny runs.

Pricing — $0.02 per company looked up

You are billed per company checked, not per row returned. If you scan 200 companies and ask for only those that changed, you may get 12 rows back, and you pay for the 200 lookups that produced them.

That is deliberate and it is the honest way round. The lookup is the work: we resolve the ATS, read the board and compare it to last run whether or not the answer turns out to be interesting. Billing per returned row would mean charging you nothing for a scan that correctly told you "none of your accounts moved this week" — which is a useful answer, and one you would stop trusting if we had an incentive to invent movement.

Companies that turn out not to be hiring are billed for the same reason: the negatives are only worth having because we actually looked.

Set Maximum charge (USD) to cap any single run.

Where the data comes from

Each company's own applicant tracking system, through the public endpoint that system already publishes: Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Rippling, Breezy HR, Personio, BambooHR.

No cookies, no logins, no proxies, no third-party aggregator. Nothing here can be blocked, because none of it is scraping — it is the employers' own public job feeds, read as published.

Limits

  • 200 companies per run. Each one costs at least two HTTP round trips.
  • 25 companies per request in HTTP mode, so a request finishes inside Apify's five-minute ceiling.
  • Velocity is computed over dated roles only.

Questions

Which companies are hiring right now?

Pass your target list and read is_hiring and roles_posted_30d. Companies with no public applicant tracking system come back with ats: null and is_hiring: false rather than being dropped, so a prospecting list stays the length you gave it.

How do I turn hiring data into a sales trigger?

Run it on a schedule against the same list. From the second run on, triggers carries the events — first_sales_hire, started_hiring, new_location, exec_hire, hiring_accelerating. Set Only companies that changed and you get just the accounts worth a call this week.

Can I use this for ICP scoring?

Yes, and the score is meant to be argued with. intent_score is 0-100 and intent_reasons breaks out every point by name, so you can drop the components you disagree with and re-score on the raw fields — open roles, roles posted in 7/30/90 days, roles per week, functions, locations, titles.

What is a hiring signal worth as buying intent?

A company posting its first sales role has decided to go to market. One opening an office in a new city has budget. One that just hired a VP has a new decision maker. Those are the three events this Actor weights highest, and they are public information every company publishes itself.

How is this different from a job scraper?

A job scraper gives you rows. Scanning 500 accounts through one means 40,000 job rows you have to aggregate yourself. This returns 500 rows, one per company, already aggregated and ranked — or just the dozen that changed.

Does it work without a list of companies?

No. This Actor scores companies you name. If you want to discover jobs rather than score accounts, use the ATS Jobs API.

How fresh is the data?

It is read live from each company's own applicant tracking system at the moment you run it — not from an index built earlier. 25 companies answer in about 25 seconds.

Use it from an AI agent (MCP)

This Actor is a Model Context Protocol server. Point any MCP client at it and the tool appears with its full input schema — no wrapper code:

https://om-kh--company-hiring-signals.apify.actor/mcp
{
"mcpServers": {
"company_hiring_signals": {
"url": "https://om-kh--company-hiring-signals.apify.actor/mcp",
"headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
}
}
}

One tool, company_hiring_signals. It takes the same arguments as the Start form and returns the same rows, so an agent and a curl user can never get different answers.

Same data, other sources — all with the same free tier, the same clean schema and the same pay-only-for-what-you-get billing:

Actor
[ATS Jobs API
[Careers Page Scraper
Indeed Jobs Scraper - Listings, Companies & Salary
LinkedIn Jobs Scraper - Listings & Companies
Glassdoor Reviews Scraper - Employer Ratings
LinkedIn Company Scraper - Followers & Headcount