# Hacker News Scraper – Who Is Hiring Jobs, Search & Comments (`dedicated_crest/hacker-news-search-hiring`) Actor

Hacker News API scraper: parsed 'Ask HN: Who is hiring?' job posts (company, role, location, remote, salary, links), full-text search of stories & comments, top/new/best/Show/Ask feeds and comment threads. Official APIs, no key. $3 per 1,000 results.

- **URL**: https://apify.com/dedicated_crest/hacker-news-search-hiring.md
- **Developed by:** [Ben Barazandeh](https://apify.com/dedicated_crest) (community)
- **Categories:** Jobs, Developer tools, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 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/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 Scraper – Who Is Hiring Jobs, Search & Comments

**Turn Hacker News into structured data in seconds.** Get parsed **"Ask HN: Who is hiring?"** job posts (company, roles, location, remote flag, salary, links), **full-text search** of stories and comments with date, points and author filters, the live **top / new / best / Ask HN / Show HN / jobs** feeds, and complete **comment threads**. It uses only the official Hacker News API (Firebase) and the public HN Search API by Algolia, so there is no login, no key, no proxies and no HTML scraping.

**Try it now:** the input is pre-filled with *Who is hiring*, keyword `engineer`, 50 results. Click **Start**.

### What can you do with it?

- **Find startup jobs & hiring leads**: every month hundreds of companies post in "Who is hiring?". The October 2026 thread had 266 top-level posts when we tested. Filter by keyword, remote or location and export to Sheets/CSV, or use it as a list of companies hiring engineers right now.
- **Brand & competitor monitoring**: schedule a daily search for your product or competitors' names and get every new story and comment.
- **Developer sentiment & trend research**: pull every comment that mentions a technology over a date range.
- **Launch tracking**: watch Show HN for new tools in your space.
- **AI / RAG datasets**: clean plain-text stories and comments with consistent fields.

### Modes

| Mode | What you get | Key inputs |
|---|---|---|
| `whoIsHiring` | One row per top-level post in the latest (or last N) monthly *Who is hiring?*, *Who wants to be hired?* or *Freelancer?* thread, with parsed company, roles, location, remote, salary, visa mention and URLs | `keywords`, `remoteOnly`, `locations`, `hiringMonths`, `hiringThread` |
| `search` | Stories, comments, Show HN, Ask HN, polls or jobs matching a query | `query`, `contentType`, `sortBy`, `author`, `lastDays` / `dateFrom` / `dateTo`, `minPoints`, `minComments` |
| `feed` | The live top, new, best, Ask, Show or jobs list | `feed`, `keywords`, `minPoints` |
| `items` | Specific items by ID or URL, optionally with the full comment tree | `itemIds`, `includeComments` |

### Real run results (17 Oct 2026)

Run `01vRbOPwudpQquag3`, input `{"mode":"whoIsHiring","keywords":["engineer"],"maxItems":50}`, took about 6 seconds. Of the 50 posts saved, 37 had a parsed location, 31 parsed roles and 25 a parsed salary range.

| Company | Roles | Location | Remote | Salary |
|---|---|---|---|---|
| PrairieLearn | Full-Stack Software Engineer | – | True | $100k-$180k |
| Sidekick Labs | Senior SWE, R\&D Engineer, Intelligence Engineer | REMOTE (US Timezones) | True | $170k to $230k |
| Open Education Applications / Neon | Senior/Lead Platform & DevOps Engineer, Senior Frontend Engineer, Senior Full-Stack Engineer | Utrecht, The Netherlands | False | – |
| PAGNOS | Cloud Engineer, AWS Serverless (TypeScript/Node.js) | – | True | €75k–80k |
| Snout | Multiple Engineering + Product Roles | Remote US or Ontario, Canada | True | – |
| Planlab.ai | Product Engineer (Design) & Platform Engineer | ONSITE in London, UK | False | – |
| CareerJumpShip | – | – | True | $104K–$150K |
| Checkly | Senior Product Engineer, Product Manager, Senior Sales Engineer, Solutions Engineer | REMOTE (Europe / US Eastern) | True | – |

Sample item (text truncated with `textMaxChars: 300`):

```json
{
  "id": 49922584,
  "type": "hiring_post",
  "threadId": 49922569,
  "threadTitle": "Ask HN: Who is hiring? (October 2026)",
  "threadMonth": "2026-10",
  "company": "PrairieLearn",
  "headline": "PrairieLearn (Remote US) — Full-Stack Software Engineer — TypeScript / Postgres / React / AI",
  "roles": "Full-Stack Software Engineer",
  "location": null,
  "remote": true,
  "visaSponsorship": null,
  "salary": "$100k-$180k",
  "urls": [
    "https://www.prairielearn.com",
    "https://github.com/PrairieLearn/PrairieLearn",
    "https://www.prairielearn.com/jobs-ashby?utm_source=YeEJ5MAKkr&ashby_jid=ee6fdbc3-1c3a-4fa3-bb3f-13ddab449baf"
  ],
  "author": "mwest1066",
  "createdAt": "2026-10-01T15:02:37.000Z",
  "hnUrl": "https://news.ycombinator.com/item?id=49922584",
  "text": "PrairieLearn (Remote US) — Full-Stack Software Engineer — TypeScript / Postgres / React / AI\n\nPrairieLearn (https://www.prairielearn.com) is an open-source assessment platform used by universities across the US (Berkeley, Princeton, Michigan, Illinois, and others). We power mastery-based learning an",
  "scrapedAt": "2026-10-17T18:37:50.564Z"
}
```

Search / feed / items results share one schema: `id, type, title, url, hnUrl, author, points, numComments, createdAt, isShowHN, isAskHN, storyId, storyTitle, parentId, text, domain, scrapedAt`.

### Input examples

Remote Rust or Go jobs from the last 3 monthly threads:

```json
{ "mode": "whoIsHiring", "keywords": ["rust", "golang"], "remoteOnly": true, "hiringMonths": 3, "maxItems": 500 }
```

Every comment mentioning your brand in the last 7 days:

```json
{ "mode": "search", "query": "yourbrand", "contentType": "comment", "lastDays": 7 }
```

Show HN launches with 50+ points in 2026:

```json
{ "mode": "search", "contentType": "show_hn", "dateFrom": "2026-01-01", "minPoints": 50, "maxItems": 1000 }
```

Current front page:

```json
{ "mode": "feed", "feed": "top", "maxItems": 30 }
```

### Pricing

**Pay per event: $0.003 per result** ($3 per 1,000), no start fee. Set *Maximum cost per run* and the Actor stops cleanly when it is reached (tested: a run capped at $0.02 saved exactly 6 results). The 50-result test run above used about $0.0002 of platform compute.

### FAQ

**Is it legal / allowed?** It uses only the official Hacker News API and the public Algolia HN Search API, which Y Combinator and Algolia provide for exactly this kind of programmatic access. The posts are public. Respect the people behind them: don't spam the posters of hiring threads.

**How accurate is the hiring-post parsing?** Company, roles, location, remote and salary are parsed from the conventional `Company | Role | Location | Remote | Salary` first line, so posts that skip that format will have some fields set to `null`. The full original text and all links are always included, so nothing is lost.

**Why does relevance sorting stop at 1,000 results?** That limit comes from Algolia. Use `sortBy: date` (the default), which walks back through time windows to go past it.

**Affiliation?** This Actor is independent and not affiliated with Y Combinator, Hacker News or Algolia.

# Actor input Schema

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

What to collect.

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

Who is hiring + Feed modes: keep posts containing ANY of these (case-insensitive), e.g. rust, python, founding.

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

Keep only hiring posts that mention remote work.

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

Keep hiring posts mentioning ANY of these, e.g. London, NYC, Europe.

## `hiringThread` (type: `string`):

Which monthly thread posted by the official whoishiring account.

## `hiringMonths` (type: `integer`):

1 = the latest thread only.

## `query` (type: `string`):

Full-text search across Hacker News, e.g. "postgres", "your brand", "Show HN AI agent". Leave empty to list everything matching the filters.

## `contentType` (type: `string`):

Which kind of item to search.

## `sortBy` (type: `string`):

Date = newest first and can go past Algolia's 1,000-hit limit; relevance = best matches (max 1,000).

## `author` (type: `string`):

Only items by this HN user.

## `lastDays` (type: `integer`):

Only items created in the last N days (ignored if Date from is set).

## `dateFrom` (type: `string`):

ISO date, e.g. 2026-01-01.

## `dateTo` (type: `string`):

ISO date, e.g. 2026-06-30.

## `minPoints` (type: `integer`):

Search + Feed modes: skip stories below this score.

## `minComments` (type: `integer`):

Skip stories with fewer comments.

## `feed` (type: `string`):

Which live Hacker News list to read.

## `itemIds` (type: `array`):

e.g. https://news.ycombinator.com/item?id=8863 or 8863.

## `includeComments` (type: `boolean`):

Also save the full comment tree of each item (each comment is one result).

## `textMaxChars` (type: `integer`):

Truncate post/comment text to this many characters.

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

Stop after this many results. The run also stops cleanly at your Maximum cost per run.

## Actor input object example

```json
{
  "mode": "whoIsHiring",
  "keywords": [
    "engineer"
  ],
  "remoteOnly": false,
  "hiringThread": "hiring",
  "hiringMonths": 1,
  "contentType": "story",
  "sortBy": "date",
  "feed": "top",
  "includeComments": false,
  "textMaxChars": 5000,
  "maxItems": 50
}
```

# Actor output Schema

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

Hacker News items

# 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 = {
    "mode": "whoIsHiring",
    "keywords": [
        "engineer"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("dedicated_crest/hacker-news-search-hiring").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 = {
    "mode": "whoIsHiring",
    "keywords": ["engineer"],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("dedicated_crest/hacker-news-search-hiring").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 '{
  "mode": "whoIsHiring",
  "keywords": [
    "engineer"
  ],
  "maxItems": 50
}' |
apify call dedicated_crest/hacker-news-search-hiring --silent --output-dataset

```

## MCP server setup

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

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/UtYvToTq7p3Ay2nRf/builds/V7x31gXANb457glXM/openapi.json
