# Hacker News Job Scraper: Who is Hiring Posts (`getascraper/hn-hiring-scraper`) Actor

Extract structured job postings from Hacker News monthly 'Who is Hiring?' threads, plus each poster's HN account karma, age, and a derived trust score, so you can tell an established company from a brand-new account. Parse company, role, location, salary, and technologies.

- **URL**: https://apify.com/getascraper/hn-hiring-scraper.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** Lead generation, AI, Social media
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.67 / 1,000 jobs

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

## 💻 HN Who is Hiring Scraper

<table width="100%" style="table-layout:fixed;border-collapse:collapse">
<tr>
<td colspan="4" style="padding:14px 18px;background:#FFF6F0;border-top:3px solid #FF6600;border-left:1px solid #D6D3D1;border-right:1px solid #D6D3D1;border-radius:8px 8px 0 0">
<span style="font-size:16px;font-weight:700;color:#1C1917">Auto-discover Hacker News hiring threads and extract every job posting as clean JSON.</span> <span style="font-size:15px;color:#57534E">Company, role, remote status, salary, tech stack, and contact emails pulled from HN's monthly Who is Hiring threads, no manual copy-paste required.</span>
</td>
</tr>
<tr>
<td colspan="4" style="padding:10px 14px;background:#FF6600;border-left:1px solid #D6D3D1;border-right:1px solid #D6D3D1">
<span style="color:#FFFFFF;font-size:14px;font-weight:700;letter-spacing:0.5px">Global technology and remote hiring</span>
<span style="color:#FFE0CC;font-size:13px">&nbsp;&nbsp;&bull;&nbsp;&nbsp;Hacker News Hiring, GoFractional, NoFluffJobs, and Welcome to the Jungle tech roles</span>
</td>
</tr>
<tr>
<td style="padding:10px 12px;border-left:1px solid #D6D3D1;border-bottom:1px solid #D6D3D1;vertical-align:top;width:25%;background:#FFF6F0;border-radius:0 0 0 8px">
<span style="overflow-wrap:break-word;word-break:break-word"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/jNDbFabbVxMhnQNb4-actor-gYsH3egwBgpHrYvDy-jnB3Dy3T0T-idyTiXWa0b_logos.jpeg" width="20" height="20" style="vertical-align:middle;border-radius:4px"> &nbsp;<a href="https://apify.com/getascraper/hn-hiring-scraper" style="color:#FF6600;text-decoration:none;font-weight:700;font-size:13px">HN Hiring</a></span><br>
<span style="color:#FF6600;font-size:11px;font-weight:700">&#10148; You are here</span>
</td>
<td style="padding:10px 12px;border-left:1px solid #D6D3D1;border-bottom:1px solid #D6D3D1;vertical-align:top;width:25%;background:#FFFFFF">
<span style="overflow-wrap:break-word;word-break:break-word"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/jNDbFabbVxMhnQNb4-actor-3CkmuMxY5A32LFUVK-HvrBsUqudd-CompressJPEG.Online_img%28512x512%29_%2814%29.jpg" width="20" height="20" style="vertical-align:middle;border-radius:4px"> &nbsp;<a href="https://apify.com/getascraper/gofractional-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">GoFractional</a></span><br>
<span style="color:#57534E;font-size:11px">Fractional jobs, direct ATS links</span>
</td>
<td style="padding:10px 12px;border-left:1px solid #D6D3D1;border-bottom:1px solid #D6D3D1;vertical-align:top;width:25%;background:#FFFFFF">
<span style="overflow-wrap:break-word;word-break:break-word"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/jNDbFabbVxMhnQNb4-actor-8yRcUitgDZ4hjuXRb-y1ZD2xaQHl-CompressJPEG.Online_img%28512x512%29_%282%29.jpg" width="20" height="20" style="vertical-align:middle;border-radius:4px"> &nbsp;<a href="https://apify.com/getascraper/nofluffjobs-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">NoFluffJobs</a></span><br>
<span style="color:#57534E;font-size:11px">European tech jobs and salaries</span>
</td>
<td style="padding:10px 12px;border-left:1px solid #D6D3D1;border-right:1px solid #D6D3D1;border-bottom:1px solid #D6D3D1;vertical-align:top;width:25%;background:#FFFFFF;border-radius:0 0 8px 0">
<span style="overflow-wrap:break-word;word-break:break-word"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/jNDbFabbVxMhnQNb4-actor-EHYZMfLdzhg5EDKIw-fdXrbkycqu-icon_%281%29.webp" width="20" height="20" style="vertical-align:middle;border-radius:4px"> &nbsp;<a href="https://apify.com/getascraper/welcome-to-the-jungle-jobs-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">WTTJ</a></span><br>
<span style="color:#57534E;font-size:11px">Raw JSON or RAG-ready jobs</span>
</td>
</tr>
</table>

