# HN Who Is Hiring Jobs API (`norespi/hn-who-is-hiring`) Actor

Turns the monthly Hacker News 'Who is hiring?' thread into structured jobs: company, roles, location, remote, visa, parsed salary, tech stack, apply URL. Latest thread or up to 24 months of history. $2 per 1,000 jobs.

- **URL**: https://apify.com/norespi/hn-who-is-hiring.md
- **Developed by:** [Gabriel Jossic](https://apify.com/norespi) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 job results

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

**HN Who Is Hiring API**: turns the monthly **Hacker News "Ask HN: Who is hiring?"** thread into clean, structured job data. Each job post becomes one record with **company, roles, location, remote or onsite, visa sponsorship, parsed salary range, tech stack and apply URL**, plus a link to the original HN comment.

Get the **latest thread** or **up to 24 months of history** in one run. Filter by keyword or remote only, export to **JSON, CSV, Excel or Google Sheets**, call it from the **Apify API**, or let an **AI agent** query it through MCP.

Extraction is rule-based (no LLM), so results are reproducible and cheap. No login, no browser: the Actor reads the public HN Algolia API.

### What data does the HN Who Is Hiring API return?

| Field | Example |
|---|---|
| `company`, `companyUrl` | Sidekick Labs, https://sidekicklabs.com |
| `roles` | Senior SWE, R\&D Engineer |
| `location`, `remote`, `remoteScope`, `workMode` | REMOTE (US Timezones), `true`, US Timezones, `["remote"]` |
| `employmentTypes` | `["full-time"]` |
| `visaSponsorship` | `true`, `false` or `null` (not mentioned) |
| `salary`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` | $170k to $230k → 170000, 230000, USD, year |
| `stack` | `["Python", "Go"]` |
| `applyUrl`, `applyByEmail` | Apply link; `true` when the post asks for an email application (the address is not returned) |
| `ycBatch` | Y Combinator batch when mentioned |
| `header`, `description` | The post's first line and full text, cleaned |
| `commentUrl`, `threadUrl`, `threadTitle`, `month`, `postedAt` | Where and when it was posted |

### How to use the HN Who Is Hiring API

1. Click **Try for free**.
2. Leave **month** empty for the latest thread, or type a month like `2026-10`. Add **keywords** (`rust`, `python`, `ai`) or tick **remote only** if you want.
3. Click **Start**. Download the jobs from the **Output** tab as JSON, CSV or Excel, or fetch them through the API.

Input example:

```json
{ "month": "2026-10", "keywords": ["rust", "python"], "remoteOnly": true, "maxItems": 100 }
```

#### Input fields

| Field | Default | What it does |
|---|---|---|
| `month` | latest | Thread month as `YYYY-MM` (e.g. `2026-10`) or `October 2026`. Empty = latest thread. |
| `monthsCount` | 1 | Number of monthly threads, going back from `month` (max 24). |
| `keywords` | none | Keep posts containing at least one keyword (header, description, stack). Case-insensitive. |
| `remoteOnly` | `false` | Keep only posts that mention remote work in their header. |
| `maxItems` | 20 (prefilled) | Maximum jobs saved (0 = no limit). |
| `proxyConfiguration` | none | Optional Apify Proxy. Usually not needed. |

### Output example

```json
{
  "id": "49922609",
  "company": "Sidekick Labs",
  "roles": ["Senior SWE, R&D Engineer, Intelligence Engineer"],
  "location": "REMOTE (US Timezones)",
  "remote": true,
  "remoteScope": "US Timezones",
  "workMode": ["remote"],
  "employmentTypes": ["full-time"],
  "visaSponsorship": null,
  "salary": "$170k to $230k",
  "salaryMin": 170000,
  "salaryMax": 230000,
  "salaryCurrency": "USD",
  "salaryPeriod": "year",
  "stack": ["Python", "Go"],
  "applyUrl": "https://sidekicklabs.com",
  "companyUrl": "https://sidekicklabs.com",
  "applyByEmail": true,
  "ycBatch": null,
  "header": "Sidekick Labs | Senior SWE, R&D Engineer, Intelligence Engineer | REMOTE (US Timezones) | Full-time | $170k to $230k Base + Equity + Health",
  "commentUrl": "https://news.ycombinator.com/item?id=49922609",
  "threadUrl": "https://news.ycombinator.com/item?id=49922569",
  "threadTitle": "Ask HN: Who is hiring? (October 2026)",
  "month": "2026-10",
  "postedAt": "2026-10-01T15:03:36.000Z",
  "source": "Hacker News (news.ycombinator.com) via HN Algolia API"
}
```

A real record from the October 2026 thread (`description` omitted here).

### How much does it cost to scrape HN Who Is Hiring?

**$2 per 1,000 jobs.** You pay only for jobs saved to the dataset; compute is included.

| You get | You pay |
|---|---|
| 20 jobs (prefilled input) | $0.04 |
| One full monthly thread (a few hundred posts) | under $1 |
| 12 months of history (several thousand posts) | about $10 |

Set `maxItems` to cap a run.

### How to get each new HN Who Is Hiring thread automatically

The thread is posted on the first weekday of every month. Create a monthly **schedule** in Apify (e.g. on the 2nd, with `month` empty) and send the jobs to **Google Sheets, Slack, email, Zapier, Make, n8n** or a **webhook** with Apify integrations.

### Use the HN Who Is Hiring API with AI agents (MCP)

Claude, Cursor and other MCP clients can call this Actor through the official Apify MCP server. Add `NORESPI/hn-who-is-hiring` to your Apify MCP configuration, then ask things like "which HN companies hiring this month sponsor visas for Rust engineers?".

### Use cases

- **Job seekers**: filter hundreds of startup jobs by stack, remote, visa or salary instead of scrolling the thread.
- **Job boards and newsletters**: a weekly digest of remote Rust, Python or AI jobs.
- **Recruiting and sales research**: which startups are hiring, for which roles and stacks, month after month.
- **Market research**: salaries, remote share and technology demand over 24 months.

### Limits (stated up front)

- Posts are free-form text, so rule-based extraction is good but not perfect. On the October 2026 thread, our tests require more than 95 % of posts with a company, 80 % with roles, 85 % with a location and 70 % with a URL. Keep `header` and `description` to check edge cases.
- `roles` may group several titles in one string when the poster wrote them together.
- Deleted comments and replies are skipped: only top-level posts are jobs.
- Only "Who is hiring?" threads are processed, not "Who wants to be hired?" or "Freelancer? Seeking freelancer?".

### Privacy

Job information only. **Email addresses, `mailto:` links and personal profile links (LinkedIn, X/Twitter, Calendly…) are removed** from every field, and the HN username of the poster is not included.

### FAQ

#### Which month is used by default?

The latest "Who is hiring?" thread.

#### Can I get historical HN Who Is Hiring data?

Yes: set `month` and `monthsCount` (up to 24 months per run).

#### Do I need a proxy or an HN account?

No. The public HN Algolia API works without either.

#### Does it use AI to extract fields?

No. Extraction is deterministic, so the same input always gives the same output.

#### Is this Actor affiliated with Hacker News or Y Combinator?

No. It is an independent tool that reads the public HN Algolia API. Every record links to the original comment (`commentUrl`): keep that link when you republish.

### Other job data Actors by NORESPI

| Actor | What it does | Price |
|---|---|---|
| [Career Page Jobs API](https://apify.com/NORESPI/ats-jobs-by-company) | Every open job of a list of companies, from Greenhouse, Lever, Ashby, Workable and 4 more ATS, plus a free hiring signal per company | $1 / 1,000 jobs |
| [Remote Jobs API](https://apify.com/NORESPI/remote-jobs-aggregator) | Remote OK, We Work Remotely and Himalayas in one deduplicated dataset | $1.50 / 1,000 jobs |

Questions, bugs or a field you need: open an issue in the **Issues** tab.

# Actor input Schema

## `month` (type: `string`):

Thread month as YYYY-MM (e.g. 2026-10) or 'October 2026'. Leave empty for the latest 'Who is hiring?' thread.

## `monthsCount` (type: `integer`):

How many monthly threads to process, going back from the month above (1 = only that month, max 24).

## `keywords` (type: `array`):

Keep only job posts containing at least one of these words (case-insensitive, searched in header, description and stack). Empty = all posts.

## `remoteOnly` (type: `boolean`):

Keep only posts whose header mentions remote work.

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

Maximum number of job posts to save (0 = no limit). You are charged per saved job.

## `proxyConfiguration` (type: `object`):

Optional. The public HN Algolia API usually works without a proxy.

## Actor input object example

```json
{
  "month": "",
  "monthsCount": 1,
  "keywords": [],
  "remoteOnly": false,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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 = {
    "keywords": [],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("norespi/hn-who-is-hiring").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 = {
    "keywords": [],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("norespi/hn-who-is-hiring").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 '{
  "keywords": [],
  "maxItems": 20
}' |
apify call norespi/hn-who-is-hiring --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,norespi/hn-who-is-hiring"
        }
    }
}
```

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/duODF0bvqVomAF2V0/builds/f4JQLyVOjWIIEnN4F/openapi.json
