ActorStack.dev
JobsLead generationv0.1.5updated 2 October 2026

Hacker News Who is Hiring Scraper: Jobs, Emails & Salary

Fifteen years of monthly threads, parsed into rows — job seekers left out by default.

The monthly Hacker News "Ask HN: Who is hiring?" threads turned into structured rows: company, domain, roles, tech stack, remote policy, Latin America eligibility, salary as numbers, visa sponsorship, contact emails and apply links. Or one deduplicated row per hiring company across any months since April 2011.

oswaldocarabano/hn-who-is-hiring-scraper

input.json
{
  "months": ["2026-09"],
  "roleKeywords": ["engineer"],
  "remoteOnly": true,
  "inferEmailPattern": true,
  "maxItems": 50
}
Version
v0.1.5
Memory
512 MB
Browser
none
Proxy
None

Short answer

The Hacker News Who is Hiring Scraper parses the monthly "Ask HN: Who is hiring?" threads — every month since April 2011, about 93,700 company posts — into rows with the company, its domain, roles, stack, remote policy, salary and contact emails. Measured on 848 company posts from July to October 2026, the domain was found on 80.8%, a salary range on 37% and a contact email on 28.8%. Personal-domain addresses are hidden by default, and the job-seeker threads are off by default because their posts are individuals. Data comes from the public Algolia HN Search API, with no key. Pricing is $4 per 1,000 posts or $10 per 1,000 companies.

Key points

  • The Hacker News Who is Hiring Scraper reads every monthly hiring thread since April 2011: 184 threads and about 93,700 company posts.
  • On 848 company posts from July to October 2026, the company domain was parsed on 80.8%, a salary range on 37% and a contact email on 28.8%.
  • Latin America eligibility is a three-state field: on 848 posts, 7.1% were eligible, 65.9% were not and 27.0% did not say.
  • Personal-domain email addresses — 19 of 269 addresses in company posts — are removed from the output and hidden in the raw text unless the operator opts in.
  • The Who wants to be hired and freelancer threads are off by default, because their posts are individuals, and their contact details stay hidden even when added.
  • An email pattern backed by observed addresses was found for 4 of 480 domains, and only those are charged; every other domain gets a free guess marked inferred.
On this page11 sections

What it does

The monthly Hacker News "Ask HN: Who is hiring?" threads turned into structured rows: company, domain, roles, tech stack, remote policy, Latin America eligibility, salary as numbers, visa sponsorship, contact emails and apply links. Or one deduplicated row per hiring company across any months since April 2011.

output — one row
{
  "rowType": "post",
  "postId": "49613617",
  "postUrl": "https://news.ycombinator.com/item?id=49613617",
  "storyTitle": "Ask HN: Who is hiring? (September 2026)",
  "month": "2026-09",
  "author": "hn_user",
  "company": "Search Atlas",
  "domain": "searchatlas.com",
  "roles": ["Product Engineer"],
  "employmentTypes": ["full-time", "contract"],
  "stack": ["TypeScript", "Python", "React", "Django", "LLMs"],
  "remote": true,
  "remoteRegions": ["worldwide"],
  "latamEligible": true,
  "latamSignals": ["remote:worldwide"],
  "salaryMin": 23,
  "salaryMax": 34,
  "salaryCurrency": "USD",
  "salaryPeriod": "hour",
  "visaSponsorship": null,
  "contactEmails": ["first.last@example.com"],
  "personalEmailsHidden": 0,
  "emailPattern": { "pattern": "first.last", "confidence": 0.5, "inferred": false, "mxValid": true, "catchAll": null, "charged": true }
}

Why this one

Parsed, not copied

A Who is hiring post is free text with a conventional first line. The Hacker News Who is Hiring Scraper turns it into a company, a domain, role titles, a recognised stack, a salary with currency and period for every band listed, remote regions and visa sponsorship, and keeps the original text and HTML beside the parsed fields.

Companies across months

