Hiring Intent Signals Scraper - B2B Buying Signals avatar

Hiring Intent Signals Scraper - B2B Buying Signals

Pricing

Pay per event

Go to Apify Store
Hiring Intent Signals Scraper - B2B Buying Signals

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

Andres Garcia-Baquero Leon

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

3 hours ago

Last modified

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 youThis Actor gives you
One row per job postOne row per company
A single monthUp to 12 months rolled up
Raw free textNormalised company + resolved web domain
No trendnew / consistent / always-hiring / reaccelerating / churned
No prioritisation0-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:

companydomainhiringIntentScoretrendconsecutiveMonthsroleFamiliestechStackremotePolicylatestRole
Spaceliftcareers.spacelift.io86always-hiring3backend, infra-devopsaws, devops, go, kubernetesremoteSenior Backend Engineer

Output fields

FieldTypeMeaning
companystringNormalised company name
domainstring | nullResolved company website (ATS/social/link-shortener hosts filtered out)
hiringIntentScorenumber0-100. Recency + streak + role breadth + stack breadth + enrichment
trendstringPosting-pattern label: new, consistent, always-hiring, reaccelerating, churned; active for a one-month window
activeThisMonthbooleanPosted in the newest thread
consecutiveMonthsnumberUnbroken streak counting back from the newest thread
monthsPosted / monthsPostedCountarray / numberEvery month the company appeared
totalListingsnumberNumber of posts aggregated
roleFamiliesarraybackend, frontend, fullstack, data, ml-ai, infra-devops, mobile, security, product, sales-gtm, support
seniorityLevelsarrayjunior, senior, staff, principal, lead, head, director, vp, founding, ...
techStackarrayDeduplicated technologies across all months
remotePolicystringremote, hybrid, onsite, unspecified
locationsarrayLocations seen across posts
latestRole, latestSalary, latestMonth, latestHnUrl, latestPostText-Most recent post details

How to use it

  1. Open the Actor and click Try for free.
  2. Leave the input empty ({}) to get the last 3 months of hiring signals, or set monthsBack up to 12 for a deeper rollup.
  3. Narrow the list with trendFilter, minIntentScore, techFilter or requireDomain so you only pay for accounts you would actually work.
  4. 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.

FieldTypeDefaultDescription
monthsBackinteger3How many monthly threads to aggregate (1-12)
trendFilterarray[]Keep only these trends, e.g. ["always-hiring","consistent"]
minIntentScoreinteger0Keep only companies scoring at least this
techFilterarray[]Keep companies whose stack contains ANY of these, e.g. ["rust","kubernetes"]
requireDomainbooleanfalseOnly companies with a resolved website (best for CRM enrichment)
maxResultsinteger500Cap 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 techFilter to 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.

EventPrice
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

ProblemFix
Empty datasetCheck run status first. Source errors fail before delivery; otherwise review filters, parsing and available posts.
Incomplete source errorRetry after the API recovers; inspect the named thread/comment or discovery gap. No partial company signals are emitted.
Too few companies returnedIncrease monthsBack to aggregate more monthly threads
Missing domains on many rowsSet 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. and Acme merge.