# Hacker News Jobs Scraper – Who Is Hiring & YC Startup Jobs (`ninhothedev/hn-jobs-scraper`) Actor

$0.5/1K 🔥 Hacker News jobs scraper! Who-Is-Hiring threads & YC job posts — company, role, location & remote flag. No key. JSON, CSV, Excel or API in seconds. Find startup jobs & hiring trends ⚡

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

## Pricing

from $0.50 / 1,000 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/platform/actors/running/actors-in-store#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

## Hacker News Jobs & Who-Is-Hiring Scraper

Scrape **Hacker News job postings** into clean, structured JSON, CSV or Excel — with **no API key, no login and no cookies**. The actor covers the two places where HN hiring actually happens: the official **HN jobs feed** (YC-backed startup roles) and the legendary monthly **"Ask HN: Who is hiring?"** thread, where hundreds of companies post one job per comment.

Every posting is parsed into `company`, `role`, `location`, an `is_remote` boolean and a `salary_hint` — so you can filter, dedupe and pipe HN hiring data straight into a job board, an ATS, a newsletter or a spreadsheet, instead of scrolling 600 comments by hand.

### How is this different from the `hacker-news-scraper` actor?

They are complementary, not duplicates:

| | [hacker-news-scraper](https://apify.com/ninhothedev/hacker-news-scraper) | **hn-jobs-scraper** (this actor) |
|---|---|---|
| Target | HN **stories** — top / new / best / Ask HN / Show HN | HN **jobs** only |
| Sources | Front-page and story feeds | `jobstories` feed **+** "Ask HN: Who is hiring?" comment threads |
| Output | Story title, points, comments, author, URL | Job posting: company, role, location, remote flag, salary hint, full ad text |
| Parsing | None needed | Header-line parsing of the `Company \| Role \| Location \| REMOTE \| Salary` convention |
| Use it for | News monitoring, tech trends, link discovery | Job hunting, recruiting, hiring-market analysis |

If you want the HN front page, use `hacker-news-scraper`. If you want jobs, use this one.

### Modes

#### `whoishiring` (default)

Finds the **newest** "Ask HN: Who is hiring?" story automatically (posted on the 1st of every month by the `whoishiring` account), fetches its full comment tree and turns every top-level comment into one job record. A typical month yields **250–600 postings**.

Most posters follow the community convention:

```
SmarterDx | 150-250k+ + equity + benefits | Remote (US only) | Multiple roles | https://smarterdx.com/careers
```

The actor splits that header into `company` / `role` / `location`, and falls back to em-dash headers (`PrairieLearn (Remote US) — Full-Stack Software Engineer — TypeScript`) for the ~10% who ignore the pipes. Nothing is invented: fields that are not present stay `null`.

#### `jobstories`

Reads the official HN jobs feed (`news.ycombinator.com/jobs`), which is reserved for YC-funded companies. Around 30 live posts at any time, e.g. *"Bloomy (YC S26) is hiring a founding engineer"* → `company: "Bloomy"`, `role: "founding engineer"`. The YC batch tag is stripped from the company name and kept in the title.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `whoishiring` | `whoishiring` (monthly thread comments) or `jobstories` (official HN jobs feed) |
| `maxItems` | integer | `200` | Max job records to push. Max `2000`. |

```json
{
  "mode": "whoishiring",
  "maxItems": 300
}
```

### Output

```json
{
  "source_mode": "whoishiring",
  "item_id": 48748003,
  "title": null,
  "headline": "SmarterDx | 150-250k+ + equity + benefits | Remote (US only) | Multiple roles | https://smarterdx.com/careers",
  "company": "SmarterDx",
  "role": "150-250k+ + equity + benefits",
  "location": "Remote (US only)",
  "is_remote": true,
  "salary_hint": "150-250k+",
  "text": "SmarterDx | 150-250k+ + equity + benefits | Remote (US only) ... SmarterDx builds clinical AI ...",
  "author": "justin_sdx",
  "posted_at": "2026-07-01T15:02:50.000Z",
  "score": null,
  "url": "https://news.ycombinator.com/item?id=48748003",
  "thread_title": "Ask HN: Who is hiring? (July 2026)",
  "source": "hackernews",
  "scraped_at": "2026-07-28T14:12:03+00:00"
}
```

In `jobstories` mode, `title` holds the HN post title, `url` points at the company's careers page when the post has one, and `thread_title` is `null`. All fields are nullable.

### Use cases

- **Tech job hunting** — export every remote posting from this month's thread to CSV in one run, filter by `is_remote` and `salary_hint`, and apply before the thread scrolls away.
- **Recruiting & sourcing** — see which companies are hiring right now, for which roles, at which comp levels; build outbound lists of hiring managers who post their own ads.
- **Startup hiring trends** — track month over month how many YC startups hire, how remote-friendly the market is, and which stacks and titles are in demand.
- **Job boards & aggregators** — ingest HN hiring data on a schedule and republish it as a niche board or newsletter, with a stable `item_id` for deduplication.

### Pricing

Pay per result: roughly **$1 per 1,000 job records**, plus Apify platform usage. A full month's "Who is hiring?" thread (~300 postings) costs about **$0.30** and finishes in well under a minute.

### Notes

- Only public, keyless endpoints are used: the official HN Firebase API and the HN Algolia Search API. No account, proxy or browser is required.
- Only top-level comments are treated as job postings — replies (questions, "is this remote?", recruiter spam) are ignored.
- The actor fails loudly with a `RuntimeError` if it scrapes zero jobs, so scheduled runs never silently return an empty dataset.
- Data is public content posted by HN users; you are responsible for how you use it.

### Related actors

- [Hacker News Scraper](https://apify.com/ninhothedev/hacker-news-scraper) — HN stories, front page, Ask HN and Show HN
- [RemoteOK Jobs Scraper](https://apify.com/ninhothedev/remoteok-jobs-scraper) — remote job listings with salary data
- [Ashby Jobs Scraper](https://apify.com/ninhothedev/ashby-jobs-scraper) — jobs from Ashby-powered career pages
- [The Muse Jobs Scraper](https://apify.com/ninhothedev/muse-jobs-scraper) — curated company and job listings

# Actor input Schema

## `mode` (type: `string`):

Which Hacker News job source to scrape. 'whoishiring' reads the top-level comments of the newest monthly 'Ask HN: Who is hiring?' thread (hundreds of postings, one company per comment). 'jobstories' reads the official HN jobs feed (https://news.ycombinator.com/jobs), which is mostly YC-backed startups.

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

Maximum number of job records to push to the dataset. The 'whoishiring' thread usually contains 250-600 top-level postings, the 'jobstories' feed around 30. Defaults to 200, hard limit 2000.

## Actor input object example

```json
{
  "mode": "whoishiring",
  "maxItems": 200
}
```

# 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("ninhothedev/hn-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("ninhothedev/hn-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 ninhothedev/hn-jobs-scraper --silent --output-dataset

```

## MCP server setup

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