# Hacker News Scraper · Who Is Hiring Threads (`bibian/hackernews-jobs-scraper`) Actor

Scrape job posts from Hacker News's monthly "Who is hiring?" threads via the official public Algolia HN Search API: company pitch, location, text and author, straight from the source. No login, no browser.

- **URL**: https://apify.com/bibian/hackernews-jobs-scraper.md
- **Developed by:** [Vivien MORVAN](https://apify.com/bibian) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 job postings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Hacker News Jobs Scraper: Who Is Hiring?

Scrape job posts from Hacker News's monthly ["Who is hiring?"](https://news.ycombinator.com) threads — thousands of startup and tech job listings posted straight by hiring companies — through the free, public, official Algolia HN Search API. No login, no browser, no API key.

### What you can do with it

- **Pull the latest hiring thread in one run.** Every top-level comment under the newest "Who is hiring?" thread, as a clean dataset instead of scrolling hundreds of comments by hand.
- **Build a historical archive.** Go back `monthsBack` threads to compare postings month over month, or backfill a job board.
- **Feed a search or alert tool.** `textPlain` and `headline` are ready for full-text search or keyword matching (e.g. "remote", "Rust", "visa sponsorship").
- **Track a company's hiring activity over time.** `author`, `threadMonth` and `createdAt` let you group posts by poster and month across runs.

### Input

| Field | What it does |
|---|---|
| `monthsBack` | How many of the most recent "Who is hiring?" threads to read, newest first. `1` (default) means the latest thread only. |
| `maxItems` | The run stops once this many job posts are saved (default 50). |

Example input:

```json
{
  "monthsBack": 1,
  "maxItems": 50
}
```

### Output

One record per top-level comment (one job post):

```json
{
  "id": 49922584,
  "threadId": 49922569,
  "threadMonth": "October 2026",
  "headline": "PrairieLearn (Remote US) — Full-Stack Software Engineer — TypeScript / Postgres / React / AI",
  "author": "mwest1066",
  "text": "PrairieLearn (Remote US) — Full-Stack Software Engineer — TypeScript / Postgres / React / AI\n\nPrairieLearn (https://www.prairielearn.com) is an open-source assessment platform used by universities across the US...",
  "textPlain": "PrairieLearn (Remote US) — Full-Stack Software Engineer — TypeScript / Postgres / React / AI PrairieLearn (https://www.prairielearn.com) is an open-source assessment platform used by universities across the US...",
  "url": "https://news.ycombinator.com/item?id=49922584",
  "createdAt": "2026-10-01T15:02:37.000Z"
}
```

Export the dataset as JSON, CSV or Excel, or read it through the Apify API.

### Why this one

- **Covers every post, not a sample.** Every top-level comment of the thread is read, in one API call per thread.
- **Always the freshest thread by default.** `monthsBack: 1` always resolves to whichever month's thread is currently live, no hardcoded ID to update.
- **Free, no key, no browser.** Built on the same public Algolia HN Search API HN's own search page uses — no proxy or anti-bot cost to pass on.

### Good to know

- There is no structured job schema on Hacker News: posters write free text. `headline` (the comment's first line) is a best-effort guess at the "Company | Location | Role" convention many posters follow, but it is not enforced by HN, so `text`/`textPlain` remain the source of truth — nothing is force-split into separate company/role/location fields.
- `text` keeps the original paragraph breaks; `textPlain` is the same content flattened to a single line for CSV or search indexing.
- Every e-mail address and phone-like number found in a post is replaced by `[removed]`, including a recruiter's or company's own contact address. The dataset never carries a reachable contact; apply through the link the poster included (`text`/`textPlain`) instead.
- Replies to a job post (second-level comments and deeper) are not included — only the top-level post from the hiring company.
- This is an unofficial tool, not affiliated with Hacker News or Y Combinator. It reads the same public Algolia HN Search API (`hn.algolia.com`) that powers HN's own search.

### FAQ

**Does it need a browser or a proxy?**
No. The Actor reads the public Algolia HN Search API directly.

**Does it work without any filter?**
Yes. With no input at all it saves up to 50 job posts from the latest "Who is hiring?" thread.

**Can I get data from several months at once?**
Yes, set `monthsBack` to however many threads back you want to cover, and raise `maxItems` accordingly.

### Try it

**[Open hackernews-jobs-scraper on the Apify Store](https://apify.com/bibian/hackernews-jobs-scraper)**

# Actor input Schema

## `monthsBack` (type: `integer`):

How many of the most recent "Who is hiring?" threads to read, newest first. 1 means the latest thread only.

## `maxItems` (type: `integer`):

The run stops once this many job posts are saved.

## Actor input object example

```json
{
  "monthsBack": 1,
  "maxItems": 50
}
```

# Actor output Schema

## `postings` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("bibian/hackernews-jobs-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("bibian/hackernews-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call bibian/hackernews-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,bibian/hackernews-jobs-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/2KrgOEjoNcbLE7QkU/builds/9KEdbiQfRg4p10ax4/openapi.json