With `outputType: companies` every post a company made in the chosen months is merged into one row, grouped by domain. Over 12 months to October 2026, 1,822 companies came from 3,475 posts, and 34.6% of them posted more than once — the kind of repeat-hiring signal a single month cannot show.

Eligibility with its evidence

`latamEligible` is true, false or null, and `latamSignals` says which words produced the answer, such as `remote:worldwide` or `remote-restricted:us`. A null is published as a null — 27.0% of 848 posts do not say — rather than being guessed in either direction.

Job seekers are not leads

The Who wants to be hired thread and the SEEKING WORK posts of the freelancer thread are written by individuals looking for work. The Actor leaves both threads off by default, and when added, every email, phone number and CV link in those posts is hidden unless the operator opts in with a lawful basis.

Use cases

  • Find remote engineering jobs with salary, time zones and the apply link, month by month.
  • List companies hiring repeatedly over a year, with the months they posted and their stack.
  • Research startup salary bands by currency and period across thousands of posts.
  • Filter posts open to Latin American candidates, with the evidence for each decision.

Input

Every field has a default, and the defaults are deliberately small so a first run is cheap enough to inspect before you commit to a sweep. This table mirrors the Actor's own input schema field for field.

FieldDefaultWhat it does
outputTypeenumpostsOutput`posts` for one row per post, or `companies` for one row per company aggregated over the chosen months.
monthsstring[][]Months`2026-10`, `October 2026`, `latest` or `latest-N`. Empty is the latest month. Threads exist from 2011-04.
includeWhoWantsToBeHiredbooleanfalseAlso read Who wants to be hiredpersonal dataJob-seeker posts are individuals; their contact details are hidden unless personal emails are enabled.
includeFreelancerbooleanfalseAlso read the freelancer threadpersonal dataSEEKING WORK posts are individuals. The last freelancer thread was October 2025.
roleKeywordsstring[][]Role keywordsWhole-word, case-insensitive match against role titles or the first line.
stackstring[][]Tech stackKeep posts mentioning any of these technologies.
remoteOnlybooleanfalseRemote onlyKeep posts that offer remote work.
latamOnlybooleanfalseLatin America eligible onlyKeep posts with a positive signal that someone in Latin America can apply.
withEmailOnlybooleanfalseWith a contact email onlyApplied after the privacy rules.
inferEmailPatternbooleanfalseCompany email patternpersonal dataDNS-only pattern with MX records and provider. Charged once per domain only when backed by an observed address.
includePersonalEmailsbooleanfalseInclude personal emailspersonal dataTurn on only with a lawful basis to process them.
maxItemsinteger100Maximum rowsPosts or companies.

Output and fill rates

A field being in the schema is not the same as it having a value. The percentages below were counted on real runs; the sample sizes are in Measurements. Anything not listed here is not promised.

FieldFilledMeaning
headerLinestring100%With `postId`, `postUrl`, `month`, `author`, `postedAt`, `rawText` and `rawHtml`.
companystring91%From the first line or an "At X we are hiring" opening.
domainstring80.8%From the website, a careers subdomain or a corporate email.
rolesstring[]76%Role titles from the first line, lists and bullets.
applyUrlsstring[]67%ATS and careers pages.
stackstring[]63%111 recognised technologies.
locationsstring[]61%Offices or allowed places.
senioritystring[]45%Intern to director.
salaryMinnumber37%With `salaryMax`, `salaryCurrency` and `salaryPeriod`; every band in `salaries`. USD on 252 of 284 posts with a currency.
remoteRegionsstring[]34%Worldwide, Americas, LATAM, US, Europe and others.
contactEmailsstring[]28.8%De-obfuscated corporate and role addresses; personal-domain ones removed by default.
visaSponsorshipboolean8.7%True on 3.5%, false on 5.2%, null otherwise.
latamEligibleboolean73%Stated either way on 73.0%: true 7.1%, false 65.9%; null on 27.0% where the post does not say. `latamSignals` carries the evidence.

Every key is always present. A field that exists but is empty comes back as explicit null, so a parser never has to guess.

Datasets