<table width="100%">
<tr>
<td style="padding:24px 28px;background:#FFF6F0;border:1px solid #FFE0CC;border-top:4px solid #FF6600;border-radius:12px">
<span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">Turn HN hiring threads into structured job data</span><br>
<span style="font-size:15px;color:#57534E;line-height:1.6">Auto-discovers Hacker News Who is Hiring threads and parses company, role, remote status, salary, and tech stack out of raw comment text into clean JSON.</span>
</td>
</tr>
</table>

<table width="100%">
<tr>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #FFE0CC;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#FF6600">🧩 Structured data</span><br>
<span style="font-size:12px;color:#57534E">Company, role, salary, and tech stack pulled from unstructured comments</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #FFE0CC;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#FF6600">🔍 Auto-discovery</span><br>
<span style="font-size:12px;color:#57534E">Finds the latest hiring thread automatically, no URL needed</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #FFE0CC;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#FF6600">🗓️ Historical data</span><br>
<span style="font-size:12px;color:#57534E">Scrape up to 12 months back for hiring trend analysis</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #FFE0CC;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#FF6600">✉️ Contact extraction</span><br>
<span style="font-size:12px;color:#57534E">Emails and application URLs pulled out automatically</span>
</td>
</tr>
</table>

Extract structured job postings from Hacker News monthly "Who is Hiring?" threads. Parse company, role, location, remote status, salary, technologies, emails, and application URLs from the largest organic tech job board on the internet.

Built on the official Hacker News Firebase API and Algolia Search API for reliable, rate-limit-free access to job data.

### 💡 Why use it?

- **Structured Data**: Extracts company, role, location, remote status, salary, technologies, emails, and URLs from unstructured HN comments
- **Auto-Discovery**: Automatically finds the latest "Who is Hiring?" posts without needing specific URLs
- **Historical Data**: Scrape multiple months back for trend analysis
- **Tech-Focused**: Identifies technologies mentioned in each job post for filtering and analysis
- **Contact Extraction**: Automatically finds email addresses and application URLs

### 🚀 How to use

<table width="100%">
<tr>
<td style="padding:16px 14px;width:33%;background:#FFF6F0;border:1px solid #FFE0CC;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#FF6600;letter-spacing:1px">STEP 1</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Open and configure</span><br>
<span style="font-size:12px;color:#57534E">Leave startUrls empty to auto-discover, or set monthsBack up to 12.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#FFF6F0;border:1px solid #FFE0CC;border-left:none;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#FF6600;letter-spacing:1px">STEP 2</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Set limits</span><br>
<span style="font-size:12px;color:#57534E">Cap maxJobsPerMonth and optionally include nested reply threads.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#FFF6F0;border:1px solid #FFE0CC;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#FF6600;letter-spacing:1px">STEP 3</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Run and export</span><br>
<span style="font-size:12px;color:#57534E">Consume the output via Apify API, CSV, or JSON.</span>
</td>
</tr>
</table>

### 📋 Input fields

- `startUrls` (array, optional): Specific HN "Who is Hiring?" post URLs. If empty, auto-discovers the latest posts.
- `monthsBack` (integer): How many months of hiring posts to scrape when auto-discovering. Default: 1, Max: 12.
- `maxJobsPerMonth` (integer): Maximum job postings to extract per month. Default: 0 (unlimited).
- `includeReplies` (boolean): Whether to include nested replies/discussion threads. Default: false.
- `proxyConfiguration` (object): Proxy configuration for API requests. Optional - HN APIs are generally open.

### 📦 Output schema

Each dataset item represents one job posting:

```json
{
  "commentId": 22666455,
  "hnUser": "kfx",
  "postedAt": 1584984975,
  "postedAtIso": "2020-03-23T17:36:15.000Z",
  "rawText": "PBS | Various Engineers | Full-Time | ONSITE...",
  "cleanText": "PBS | Various Engineers | Full-Time | ONSITE...",
  "company": "PBS",
  "role": "Various Engineers",
  "location": "Alexandria, VA",
  "remoteStatus": "ONSITE (Flexible WFH)",
  "employmentType": "Full-Time",
  "salary": null,
  "technologies": ["express", "iOS"],
  "emails": ["digitaljobs@pbs.org"],
  "urls": ["https://tinyurl.com/v7c8nb2"],
  "isTopLevel": true,
  "parentId": 22665398,
  "replyCount": 0,
  "hnUrl": "https://news.ycombinator.com/item?id=22666455"
}
```

### 📊 Data table

| Field | Type | Description |
|---|---|---|
| `commentId` | number | Unique HN comment ID |
| `company` | string | Company name (extracted from post) |
| `role` | string | Job role/title |
| `location` | string | Job location |
| `remoteStatus` | string | REMOTE, ONSITE, HYBRID, etc. |
| `employmentType` | string | Full-time, Contract, Intern, etc. |
| `salary` | string | Salary range if found in text |
| `technologies` | array | Technologies mentioned in the post |
| `emails` | array | Email addresses found |
| `urls` | array | Application/company URLs found |
| `hnUser` | string | HN username who posted the job |
| `postedAtIso` | string | ISO timestamp of the post |
| `replyCount` | number | Number of replies to this job post |
| `hnUrl` | string | Direct link to the comment on HN |

