# Hacker News Who's Hiring Jobs Parser (`yiafirm/hn-hiring-jobs`) Actor

Turn the monthly Hacker News "Ask HN: Who is hiring?" thread into structured job rows: company, roles, locations, remote, visa, salary and tech stack. Filter, export or monitor for new posts.

- **URL**: https://apify.com/yiafirm/hn-hiring-jobs.md
- **Developed by:** [Yia LLC](https://apify.com/yiafirm) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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.

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

### What does Hacker News Who's Hiring Jobs Parser do?

Every month, hundreds of startups and tech companies post openings in the **[Hacker News](https://news.ycombinator.com) "Ask HN: Who is hiring?"** thread. The posts are free text, which makes them hard to search, filter or load into a spreadsheet.

This Actor turns each post into a **structured job row**: company, funding stage, roles, locations, **remote / on-site / hybrid**, **visa sponsorship**, **salary range**, **tech stack**, company website and a link back to the post. It uses the official **HN Search API**, so it is fast and reliable, and it works as a **Hacker News jobs API** you can call from any tool.

### Why use it?

- 🔎 **Job seekers.** Find remote Rust roles that sponsor visas and list a salary, in seconds.
- 📈 **Sales and recruiting teams.** The thread is a monthly list of funded companies that are actively hiring engineers, a strong buying signal.
- 📊 **Researchers and writers.** Track hiring trends, salaries and technologies month by month, back three years.
- 🔔 **Daily alerts.** Companies keep posting all month. Monitor mode returns only new posts on each scheduled run.

### What data can it extract?

| Field | Description |
|---|---|
| `company`, `companyStage` | Company name and stage or YC batch, when mentioned |
| `roles`, `locations` | Role and location segments from the headline |
| `remote`, `onsite`, `hybrid` | Workplace flags from the headline |
| `visaSponsorship` | true, false (ruled out) or null (not mentioned) |
| `salaryMin`, `salaryMax`, `salaryCurrency` | Pay range, when stated |
| `technologies` | Languages, frameworks and platforms mentioned |
| `companyUrl`, `links` | Company website and all links in the post |
| `headline`, `text` | First line and full text (email addresses removed) |
| `hnUrl`, `postedAt`, `threadMonth` | Where and when it was posted |

### How to scrape Hacker News Who is hiring?

1. Open the **Input** tab. By default the Actor parses **this month's thread**.
2. Optionally pick older months (`2026-09`), more recent threads, or exact thread URLs.
3. Add filters: keywords, locations, technologies, remote only, visa only, salary only.
4. Click **Start** and download the results as JSON, CSV, Excel or HTML.
5. For alerts, turn on **Only new posts since last run** and add a daily **Schedule**.

### How much does it cost?

Pay per event: **$1.50 per 1,000 job posts saved**. A full monthly thread (around 250 to 400 posts) costs about **$0.40 to $0.60**. A filtered daily monitor usually costs a few cents a month. Apify's free plan includes monthly credits you can use to try it.

### Input

See the **Input** tab for all options. Nothing is required: run it as is to get the current month.

### Output

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

```json
{
  "postId": "40000001",
  "threadMonth": "2026-01",
  "company": "Example Corp",
  "companyStage": "Series A",
  "roles": ["Senior Backend Engineer, Product Designer"],
  "locations": ["San Francisco, CA", "REMOTE (US)"],
  "remote": true,
  "visaSponsorship": true,
  "salaryMin": 150000,
  "salaryMax": 190000,
  "salaryCurrency": "USD",
  "technologies": ["TypeScript", "Postgres", "AWS"],
  "companyUrl": "https://example.com",
  "hnUrl": "https://news.ycombinator.com/item?id=40000001",
  "postedAt": "2026-01-02T15:04:05.000Z"
}
```

### Tips

- Posts are free text, so parsing is best-effort. The `headline` and `text` fields are always included so you can check anything that matters.
- Use **technologies** and **location** filters to keep runs small and cheap.
- Only top-level posts are returned. Replies and the "Who wants to be hired?" thread (individual job seekers) are not collected.

### FAQ, disclaimers and support

**What about personal data?** Usernames are not collected and **email addresses are removed** from the post text. Posts are job ads that companies published publicly.

> Our Actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our Actors, when used for ethical purposes by Apify users, are safe. However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

Spotted a post that was parsed wrong? Open an issue in the **Issues** tab with the post link. For programmatic access, see the **API** tab.

# Actor input Schema

## `latestThreads` (type: `integer`):

How many of the most recent monthly threads to parse when no months or thread IDs are given. 1 means this month only.

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

Parse the threads for these months instead, in YYYY-MM format, for example 2026-10.

## `threadIds` (type: `array`):

Parse these exact threads, for example https://news.ycombinator.com/item?id=49922569.

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

Keep posts that mention at least one of these words anywhere (case-insensitive).

## `excludeKeywords` (type: `array`):

Drop posts that mention any of these words.

## `locationKeywords` (type: `array`):

Keep posts whose headline or locations mention one of these, for example "NYC", "London" or "Europe".

## `technologies` (type: `array`):

Keep posts tagged with at least one of these, for example "Rust", "Python" or "Kubernetes".

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

Keep posts whose headline says remote.

## `visaSponsorshipOnly` (type: `boolean`):

Keep posts that mention visa sponsorship (and don't rule it out).

## `onlyWithSalary` (type: `boolean`):

Keep posts that state a pay range.

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

Add the full plain-text post. Email addresses are always removed.

## `maxPosts` (type: `integer`):

Stop after saving this many posts.

## `onlyNewSinceLastRun` (type: `boolean`):

Companies keep posting through the month. Turn this on with a daily schedule to get only the new posts each day. The first run returns everything that matches.

## `monitorName` (type: `string`):

Use a different name for each separate watch so their memories don't mix.

## Actor input object example

```json
{
  "latestThreads": 1,
  "remoteOnly": false,
  "visaSponsorshipOnly": false,
  "onlyWithSalary": false,
  "includeText": true,
  "maxPosts": 1000,
  "onlyNewSinceLastRun": false,
  "monitorName": "default"
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset of parsed job posts

## `runSummary` (type: `string`):

Per-input counts, errors and why the run stopped

# 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("yiafirm/hn-hiring-jobs").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("yiafirm/hn-hiring-jobs").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 yiafirm/hn-hiring-jobs --silent --output-dataset

```

## MCP server setup

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

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/s9OD1VUV6oW6dzc0N/builds/klxSqNUGcDSlg4led/openapi.json
