# Hacker News Scraper: Search, Mentions & Who Is Hiring Jobs (`tidelane/hacker-news`) Actor

Search Hacker News stories and comments by keyword, domain, date and points, get the front page, new, best, Ask and Show HN, monitor brand mentions with 'only new' mode, and turn 'Who is hiring' threads into structured jobs with salary, remote flag and tech stack. Official APIs.

- **URL**: https://apify.com/tidelane/hacker-news.md
- **Developed by:** [Tidelane Data](https://apify.com/tidelane) (community)
- **Categories:** Developer tools, Jobs
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.11 / 1,000 story or comments

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 Scraper: Search, Mentions Hacker News Scraper: Search, Front Page, Mentions & Who Is Hiring Jobs Who Is Hiring Jobs

Get **Hacker News** data in three modes, through the official Hacker News APIs (no login, no browser):

1. **Search** stories, comments, Ask HN, Show HN, polls and job stories by keyword, by **linked domain**, by date range, points and comment count. With **"only new" mode** it becomes a **mention monitor**: schedule it and get only what was posted since the last run.
2. **Ranked lists**: the **front page**, new, best, Ask HN, Show HN and jobs, in their current order, with rank.
3. **Who is hiring jobs**: the monthly *"Ask HN: Who is hiring?"* thread as structured jobs: **company, remote / onsite / hybrid, salary, employment type, visa, tech stack and apply link**. Older months too (tested back to 2015).

- ✅ **Comments** of every story, flattened with their depth in the thread
- ✅ **No 1,000-result cap** when sorted by date (the search API alone stops at 1,000)
- ✅ **Domain search**: every story that links to a website, for example your own
- ✅ **Clean text**: HTML entities decoded, links kept in full
- ✅ **No usernames**: rows contain content, not people
- ✅ **Fair billing**: per result (story, comment or job post)

### Input examples

Monitor mentions of a product (schedule it daily):

```json
{
    "mode": "search",
    "queries": ["my-product", "myproduct.com"],
    "type": "all",
    "onlyNew": true,
    "maxResults": 500
}
```

Top stories about a topic, with the first 5 comments of each:

```json
{
    "mode": "search",
    "queries": ["postgres"],
    "minPoints": 100,
    "maxResults": 30,
    "includeComments": true,
    "maxCommentsPerStory": 5
}
```

Remote jobs from the latest "Who is hiring?" thread that mention Rust:

```json
{
    "mode": "whoIsHiring",
    "remoteOnly": true,
    "keywords": ["rust"]
}
```

### Output examples

Real output from test runs. A story:

```json
{
    "id": 44073588,
    "type": "story",
    "title": "Postgres IDE in VS Code",
    "url": "https://techcommunity.microsoft.com/blog/adforpostgresql/announcing-a-new-ide-for-postgresql-in-vs-code-from-microsoft/4414648",
    "domain": "techcommunity.microsoft.com",
    "points": 1040,
    "commentCount": 407,
    "text": null,
    "tags": [],
    "createdAt": "2025-05-23T15:12:44Z",
    "hnUrl": "https://news.ycombinator.com/item?id=44073588",
    "query": "postgres"
}
```

A comment (`text` shortened):

```json
{
    "id": 18717600,
    "type": "comment",
    "text": "As a reminder, PostgreSQL is distributable under a license that's basically BSD/MIT: https://www.postgresql.org/about/licence/ …",
    "storyId": 18717168,
    "parentId": 18717168,
    "depth": 1,
    "createdAt": "2018-12-19T17:48:09.000Z",
    "hnUrl": "https://news.ycombinator.com/item?id=18717600"
}
```

A job post from "Who is hiring?" (`text` shortened):

```json
{
    "postId": 49922616,
    "month": "2026-10",
    "threadTitle": "Ask HN: Who is hiring? (October 2026)",
    "postedAt": "2026-10-01T15:04:11.000Z",
    "hnUrl": "https://news.ycombinator.com/item?id=49922616",
    "company": "PAGNOS",
    "header": "PAGNOS | Cloud Engineer, AWS Serverless (TypeScript/Node.js) | REMOTE (Germany) | Full-time | €75k–80k | business-fluent German required",
    "headerParts": ["PAGNOS", "Cloud Engineer, AWS Serverless (TypeScript/Node.js)", "REMOTE (Germany)", "Full-time", "€75k–80k", "business-fluent German required"],
    "remote": true,
    "onsite": false,
    "hybrid": false,
    "salary": "€75k–80k",
    "employmentTypes": ["full-time"],
    "visaSponsorship": true,
    "technologies": ["TypeScript", "React", "Next.js", "Node.js", "AWS"],
    "applyUrl": "https://germantechjobs.de/jobs/PAGNOS-GmbH-Cloud-AI-Engineer--AWS-Serverless-mwd",
    "text": "PAGNOS | Cloud Engineer, AWS Serverless … We build serverless applications on AWS for clients and for our own SaaS products. …"
}
```

In our test, the October 2026 thread gave 259 job posts; 140 of them remote, 88 with a salary.

### Pricing

A fixed price per result: one story, one comment or one job post. Runs are fast: 2,500 search results took 3 seconds, a whole "Who is hiring?" thread 3 seconds.

Paid Apify plans pay less: 10% off on Starter, 20% on Scale and 30% on Business and higher plans.

### FAQ

**How does "only new" work?** The Actor remembers the newest item of each search in your key-value store `hacker-news-monitor-state` and next time asks only for newer items. The first run returns the latest items. If more new items exist than "Max results", the oldest of them are skipped, so set it high enough for your schedule.

**Why at most 1,000 results with relevance sorting?** That is a limit of the Hacker News search API. Sort by date and there is no limit.

**How exact are salary, remote flag and tech stack?** They are read from the post text with rules: remote, onsite and hybrid from the first line, the first salary-like amount, and a list of about 80 common technologies. The full post text is always included, so you can check or refine.

**Why are there no usernames?** The Actor returns content only. The "Who wants to be hired?" thread (posts by people) and the "seeking work" posts of the freelancer thread are left out for the same reason.

### More tools from Tidelane Data

- [RSS Feed Reader](https://apify.com/tidelane/rss-feed-reader): news, blogs and podcasts to JSON
- [Research Papers](https://apify.com/tidelane/research-papers): search PubMed, arXiv and Crossref at once
- [Remote Jobs Feed API](https://apify.com/tidelane/remote-jobs-feed): remote jobs by where you may work from
- [Career Site Job Feed API](https://apify.com/tidelane/career-site-job-feed): 2.5M+ jobs from 50,000+ career sites at once

All our tools: [apify.com/tidelane](https://apify.com/tidelane)

***

#### Impressum

Levi Griesinger, Tidelane Data\
Besigheimer Straße 18\
74369, Löchgau, Deutschland\
E-Mail: LeviGriesinger@gmail.com

# Actor input Schema

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

Search: stories or comments by keyword. List: front page, new, best, Ask HN, Show HN or jobs as ranked now. Who is hiring: job posts of the monthly thread as structured data.

## `queries` (type: `array`):

Search mode: one search per term, for example your product name or a domain. Empty searches everything (use filters).

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

Search mode: which kind of items to search.

## `searchIn` (type: `string`):

Search mode: 'Linked URL' finds every story that links to a domain, for example example.com.

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

Relevance returns at most 1,000 results per term (a Hacker News search limit). Date has no limit.

## `from` (type: `string`):

Search mode: only items created on or after this date (YYYY-MM-DD).

## `to` (type: `string`):

Search mode: only items created on or before this date (YYYY-MM-DD).

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

Search mode: only stories with at least this many points.

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

Search mode: only stories with at least this many comments.

## `onlyNew` (type: `boolean`):

Search mode: remembers the newest item per search (key-value store 'hacker-news-monitor-state') and returns only newer items next time. Use with a schedule to monitor mentions.

## `list` (type: `string`):

List mode: which ranked list.

## `maxResults` (type: `integer`):

Search: per search term. List: items of the list (up to 500).

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

Search and list mode: also return the comments of every story (each comment is one result, with its depth in the thread).

## `maxCommentsPerStory` (type: `integer`):

Limit for 'Add the comments'.

## `threadKind` (type: `string`):

Who is hiring mode: the monthly 'Who is hiring?' thread, or company posts of 'Freelancer? Seeking freelancer?'.

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

Who is hiring mode: months like 2026-10. Empty takes the latest thread.

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

Who is hiring mode: keep posts that say REMOTE in their first line.

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

Who is hiring mode: keep posts that contain at least one of these words, for example Rust or Berlin.

## Actor input object example

```json
{
  "mode": "search",
  "queries": [
    "postgres"
  ],
  "type": "story",
  "searchIn": "all",
  "sortBy": "relevance",
  "onlyNew": false,
  "list": "top",
  "maxResults": 100,
  "includeComments": false,
  "maxCommentsPerStory": 100,
  "threadKind": "hiring",
  "remoteOnly": false
}
```

# Actor output Schema

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

All results of the run as dataset items.

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

Summary per input with status (ok, error and the reason).

# 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 = {
    "queries": [
        "postgres"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidelane/hacker-news").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 = { "queries": ["postgres"] }

# Run the Actor and wait for it to finish
run = client.actor("tidelane/hacker-news").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 '{
  "queries": [
    "postgres"
  ]
}' |
apify call tidelane/hacker-news --silent --output-dataset

```

## MCP server setup

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

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/3bYcjIDjObvcUaxjN/builds/chanHFJEQh3OZuqpA/openapi.json