### 💰 Pricing / cost estimation

Priced at **$0.02 per job posting** (Pay-per-Result).

| Target Jobs | Estimated Cost |
|---|---|
| 100 | $2.00 |
| 500 | $10.00 |
| 1,000 | $20.00 |

HN APIs are open and free to access. No proxy costs typically required.

### ⭐ Enjoying HN Who is Hiring Scraper?

<table width="100%">
<tr>
<td style="padding:20px 24px 14px;background:#FFF6F0;border:1px solid #FFF6F0;border-left:5px solid #FF6600;border-radius:10px 10px 0 0">
<span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br>
<span style="font-size:17px;font-weight:800;color:#1C1917">Turn Hacker News hiring threads into a searchable feed of company, role, and salary leads within minutes.</span><br>
<span style="font-size:14px;color:#57534E">A 5-star rating takes 10 seconds and helps other tech recruiters and job seekers find it. Your feedback also tells us what to build next.</span>
</td>
</tr>
<tr>
<td style="padding:0;background:#FF6600;border:1px solid #FFF6F0;border-top:none;border-radius:0 0 10px 10px;text-align:center">
<a href="https://apify.com/getascraper/hn-hiring-scraper/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a>
</td>
</tr>
</table>

### ✨ Tips / Advanced

- **Auto-Discovery**: Leave `startUrls` empty and set `monthsBack` to 3-6 to get a rolling window of hiring posts
- **Focus on Remote**: Filter output by `remoteStatus` field containing "REMOTE"
- **Tech Filtering**: Use the `technologies` array to find jobs matching specific skills
- **Speed**: Each API call has a 50ms delay to be respectful to HN. Expect ~20 jobs/minute

### ❓ FAQ

**Is scraping Hacker News legal?**
HN provides official APIs (Firebase and Algolia) for accessing this data. This Actor uses those APIs, not HTML scraping.

**Why did I get fewer results than expected?**
Some comments in hiring threads are discussion, not job posts. The parser attempts to filter these, but imperfectly. Set `includeReplies: true` to capture more.

**Can I scrape historical data?**
Yes. Set `monthsBack` up to 12 to scrape past hiring threads. Note that older posts may have fewer active listings.

### 🛠️ Support

For bug reports or feature requests, open a ticket in the Issues tab.

### 🔗 Other actors

- [TeamBlind Reviews Scraper](https://apify.com/getascraper/teamblind-reviews-scraper) ↗ - collects anonymous tech employer ratings and reviews from Blind.
- [NoFluffJobs Scraper](https://apify.com/getascraper/nofluffjobs-scraper) ↗ - extracts tech job listings and transparent salary ranges.
- [CWJobs Scraper](https://apify.com/getascraper/cwjobs-scraper) ↗ - pulls UK tech job listings with salaries and locations.
- [Wantedly Japan Jobs Scraper](https://apify.com/getascraper/wantedly-jobs-scraper) ↗ - gathers startup job listings from Japan's Wantedly platform.
- [Bug Bounty Finder](https://apify.com/getascraper/bug-bounty-finder) ↗ - aggregates active bug bounty programs from HackerOne and Bugcrowd.

# Actor input Schema

## `startUrls` (type: `array`):

Specific Hacker News 'Who is Hiring?' post URLs. If empty, auto-discovers the latest posts.

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

How many months of hiring posts to scrape when auto-discovering. Max 12.

## `maxJobsPerMonth` (type: `integer`):

Maximum job postings to extract per month. 0 = unlimited.

## `includeReplies` (type: `boolean`):

Whether to include nested replies/discussion threads.

## `includeRawText` (type: `boolean`):

Include the original HTML-encoded comment text alongside the cleaned text. Off by default: the cleaned text alone carries the full content and roughly halves the size (and cost) of each row.

## `minPosterTrust` (type: `integer`):

Only include jobs whose poster has at least this HN trust score (0-100), derived from their account karma and age. Leave empty to include all posts regardless of poster trust.

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

Optional proxy settings. Defaults to enabling Apify Proxy to prevent blocks during cloud runs.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://news.ycombinator.com/item?id=47975571"
    }
  ],
  "monthsBack": 1,
  "maxJobsPerMonth": 0,
  "includeReplies": false,
  "includeRawText": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "startUrls": [
        {
            "url": "https://news.ycombinator.com/item?id=47975571"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/hn-hiring-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 = {
    "startUrls": [{ "url": "https://news.ycombinator.com/item?id=47975571" }],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/hn-hiring-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 '{
  "startUrls": [
    {
      "url": "https://news.ycombinator.com/item?id=47975571"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call getascraper/hn-hiring-scraper --silent --output-dataset

```

## MCP server setup

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