Job data guides · Updated 2026-10-13
Hacker News Who is hiring as data: every job post as JSON
Each month Hacker News runs an "Ask HN: Who is hiring?" thread where companies post jobs as comments. There is no separate jobs API, but the thread is an ordinary story, so the free Hacker News API returns every post as JSON without a key.
whoishiring with GET https://hn.algolia.com/api/v1/search_by_date?tags=story,author_whoishiring, then read https://hacker-news.firebaseio.com/v0/item/{id}.json. Its kids list holds the job posts. The October 2026 thread is item 49922569; on 2026-10-13 it had 310 top-level comments, and 261 of them were still visible.Step by step
- Find the thread. The HN Search API call above returns the latest stories by
whoishiring. In August, September and October 2026 there were two each month: "Who is hiring?" and "Who wants to be hired?". Pick the hit whosetitlestarts withAsk HN: Who is hiring?and keep itsobjectID. - Read the story from the official API:
https://hacker-news.firebaseio.com/v0/item/49922569.json. Thekidsarray holds the IDs of the top-level comments. Each top-level comment is one job post. Replies under a post are questions, not jobs. - Read each post:
https://hacker-news.firebaseio.com/v0/item/{kid}.json. A post hasby(the author),time(Unix seconds) andtext(HTML). Skip posts withdeletedordeadset to true; 49 of the 310 October posts were like that. - Split the first line. The thread asks posters to start with
Company | Role | Location | Remote | Salary-style fields separated by|. In the October 2026 thread, about 30 of the 261 visible posts did not follow this, so keep the full text as well.
Copy and paste script (Node.js 18+)
// node hn-hiring.mjs > jobs.json
const s = await (await fetch('https://hn.algolia.com/api/v1/search_by_date?tags=story,author_whoishiring&hitsPerPage=5')).json();
const thread = s.hits.find(h => h.title.startsWith('Ask HN: Who is hiring?'));
const story = await (await fetch(`https://hacker-news.firebaseio.com/v0/item/${thread.objectID}.json`)).json();
const posts = [];
for (const id of story.kids) {
const c = await (await fetch(`https://hacker-news.firebaseio.com/v0/item/${id}.json`)).json();
if (!c || c.deleted || c.dead) continue;
const text = c.text.replace(/<p>/g, '\n').replace(/<[^>]+>/g, '')
.replace(///g, '/').replace(/'/g, "'").replace(/"/g, '"')
.replace(/>/g, '>').replace(/</g, '<').replace(/&/g, '&');
const [company, role, location] = text.split('\n')[0].split('|').map(x => x.trim());
posts.push({ id, author: c.by, company, role, location, text, url: `https://news.ycombinator.com/item?id=${id}` });
}
console.log(JSON.stringify(posts, null, 2));
We ran this on 2026-10-13: it returned 261 posts from the October 2026 thread in about one minute, because it reads the posts one by one. The official API says it has no rate limit at the moment, but be polite and do not run it in a tight loop.
What the October 2026 thread looks like
| Count on 2026-10-13 | Posts |
|---|---|
| Top-level comments in the thread | 310 |
| Still visible (not deleted or flagged) | 261 |
First line split with at least two | | 229 |
| Mention the word "remote" anywhere | 145 |
| Contain a salary figure ($, € or £) | 79 |
| Mention "visa" | 17 |
"Mentions remote" is not the same as "is remote": many posts say "no remote" or "remote within the US only". Read the location field before you filter.
Common problems
- Wrong thread: "Who wants to be hired?" is posted by the same account at the same minute, so its ID is usually one lower. Match the title, not the time.
- HTML in text:
textis HTML with entities such as/for/. Paragraphs are separated by<p>, and links are<a>tags. - No fixed fields: the
|header is a convention. Some posts put the role first, some write a paragraph. Remote, salary and visa need their own rules. - Posts change: companies edit and delete posts during the month, and new posts keep coming for weeks. Read the thread again and keep only IDs you have not seen.
- Several months: you need one loop per thread, plus de-duplication when the same company posts every month.
- Email addresses: many posts include a contact email for applicants. Use it to apply, not for mailing lists.
Who is hiring as a ready dataset
We also run the Hacker News Scraper on Apify, a paid hosted version. Its Who is hiring mode reads the latest thread or the last N months and returns one row per post with company, role, location, remote (yes, no or hybrid), salary text, visa, employment type and company URL. You can filter by keyword, location and remote, and a new-items-only mode returns just the posts added since your last run. Email addresses in post text are replaced with [email hidden]. It costs $0.20 per 1,000 results.
Open Hacker News Scraper Company career pages: 13 ATS APIs
FAQ
Is there an API for Hacker News Who is hiring?
There is no separate jobs API. Each monthly thread is a normal Hacker News story posted by the account whoishiring, and every job is a top-level comment. The official Hacker News API and the HN Search API by Algolia both return them as JSON without a key.
When is the Who is hiring thread posted?
On the first weekday of each month at about 15:00 UTC. In 2026 the August thread came on Monday 3 August because 1 August was a Saturday. The Who wants to be hired thread is posted at the same minute.
How many jobs are in a Who is hiring thread?
A few hundred. The October 2026 thread had 310 top-level comments on 13 October, of which 261 were still visible. September 2026 had 393 comments in total and August 2026 had 376, replies included.
Sources: Hacker News API documentation; HN Search API; our own requests on 2026-10-13.