# Hacker News Who Is Hiring: Structured Job Posts (`reaperoak/hacker-news-who-is-hiring-parser`) Actor

Turn the monthly Hacker News 'Who is hiring?' thread into structured jobs: company, roles, location, remote, salary, visa, tech stack and links. Filter by keyword, location or remote. Emails are never returned.

- **URL**: https://apify.com/reaperoak/hacker-news-who-is-hiring-parser.md
- **Developed by:** [Owais Khan](https://apify.com/reaperoak) (community)
- **Categories:** Jobs, Lead generation, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.70 / 1,000 job posts

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?

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 Who Is Hiring: Structured Job Posts

Turn the monthly **Hacker News "Ask HN: Who is hiring?"** thread into clean, structured job posts: company, roles, location, remote or onsite, salary, visa sponsorship, tech stack and links. Filter by keyword, location or remote. **Email addresses are never returned.**

### What is the Hacker News Who Is Hiring parser?

Every month hundreds of startups and engineering teams post jobs in one Hacker News thread, in a loose `Company | Role | Location | REMOTE | Salary` format. This Actor reads the thread through the public Hacker News search API and parses each post into columns, so you can filter and sort instead of scrolling.

### What makes it different?

- **Parsed, not just copied.** Company, roles, location, workplace type, salary and tech stack are split out of the free text.
- **Salary and visa signals.** Pay ranges and visa sponsorship (yes, no or not mentioned) are detected.
- **Multiple months.** Ask for any recent month, or leave it empty for the newest thread.
- **Privacy by default.** Posts often contain contact emails. The Actor flags `hasEmail` but never outputs the address, and the full post text is optional.

### What data can you extract from Who is hiring?

| Field | Example |
|---|---|
| `company, roles` | `Sidekick Labs`, `Senior SWE, R&D Engineer` |
| `location, workplace, remote, remoteScope` | `Utrecht, The Netherlands`, `hybrid`, `false` |
| `employmentTypes` | `full-time` |
| `salaryMin, salaryMax, salaryCurrency` | `170000`, `230000`, `USD` |
| `visaSponsorship` | `true`, `false` or `null` when not mentioned |
| `tech` | `TypeScript`, `PostgreSQL`, `React` |
| `links, hasEmail` | links in the post, and whether it names a contact email |
| `url, postedAt, hnUser` | the post on Hacker News, when, and the public username |

A `SUMMARY` record lists each month's thread id and link, how many posts it has and how many this run returned.

### How to scrape Hacker News Who is hiring

1. Leave **Months** empty for the newest thread, or list months like `2026-09`.
2. Add keywords (`rust`, `machine learning`), locations, or tick remote only.
3. Click **Start**.
4. Download JSON, CSV or Excel, or call the Actor from the API, a schedule, Make, n8n or Zapier.

```json
{
    "keywords": [
        "python"
    ],
    "maxPostsPerMonth": 20
}
```

- **keywords**: match anywhere in the post, not just the headline.
- **locations**: match the parsed location or the headline.
- **remoteOnly**: keeps posts whose headline says remote.

### How much does it cost?

You pay per post returned plus a very small start fee. There is no subscription.

| Posts | Approximate cost |
|---|---|
| 10 | $0.02 |
| 100 | $0.20 |
| 1,000 | $2 |
| 10,000 | $20 |

Paid Apify plans get tiered discounts, and you can set a maximum cost per run. You can try it on Apify's free plan without a card.

### Who is it for?

- **Job seekers** who want to filter the thread by stack, salary or visa.
- **Recruiters and sourcers** finding startups that are hiring.
- **Founders and analysts** tracking which technologies and salaries are in demand.
- **Newsletter and job-board builders** needing a structured feed (with attribution to Hacker News).

### Frequently asked questions

**Is the parsing perfect?** No. Posts are free text, so company, roles and location come from the headline format most posters follow. Unusual headlines can leave fields empty; the full headline and links are always returned.

**Why are emails removed?** Contact emails are personal data. The Actor tells you a post has one (`hasEmail`) and links to the post on Hacker News, where you can read it yourself.

**Which months are available?** The most recent threads that the Hacker News search API lists, roughly the last six months.

**Does it cover Who wants to be hired?** No, only job posts. Candidate posts are personal data and are left out on purpose.

### Notes and limits

- Reads Hacker News through its public search API. Posts belong to their authors; link back to the post on Hacker News and mention Hacker News as the source when you republish.
- This Actor is not affiliated with Hacker News or Y Combinator.

# Actor input Schema

## `months` (type: `array`):

Months to read as <code>YYYY-MM</code>, for example <code>2026-10</code>. Leave empty for the newest thread. The listing covers recent threads.

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

Keep only posts containing any of these words anywhere, for example <code>rust</code>, <code>machine learning</code> or <code>series a</code>.

## `locations` (type: `array`):

Keep only posts whose location or headline contains any of these, for example <code>London</code> or <code>Berlin</code>.

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

Keep only posts that say remote in the headline.

## `maxPostsPerMonth` (type: `integer`):

Stops after this many matching posts per month.

## `includeText` (type: `boolean`):

Adds the plain-text post (email addresses removed). Off by default to keep rows small.

## Actor input object example

```json
{
  "remoteOnly": false,
  "maxPostsPerMonth": 20,
  "includeText": false
}
```

# Actor output Schema

## `results` (type: `string`):

One row per job post: company, roles, location, remote flag, salary, visa sponsorship, tech stack and links.

## `summary` (type: `string`):

For each month: the thread id and link, how many posts it has, and how many this run returned.

# 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 = {
    "maxPostsPerMonth": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("reaperoak/hacker-news-who-is-hiring-parser").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 = { "maxPostsPerMonth": 20 }

# Run the Actor and wait for it to finish
run = client.actor("reaperoak/hacker-news-who-is-hiring-parser").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 '{
  "maxPostsPerMonth": 20
}' |
apify call reaperoak/hacker-news-who-is-hiring-parser --silent --output-dataset

```

## MCP server setup

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

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/S7wUCicMxODQ0ULKs/builds/yGl4brA8PO4Ku7yMo/openapi.json
