Hiring Intent Signals Scraper - B2B Buying Signals
Pricing
Pay per event
Hiring Intent Signals Scraper - B2B Buying Signals
B2B buying signals and hiring signals: aggregates months of Hacker News hiring threads into one row per company with a 0-100 hiring intent score, trend, website domain, tech stack detection and role families. Lead generation and company enrichment for outbound, CRM and Clay.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Andres Garcia-Baquero Leon
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
3 hours ago
Last modified
Categories
Share
HN Hiring Intent Signals - Company-Level B2B Buying Signals from Hacker News
Turn the monthly Hacker News "Ask HN: Who is hiring?" threads into a clean, company-level hiring-intent dataset you can drop straight into a CRM, Clay table, or outbound sequence.
The HN API gives you unstructured comments, one month at a time. This Actor aggregates several months, resolves each company, and tells you how they are hiring - the trend, not just the snapshot. One row per company, scored 0-100, with a resolved web domain, tech stack and role families attached.
Why this instead of a job scraper
| Job scrapers give you | This Actor gives you |
|---|---|
| One row per job post | One row per company |
| A single month | Up to 12 months rolled up |
| Raw free text | Normalised company + resolved web domain |
| No trend | new / consistent / always-hiring / reaccelerating / churned |
| No prioritisation | 0-100 hiring intent score |
Repeated hiring posts can help prioritise research. They do not establish that a company is scaling, has budget or intends to buy tooling. Scores are heuristics based on HN posting activity, not verified commercial intent.
Example output
{"company": "Spacelift","domain": "careers.spacelift.io","hiringIntentScore": 86,"trend": "always-hiring","activeThisMonth": true,"consecutiveMonths": 3,"monthsPosted": ["August 2026", "July 2026", "June 2026"],"monthsPostedCount": 3,"totalListings": 3,"roleFamilies": ["backend", "infra-devops"],"seniorityLevels": ["senior"],"techStack": ["aws", "devops", "go", "kubernetes"],"remotePolicy": "remote","locations": ["Remote (EU)"],"latestRole": "Senior Backend Engineer","latestSalary": "$120k - $160k","latestMonth": "August 2026","latestHnUrl": "https://news.ycombinator.com/item?id=49160000","latestPostText": "..."}
The same record flattened, the way it lands in a spreadsheet or CRM:
| company | domain | hiringIntentScore | trend | consecutiveMonths | roleFamilies | techStack | remotePolicy | latestRole |
|---|---|---|---|---|---|---|---|---|
| Spacelift | careers.spacelift.io | 86 | always-hiring | 3 | backend, infra-devops | aws, devops, go, kubernetes | remote | Senior Backend Engineer |
Output fields
| Field | Type | Meaning |
|---|---|---|
company | string | Normalised company name |
domain | string | null | Resolved company website (ATS/social/link-shortener hosts filtered out) |
hiringIntentScore | number | 0-100. Recency + streak + role breadth + stack breadth + enrichment |
trend | string | Posting-pattern label: new, consistent, always-hiring, reaccelerating, churned; active for a one-month window |
activeThisMonth | boolean | Posted in the newest thread |
consecutiveMonths | number | Unbroken streak counting back from the newest thread |
monthsPosted / monthsPostedCount | array / number | Every month the company appeared |
totalListings | number | Number of posts aggregated |
roleFamilies | array | backend, frontend, fullstack, data, ml-ai, infra-devops, mobile, security, product, sales-gtm, support |
seniorityLevels | array | junior, senior, staff, principal, lead, head, director, vp, founding, ... |
techStack | array | Deduplicated technologies across all months |
remotePolicy | string | remote, hybrid, onsite, unspecified |
locations | array | Locations seen across posts |
latestRole, latestSalary, latestMonth, latestHnUrl, latestPostText | - | Most recent post details |
How to use it
- Open the Actor and click Try for free.
- Leave the input empty (
{}) to get the last 3 months of hiring signals, or setmonthsBackup to 12 for a deeper rollup. - Narrow the list with
trendFilter,minIntentScore,techFilterorrequireDomainso you only pay for accounts you would actually work. - Export the dataset to CSV, JSON, Excel, the API or a webhook and push it into your CRM, Clay table, Google Sheet or outbound sequence.
Input
All fields are optional - running with {} returns the last 3 months of signals.
| Field | Type | Default | Description |
|---|---|---|---|
monthsBack | integer | 3 | How many monthly threads to aggregate (1-12) |
trendFilter | array | [] | Keep only these trends, e.g. ["always-hiring","consistent"] |
minIntentScore | integer | 0 | Keep only companies scoring at least this |
techFilter | array | [] | Keep companies whose stack contains ANY of these, e.g. ["rust","kubernetes"] |
requireDomain | boolean | false | Only companies with a resolved website (best for CRM enrichment) |
maxResults | integer | 500 | Cap on returned companies (1-2000) |
Example: high-intent, domain-resolved infra buyers
{"monthsBack": 6,"trendFilter": ["always-hiring", "consistent"],"minIntentScore": 60,"techFilter": ["kubernetes", "terraform", "aws"],"requireDomain": true,"maxResults": 200}
Example: fresh companies that just started hiring
{ "monthsBack": 4, "trendFilter": ["new"], "requireDomain": true }
Use cases
- Outbound prospecting - target companies scaling engineering right now.
- Clay / CRM enrichment - company + domain + stack + trend, ready to join.
- DevTool GTM - filter by
techFilterto find accounts on your stack. - Recruiting intelligence - see which competitors keep hiring and for what.
- Market research - monthly tech-stack and role-family demand shifts.
Integrations
The dataset is standard Apify output, so it plugs into the tools you already run:
- Zapier, Make and n8n - trigger a flow on every new run.
- Slack - post the top-scoring new companies to a sales channel.
- Google Sheets - export straight into a shared prospecting sheet.
- Airbyte - sync results into your warehouse.
- LangChain - feed company signals into an agent or RAG pipeline.
- REST API - pull results directly from the Apify dataset endpoint.
- Webhooks - fire on run success and push results anywhere.
- Scheduling - run it monthly, right after each new "Who is hiring?" thread goes up, so your signal list refreshes itself.
Pricing
Pay per result - you only pay for company signals actually delivered.
| Event | Price |
|---|---|
| Actor start | $0.00005 |
company-signal (one enriched company) | $0.015 |
A typical 3-month run returns a few hundred companies. Use maxResults,
minIntentScore or requireDomain to control both volume and spend, and set
a max total charge on the run to hard-cap it.
FAQ
Do I need a Hacker News account or API key? No. The Actor uses public, official HN APIs. There is nothing to log into and no credentials to configure.
Is this legal? Yes. It reads publicly available Hacker News comments through HN's own public APIs. No login walls are bypassed and no HTML is scraped.
How is hiringIntentScore calculated?
It combines recency (did they post in the newest thread), streak length
(consecutive months), role breadth (how many role families), stack breadth (how
many technologies mentioned) and enrichment completeness (domain, salary,
location resolved). The result is normalised to 0-100.
Why is domain sometimes missing?
Some HN posts link only to an ATS, a Google Doc, a social profile or a link
shortener - those hosts are deliberately filtered out rather than passed off as
a company website. Set requireDomain: true if you only want rows with a
resolved domain.
How far back can I go?
Up to 12 monthly threads via monthsBack. More months means longer streaks,
richer stacks and more reliable trend classification.
Will it break? Retryable HTTP and transport failures are retried with exponential backoff. If any selected thread or top-level comment cannot be read, the run fails before publishing any company signals. It does not treat failed reads as inactivity. Parsing remains heuristic, so complete reads do not guarantee complete extraction.
Troubleshooting
| Problem | Fix |
|---|---|
| Empty dataset | Check run status first. Source errors fail before delivery; otherwise review filters, parsing and available posts. |
| Incomplete source error | Retry after the API recovers; inspect the named thread/comment or discovery gap. No partial company signals are emitted. |
| Too few companies returned | Increase monthsBack to aggregate more monthly threads |
| Missing domains on many rows | Set requireDomain to false to keep companies whose website could not be resolved |
Data source & reliability
Public HN Algolia Search (thread discovery) and HN Firebase (comments), without login or page scraping. Availability and indexing are outside the Actor's control.
Strict completeness before delivery: all requested threads and their listed top-level comments must be read successfully before aggregation or publication. An exhausted HTTP/transport error, invalid JSON, null/malformed item, unavailable thread or mismatched thread title fails the run with zero company-signal rows from that attempt. A later failure cannot leave signals from earlier months. Deleted/dead comments are normal omissions; an unavailable entire thread cannot be omitted without invalidating the calendar window and therefore fails the run.
Discovery inspects the latest 100 stories by whoishiring and requires the full
requested number of consecutive monthly hiring threads. Missing/duplicate months
or gaps fail rather than compressing the calendar and inventing streaks. The
newest indexed thread anchors the window; it may lag the current calendar month.
Completeness refers only to the listed top-level comments at read time, not an
atomic snapshot or a guarantee that every real job is parsed. HN can change while
the Actor runs. Deleted/dead posts, non-matching post formats and company-name
normalisation can affect signals. churned means no parsed listing in the newest
thread, not that a company stopped hiring. new means new within the requested
window, not its first-ever hiring activity. No output fields or PPE event IDs
change; incomplete data is rejected rather than emitted with guessed values.
Start/compute charges may still apply to failed runs; zero signal rows does not
promise a zero-cost run.
Local regression checks (no Apify runs)
From this actor directory, with httpx and apify installed:
python -B -m unittest -v test_main
Tests execute the real request/retry and aggregation paths through mock HTTP responses and an Actor stub. They cover thread/comment failures (including late failures), malformed/null responses, missing calendar months, deleted/dead comments and complete-window output. They do not verify Cloud billing.
Notes
- HN posts are free text, so parsing is heuristic. Measured on a real 111-company sample from the August 2026 thread: role 85%, location 95%, domain 74%, role families 96%, tech stack 86%.
- Fields are classified by content, not by position - a missing role does not shift the location into the wrong column.
- Non-job comments (replies, candidate self-posts) are filtered heuristically; false positives and missed listings remain possible.
- Companies are matched by a normalised key, so
Acme, Inc.andAcmemerge.