Different record types go to different datasets, so the main table never carries columns that are blank on most rows.

  • defaultOne row per post, 64 fields, or one row per company with `outputType: companies`. Views: overview, outreach, LATAM, compensation, companies.billed
  • Error rowsA requested month with no thread, with the reason. Never charged.never billed

Pricing

Pay per delivered result. Charges are applied as each row is produced rather than in a lump at the end, so an aborted run bills only for what it actually gave you.

EventPriceNotes
apify-actor-startActor start$0.00001Platform minimum, one event per GB of memory.
postJob post$0.004One post parsed into company, domain, roles, stack, remote and LATAM eligibility, salary, visa, contact emails, apply links and full text. $4 per 1,000.
companyHiring company$0.01Only with `outputType: companies`: one company with all its posts in the chosen months aggregated.
email-patternCompany email pattern$0.01Once per domain per run, only when backed by an observed address. Guesses are free.

Measurements

Each figure is shown with the method that produced it. A benchmark without a method is a marketing claim wearing a number's clothes.

Post sample

848 company posts

The four latest monthly threads, July to October 2026, measured on 1 October 2026.

Company sample

1,822 companies from 3,475 posts

Twelve monthly threads, November 2025 to October 2026, measured on 2 October 2026. 84.0% grouped by domain.

Personal-domain addresses

19 of 269 addresses

Addresses in company posts in the 848-post sample that were on personal domains, and are hidden by default.

Pattern-backed email formats

4 of 480 domains

Same sample; 15 of 1,510 over twelve months. MX valid on 95.6% of the 480.

Archive throughput

184 threads, 90,427 posts in 3 min 19 s

The whole archive merged into 24,169 companies within 512 MB, measured on 2 October 2026.

What it will not do

Stated plainly so you can judge fit before spending anything.

  • Posts are free text: roles are found on 76%, stack on 63% and a salary range on 37% of 848 posts, and the rest are null rather than guessed.
  • The current month's thread grows for days after it opens: about 100 posts on 1 October 2026, against 254 for the whole of September 2026.
  • The freelancer thread was last posted in October 2025, so recent months have none.
  • Pattern-backed email formats are rare: 4 of 480 domains in the measured sample and 15 of 1,510 over twelve months.
  • The Actor depends on the Algolia HN Search API; if that public API changes or is withdrawn the Actor fails with a clear error rather than switching source.

Privacy

  • Corporate and role addresses posted by a company are delivered as published.
  • Personal-domain addresses are removed from `contactEmails` and hidden in `rawText` and `rawHtml` unless `includePersonalEmails` is on.
  • Who wants to be hired and SEEKING WORK posts are individuals: both threads are off by default, and their emails, phone numbers and CV links are hidden unless the operator opts in.
  • The Hacker News username of each post's author is delivered as shown on the site.
  • The email pattern never uses personal emails and does not construct addresses for individuals; no email is sent and no mail server is probed.
  • Removal requests: privacy@actorstack.dev

See also the data removal process.

Frequently asked questions

Where does the Hacker News data come from?
From the public Algolia HN Search API, the one behind Hacker News search. The Hacker News Who is Hiring Scraper needs no login, cookies, browser or API key, and it does not request pages from news.ycombinator.com itself.
Does it collect personal email addresses?
Not by default. Corporate and role addresses posted by companies are delivered; personal-domain addresses, 19 of 269 in the measured sample, are removed and hidden in the raw text unless `includePersonalEmails` is on.
Are job seekers included?
Only if you add their threads. Who wants to be hired and the freelancer thread are off by default because their posts are individuals, and even when added their emails, phones and CV links stay hidden unless you opt in.
How often is a salary stated?
A salary range was parsed from 37% of 848 company posts between July and October 2026. USD was the currency on 252 of 284 posts that stated one, followed by EUR on 19.
Posts or companies — which should I use?
Posts when you want every job ad, since one company can post every month. Companies when you want a deduplicated list of who is hiring, with the months each company posted and how many posts it made.

Guides for this Actor