# Hacker News Who's Hiring Jobs Scraper (`parseforge/hn-whoishiring-scraper`) Actor

Scrapes job postings from the monthly Hacker News Who's Hiring threads. Returns each posting as a flat row with role, company, full description, parsed salary, remote flag, and tech stack. Filter by keyword, remote status, minimum salary, or stack.

- **URL**: https://apify.com/parseforge/hn-whoishiring-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Jobs, Developer tools, Automation
- **Stats:** 18 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.00 / 1,000 result items

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

[![ParseForge](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner.jpg)](https://apify.com/parseforge?fpr=vmoqkp)

### Hacker News Who's Hiring Jobs Scraper

**Scrape every job posting from the monthly Hacker News Who's Hiring threads, filtered by keyword, remote status, salary, or tech stack.** Each row returns the full job description, parsed salary, and remote tag. No API key needed. Export to CSV, JSON, Excel, or XML.

The official Hacker News API returns raw comment trees, not structured job listings. This actor reads the monthly Who's Hiring thread directly, parses each top-level comment into a clean job posting, and applies your filters locally so only the matches you care about land in your dataset. No app registration, no OAuth, and no rate-limit headaches.

| Who uses it | What they scrape Hacker News for |
|---|---|
| Job seekers | Find remote or high-salary roles matching a specific tech stack in the latest thread. |
| Recruiters | Monitor which companies are hiring for a given skill set and what compensation they offer. |
| Market analysts | Track hiring volume, salary bands, and remote-work adoption across the tech industry month over month. |
| Startup founders | Benchmark how competitors describe their open roles and what stack they are hiring for. |

### What it does

This Actor collects job postings from a specified monthly Hacker News Who's Hiring thread and returns each one as a flat row with the role, company, description, parsed salary, remote tag, and tech stack.

- 📅 **Monthly thread targeting:** pick any past thread by `YYYY-MM` or set `current` for the latest available Who's Hiring post.
- 🔍 **Free-text keyword filter:** search across the full job posting, including role title, company name, tech stack, and description body.
- 🏠 **Remote-only toggle:** return only postings that are explicitly tagged as remote.
- 💰 **Minimum salary filter:** set a USD floor and keep only jobs with a parsed salary at or above that number.
- 🛠️ **Stack keyword filter:** narrow results to postings that mention a specific technology like Python, Rust, or React.

Results export to CSV, JSON, Excel, or XML, or straight from the API.

### What you can do with Hacker News data

**📈 Track hiring trends over time.**

A market analyst runs the scraper on the last 12 monthly threads, filters for remote-only postings, and plots the count of Python roles to measure remote-work growth.

**🎯 Build a personal job alert.**

A developer sets the month to `current`, the stack to `Rust`, and the minimum salary to 150000, then runs the actor weekly to catch new high-paying Rust roles.

**🏢 Benchmark competitor hiring.**

A startup founder scrapes the current thread with a keyword filter for a competitor's name to see which roles they are filling and how they describe them.

**💰 Analyze salary bands by stack.**

A recruiter collects all postings from the latest thread, exports to CSV, and pivots on the parsed salary column to understand compensation ranges for React versus Python roles.

### Why choose this scraper

| | What you get |
|---|---|
| **Structured job rows** | Every top-level comment becomes one flat row with a fixed schema, ready for spreadsheets or databases. |
| **Parsed salary** | Heuristic extraction pulls a numeric USD salary from the free-text description when one is present. |
| **Remote flag** | A boolean column tells you immediately whether the posting is tagged remote. |
| **Full description** | The complete body text of the job posting is preserved in one field. |
| **No API key** | Reads the public Hacker News page directly. No Firebase or Algolia API registration required. |

### How it compares

This actor focuses exclusively on parsing the monthly Who's Hiring threads into structured job rows with salary extraction and filters. The general Hacker News Scraper covers the wider site via the official APIs.

| Feature | ParseForge | Hacker News Scraper |
|---|---|---|
| Dedicated Who's Hiring thread parsing | Yes, targets monthly threads directly | Yes, supports Who's Hiring extraction |
| Structured job rows with parsed salary | Yes, heuristic USD salary extraction | Not listed |
| Remote-only filter | Yes, checkbox filter | Not listed |
| Minimum salary filter | Yes, numeric USD threshold | Not listed |
| Stack keyword filter | Yes, filter by technology mention | Not listed |
| Full-text search across stories and comments | No, focused on job threads only | Yes, via Algolia API |

### Configure the run

Drive the Actor from a monthly thread identifier and optional filters for keyword, remote status, minimum salary, and tech stack. Filters run as each posting is parsed so only matches reach your dataset. The Input tab lists every parameter.

A first run with the defaults:

```json
{
 "maxItems": 10,
 "month": "current",
 "minSalary": 0
}
```

A larger pull:

```json
{
 "maxItems": 200,
 "month": "current",
 "minSalary": 0
}
```

### Pricing

Pay-per-result: **$0.02 per result** collected. You pay only for the results written to your dataset.

| Results collected | Approximate cost |
|---|---|
| 100 results | $2.00 |
| 1,000 results | $20.00 |
| 10,000 results | $200.00 |

New Apify accounts start with $5 in free credit.

### Free users

Free-plan runs return up to 10 results as a preview. [Upgrade your Apify plan](https://console.apify.com/sign-up?fpr=vmoqkp) to collect up to 1,000,000 results per run.

### Run it

1. [Create a free Apify account with $5 in credit](https://console.apify.com/sign-up?fpr=vmoqkp).
2. Open the [Hacker News Who's Hiring Jobs Scraper](https://apify.com/parseforge/hn-whoishiring-scraper?fpr=vmoqkp).
3. Set your inputs and any filters, then click **Start**.
4. Export the results as CSV, Excel, JSON, or XML from the **Dataset** tab.

Run it programmatically through the [Apify API](https://docs.apify.com/api/v2) (`run-sync-get-dataset-items`) or the [ApifyClient](https://docs.apify.com/api/client/js) for JavaScript and Python.

### Use with AI agents (MCP)

Give an AI agent live access to Hacker News through the Model Context Protocol. Add the Actor to Claude, Cursor, or any MCP client:

```bash
claude mcp add --transport http apify "https://mcp.apify.com/?tools=parseforge/hn-whoishiring-scraper"
```

Then prompt it in plain language to run the scraper and read back the results.

### Troubleshooting

**Why am I getting no results?**

Check that the month you entered has a Who's Hiring thread. If you used `current` and got nothing, the latest thread may not be posted yet. Also, try removing all filters to see if any postings exist, then re-apply filters one at a time.

**The salary filter is missing jobs I know should match.**

The salary parser looks for a clear USD number. If a posting writes 'competitive salary' or uses a range like '$120k-$160k', the heuristic may not extract a single number. Try lowering or removing the minimum salary filter and review the raw descriptions.

**My keyword filter returns too many unrelated jobs.**

The keyword filter does a broad text match. Try a more specific term, or combine it with the stack filter to narrow results to postings that mention both your keyword and a specific technology.

**The actor runs but the dataset is empty even without filters.**

Verify the month format is exactly `YYYY-MM`. A typo like `2026-5` will not match. Also confirm the thread for that month exists on Hacker News by visiting the site manually.

**Can I scrape multiple months in one run?**

The actor targets one thread per run. To collect multiple months, run the actor once per month and merge the datasets afterward, or schedule a series of runs with different month inputs.

### FAQ

| Question | Answer |
|---|---|
| Does this scraper need an API key or login? | No. It reads the public Hacker News Who's Hiring page directly. You do not need a Firebase or Algolia API key, and there is no OAuth flow. |
| How do I specify which monthly thread to scrape? | Set the Month field to a `YYYY-MM` string like `2026-05`, or use the word `current` to always target the latest available Who's Hiring thread. |
| How does the salary filter work? | The actor uses a heuristic to find a numeric USD salary inside the job description text. The minimum salary filter keeps only postings where that parsed number is at or above your threshold. |
| What counts as a remote posting? | A posting is flagged as remote when the original comment contains a remote tag. The remote-only checkbox filters your results to only those rows. |
| Can I search for multiple keywords at once? | The keyword filter accepts a single free-text string and matches it anywhere in the role, company, stack, or description. For multiple terms, run the actor once per term or filter the exported CSV yourself. |
| Does this scrape the entire Hacker News site? | No. This actor targets only the monthly Who's Hiring job threads. For general stories, comments, or user profiles, use a general Hacker News scraper. |
| How many job postings can I collect in one run? | You set the maximum with the 'Maximum job postings' field, up to 1,000,000 per run. The actor stops after reaching that count or when the thread is exhausted. |
| What output formats are supported? | You can export your dataset to CSV, JSON, Excel, or XML directly from the Apify run console. |
| Is the salary parsing always accurate? | Salary parsing is heuristic. It works well on clearly stated numbers like '$150k' or '$120,000', but may miss unusual formats or ranges. Always spot-check the raw description for critical decisions. |

### Related actors

Browse the full [ParseForge collection](https://apify.com/parseforge?fpr=vmoqkp) for more scrapers.

🆘 **Need help?** Email parseforge@protonmail.com with your run ID, your input, and what you expected.

⚠️ **Disclaimer.** This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by Y Combinator. It collects only publicly available data. You are responsible for using the collected data in compliance with the source's terms of service and applicable data-protection laws, including GDPR, CCPA, and PIPL. Do not use it to collect personal data unlawfully.

# Actor input Schema

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

How many job postings to collect per run.

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

Month in `YYYY-MM` format (e.g. `2026-05`), or `current` for the latest available thread.

## `keyword` (type: `string`):

Free-text search applied to each job posting (matches role, company, stack, description). Empty = all jobs.

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

When checked, returns only postings tagged remote.

## `minSalary` (type: `integer`):

Filter to jobs with a parsed salary at or above this number. Empty = no salary filter. Salary parsing is heuristic.

## `stack` (type: `string`):

Filter to jobs mentioning a specific stack (e.g. `Python`, `Rust`, `React`).

## Actor input object example

```json
{
  "maxItems": 10,
  "month": "current",
  "remoteOnly": false
}
```

# Actor output Schema

## `overview` (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 = {
    "maxItems": 10,
    "month": "current",
    "keyword": "",
    "minSalary": 0,
    "stack": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/hn-whoishiring-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 = {
    "maxItems": 10,
    "month": "current",
    "keyword": "",
    "minSalary": 0,
    "stack": "",
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/hn-whoishiring-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 '{
  "maxItems": 10,
  "month": "current",
  "keyword": "",
  "minSalary": 0,
  "stack": ""
}' |
apify call parseforge/hn-whoishiring-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parseforge/hn-whoishiring-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/fBHoDsXVcqM9uNuBU/builds/jaHQ4EPgY8bu0Z1Cd/openapi.json
