Hiring Signals — Sales Leads from Live Job Postings
Pricing
Pay per event
Hiring Signals — Sales Leads from Live Job Postings
Turn job postings into B2B sales leads. Name the roles your buyers hire for and get every company that opened one in the last N days: new roles, sample titles, seniority mix, remote share, a strong/moderate/weak signal score and an outreach angle. 2,200+ live company boards built in.
Pricing
Pay per event
Rating
0.0
(0)
Developer
daehwan kim
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Give it a few job titles and it reads up to 1,000 of 2,200+ live company job boards (300 by default) and returns 1 row per company that started hiring for those roles inside your time window, plus 1 summary row per keyword. Each company row carries a signal score, sample titles, the seniority mix and an outreach angle.
A job posting is a funded budget with a date on it. When a company opens four data-engineering roles in nine days, somebody just approved a data budget — and that company is a far warmer account than one that merely matches your firmographics.
This Actor turns that into a lead list. Give it the job titles your buyers hire for, and it reads hundreds of live company job boards and returns every company that started hiring for those roles inside your window — with a signal score, the sample titles, the seniority mix, and an outreach angle you can paste into a first line.
What you get
Two kinds of result row.
hiring-signal — one row per company × keyword
Mixpanel opened 21 account executive roles in 10 days (17 senior+, 76% remote) — strong buying signal
| Field | What it is |
|---|---|
companyName, domain, careersUrl | The account, and where the postings live |
keyword, roleCategory | Which of your keywords fired, and the function it belongs to |
newRolesInWindow | Matching roles first published inside your window — the signal itself |
matchedRoles | Every matching role open right now, new or not |
oldestNewPostedAt, newestNewPostedAt | When the hiring wave started and how recent it is |
sampleTitles, sampleApplyUrls | Three real postings, so the lead is checkable in one click |
seniorityMix | intern / junior / senior / principal / manager / director / executive counts |
remoteShare, locations | Where the team is being built |
signalStrength | strong · moderate · weak |
signalScore, signalReasons | The score and the plain-English rules that produced it |
whyItMatters | What a hire in this function means for a seller |
suggestedOutreach | An angle for the first line of the email |
totalOpenRoles, atsLabel, sourceUrl | Company context and provenance |
keyword-summary — one row per keyword
Is this a market that is hiring at all, and who is loudest?
"data engineer": 57 of 299 companies are hiring (7 strong, 111 new roles in 14d) — hot
Carries companiesScanned, companiesWithSignal, signalSharePercent, strongSignals, totalNewRolesInWindow, momentum (hot / warm / cool / cold) and topCompanies — the five best accounts with their careers URLs.
Rows carrying a noticeCode are status messages, not results.
Invalid input ends the run as SUCCEEDED with a notice row.
Why this beats a job-posting database
Most "hiring intent" products sell you a snapshot of somebody's crawl, capped at a few thousand rows and days old.
- Read live, at request time. Every company board is fetched when you press run. Nothing is served from a cached job database, so a role posted this morning is in this afternoon's run.
- No row ceiling. There is no 5,000-record cap. On a paid plan you get every signal the run finds.
- 2,200+ company boards built in. Every one was verified with a real request when the directory was built — no dead slugs padding the count. Leave
companiesempty and the Actor uses it; fill it in to watch your own target accounts instead. - One request per company, however many keywords. Searching ten keywords costs the same requests as searching one.
Input
| Field | Default | What it does |
|---|---|---|
jobKeywords | ["data engineer", "account executive"] | The roles your buyers hire for. Multi-word keywords match whole words, so account executive will not match Executive Assistant. Up to 20 per run. |
postedWithinDays | 14 | How fresh a posting has to be to count as a signal. |
minNewRoles | 1 | How many new roles a company needs before it counts as a lead. Raise it to keep only companies building a whole function. |
companies | (empty) | Your own account list — slugs or careers-page URLs. Empty means use the built-in directory. |
maxCompanies | 300 | How many directory boards to read, busiest boards first. |
locations | (empty) | Keep only roles whose location mentions one of these. |
remoteOnly | false | Count only roles the board marks as remote. |
Roles with no published posting date count towards matchedRoles but never towards newRolesInWindow — a signal you cannot date is a signal you cannot act on.
Example
{"jobKeywords": ["data engineer", "analytics engineer", "head of data"],"postedWithinDays": 21,"minNewRoles": 2,"maxCompanies": 500}
Every company that opened at least two of those roles in the last three weeks, ranked by how loud the signal is.
Pricing
| Event | Price | When |
|---|---|---|
run-started | $0.005 | Once per run, when the boards start being read |
hiring-signal | $0.02 | Each company × keyword lead written to the dataset |
keyword-summary | $0.02 | Each keyword's market summary row |
A typical run of 2 keywords across 300 companies returns around 130 rows.
Notice rows — no keywords supplied, no signal found, free-plan cap, charge-limit reached — are not charged.
Free Apify plans receive up to 25 rows per run and finish successfully with a note; there is no per-run lead limit on a paid plan.
Where the data comes from
The public, unauthenticated job-board JSON that each applicant tracking system serves to a company's own careers page:
| ATS | Endpoint |
|---|---|
| Greenhouse | boards-api.greenhouse.io/v1/boards/<slug>/jobs |
| Lever | api.lever.co/v0/postings/<slug> |
| Ashby | api.ashbyhq.com/posting-api/job-board/<slug> |
| Workable | apply.workable.com/api/v1/widget/accounts/<slug> |
No login, captcha or anti-bot measure is bypassed. Requests identify themselves honestly as ntriq-hiring-signals/1.0, run four at a time with a pause between them, and cost each company exactly one request per run.
Rebuilding the built-in directory: scripts/fetch_sources.sh → python3 scripts/extract.py → python3 scripts/probe.py → python3 scripts/enrich.py → python3 scripts/fix_names.py (every candidate is re-verified against its live ATS endpoint; only a real HTTP 200 survives).
Terms, scope and responsibility
Read this before you run it.
- This Actor is unofficial and is not affiliated with, endorsed by or sponsored by Greenhouse, Lever, Ashby, Workable, or any employer whose board it reads.
- It reads only publicly available job postings — the same pages any visitor to the company's careers site can see. It collects no candidate data and no data from behind a login.
- You are responsible for complying with the terms of service of each applicant tracking system and each employer whose board you read, and with the laws that apply to you.
- You are the data controller for everything you collect with it, including any GDPR, CCPA or equivalent obligations that follow from using it for outreach.
- Company names, domains and postings are facts published by the companies themselves. Signal scores,
whyItMattersandsuggestedOutreachare our rule-based interpretation, shown with their reasons on every row so you can judge them — they are commentary, not a claim about anyone's finances or intentions.
Ticking "I understand how this Actor sources data" confirms you have read this section.
Next steps
- ATS Jobs Scraper — pull every open role at a company that signalled here, with full titles, locations, salary and descriptions from the same live board.
- theHarvester OSINT — turn a signalling company's domain into public contact points so the lead becomes an outreach list.
Built by ntriqpro. Found it useful, or found a gap? A line in the reviews helps the next person decide.