Hacker News Scraper API: Stories + Who Is Hiring Jobs avatar

Hacker News Scraper API: Stories + Who Is Hiring Jobs

Pricing

$0.15 / 1,000 items

Go to Apify Store
Hacker News Scraper API: Stories + Who Is Hiring Jobs

Hacker News Scraper API: Stories + Who Is Hiring Jobs

Search Hacker News stories and comments, or turn the monthly "Who is hiring?" thread into structured jobs. Only-new-items mode. $0.15 per 1,000 items.

Pricing

$0.15 / 1,000 items

Rating

0.0

(0)

Developer

Scott Williams

Scott Williams

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

21 hours ago

Last modified

Share

Hacker News Scraper API: search stories and comments, and parse "Who is hiring?" jobs

Hacker News Scraper has two modes. Search returns Hacker News stories, comments, Ask HN, Show HN, jobs and polls that match a query, with points, comment counts, dates and links, using the public HN Search API by Algolia. Who is hiring reads the monthly "Ask HN: Who is hiring?" threads and turns each top-level post into a structured job: company, role, location, remote/onsite flags, salary when stated, and links. Emails and phone numbers are redacted by default. You pay $0.00015 per item written to the dataset.

Who it's for

  • Founders, marketers and researchers tracking what Hacker News says about a product, company or topic.
  • Job seekers and recruiters filtering the monthly "Who is hiring?" thread by stack, remote and salary.
  • Developers who need HN data as JSON without paging through the API themselves.
  • Newsletter and content teams collecting top stories on a topic each week.

What data you get

Search mode, one item per story or comment:

FieldWhat it holds
id, typeHN item ID and type (story, comment, poll, job…).
title, url, domainStory title and link (null for comments and text posts).
textPost or comment text, as plain text.
points, numCommentsScore and comment count.
createdAtISO 8601 timestamp.
storyId, parentIdFor comments: the story and parent item.
isFrontPageWhether Algolia tags the story as front page.
hnUrl, scrapedAtLink to the item on news.ycombinator.com, and when it was read.

The author's username is not included.

{
"id": "50281851",
"type": "story",
"title": "Our AI Agent Executed the Same Successful SQL Query 254 Times",
"url": "https://armincat.com/articles/ai-agent-executed-same-query-254-times",
"domain": "armincat.com",
"text": null,
"points": 3,
"numComments": 0,
"createdAt": "2026-10-28T22:29:54Z",
"storyId": 50281851,
"parentId": null,
"isFrontPage": false,
"hnUrl": "https://news.ycombinator.com/item?id=50281851",
"scrapedAt": "2026-10-29T01:01:18.594163+00:00"
}

Who is hiring mode, one item per job post:

FieldWhat it holds
idHN comment ID.
company, role, locationParsed from the post's first line (split on |). Null when the post doesn't follow the usual format.
isRemote, isOnsiteFrom the first line.
salaryMin, salaryMax, salaryCurrency, salaryPeriodWhen a range is stated.
headline, textFirst line and full post text (contacts redacted by default).
linksUp to 10 links from the post (email links excluded).
postedAt, threadTitle, threadId, hnUrl, scrapedAtPost date, thread and links.
{
"id": "50095921",
"company": "NeuralFrame",
"role": "Senior Backend Engineer, Medical Data Pipeline (Python + Rust)",
"location": "REMOTE (US only, US time zones; no visa sponsorship)",
"isRemote": true,
"isOnsite": false,
"salaryMin": 170000,
"salaryMax": 210000,
"salaryCurrency": "USD",
"salaryPeriod": "YEAR",
"headline": "NeuralFrame | Senior Backend Engineer, Medical Data Pipeline (Python + Rust) | REMOTE (US only, US time zones; no visa sponsorship) | Full-time | $170k–$210k + 0.1%–0.25% equity",
"text": "NeuralFrame | Senior Backend Engineer, Medical Data Pipeline (Python + Rust) | REMOTE (US only, US time zones; no visa sponsorship) | Full-time | $170k–$210k + 0.1%–0.25% equity\nWe build software that hospitals, cancer r…",
"links": [
"https://wellfound.com/jobs/4829721-senior-backend-software-e"
],
"postedAt": "2026-10-14T21:53:28.000Z",
"threadTitle": "Ask HN: Who is hiring? (October 2026)",
"threadId": "49922569",
"hnUrl": "https://news.ycombinator.com/item?id=50095921",
"scrapedAt": "2026-10-29T01:01:18.596278+00:00"
}

How to use it

Input fieldLabelNotes
modeModesearch (default) or whoIsHiring.
querySearch querySearch mode. Empty lists the newest items.
tagsItem typesSearch mode. story, comment, ask_hn, show_hn, job, poll, front_page. Default story. See the note below.
sortBySort bydate (newest first, default) or relevance.
minPointsMin pointsSearch mode.
minCommentsMin commentsSearch mode.
postedWithinDaysPosted within (days)Search mode.
since, untilFrom date / To dateSearch mode, YYYY-MM-DD.
threadsWho is hiring: number of monthly threadsDefault 1 (latest month).
keywordsWho is hiring: keywords (any)Matches anywhere in the post text.
remoteOnlyWho is hiring: remote onlyKeeps posts that say remote in the first line.
maxItemsMax resultsDefault 100.
redactContactDetailsRedact emails and phone numbersDefault true.
onlyNewItemsOnly new items (monitoring)Default false. Seen items are remembered for 120 days.
stateStoreNameState store nameDefault hacker-news-scraper-state.

How tags combine: separate entries are combined with AND by the Algolia API, so ["story", "front_page"] means front-page stories. To get either of several types, put them in one entry separated by commas: ["story,comment"] means stories OR comments.

Example: AI agent stories with 50+ points from the last 30 days.

{
"mode": "search",
"query": "AI agents",
"tags": [
"story"
],
"minPoints": 50,
"postedWithinDays": 30,
"maxItems": 200
}

Example: this month's remote Python or Rust jobs from "Who is hiring?".

{
"mode": "whoIsHiring",
"threads": 1,
"keywords": [
"python",
"rust"
],
"remoteOnly": true,
"maxItems": 500
}

With sortBy: "date", the Actor pages past Algolia's 1,000-results-per-query limit by moving the time window, so long date ranges work. With relevance, results stop at 1,000.

Pricing

This Actor uses pay-per-event pricing: $0.00015 per item written to the dataset. That is $0.15 per 1,000 items. There is no separate start fee in this Actor's pricing (as listed on October 28, 2026; the Pricing tab on the Store page is the source of truth).

You are charged only for items that end up in your dataset. Items removed by your filters and items skipped in monitoring mode are not charged.

ExampleItemsCost
One "Who is hiring?" thread (illustration)400$0.06
Weekly topic search, 200 stories200$0.03
Large historical comment pull100,000$15.00

Rows are illustrations; thread sizes vary month to month.

Worked example: 1,000 items × $0.00015 = $0.15.

To cap spend, set Maximum cost per run in the run options (or maxTotalChargeUsd via the API). The Actor stops cleanly when the next item would go over the limit and records stoppedByCostLimit: true in the run summary.

How it compares

Prices are from the public Apify Store listings on October 28, 2026.

OptionPricingWhat it is good at
This Actor$0.00015 per itemSearch with filters and date paging, plus parsed "Who is hiring?" jobs with contacts redacted, and only-new-items mode.
Other Hacker News Actors on the StoreVariesSome cover feeds (top, new, best) or user profiles, which this Actor doesn't.
HN Search API by Algolia, or the official Firebase HN APIFreeBest if you want to write and host your own paging, parsing and scheduling.

Integrations and API

The actor ID is fecklesspleb/hacker-news-scraper (in API URLs: fecklesspleb~hacker-news-scraper).

n8n, Make and Zapier. Each has an Apify integration with a "run Actor" action. Pick fecklesspleb/hacker-news-scraper, paste the input JSON shown below, then read the results from the run's default dataset in the next step. To process only new items on a schedule, turn on the monitoring option and run it from a schedule (Apify Schedules or a trigger in your automation tool).

Webhooks and schedules. Apify Schedules can run the Actor on a cron, and a webhook on "run succeeded" can call your own endpoint with the run ID.

HTTP API. Run the Actor and get the items back in one call. This waits for the run to finish, so use it for small runs:

curl -X POST "https://api.apify.com/v2/acts/fecklesspleb~hacker-news-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"mode": "search", "query": "AI agents", "tags": ["story"], "minPoints": 50, "postedWithinDays": 30, "maxItems": 200}'

Python (pip install apify-client):

from decimal import Decimal
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("fecklesspleb/hacker-news-scraper").call(
run_input={
"mode": "search",
"query": "AI agents",
"tags": [
"story"
],
"minPoints": 50,
"postedWithinDays": 30,
"maxItems": 200
},
max_total_charge_usd=Decimal("5"), # optional spend cap
)
# apify-client 3.x returns a Run object; on 1.x/2.x use run["defaultDatasetId"]
for item in client.dataset(run.default_dataset_id).iterate_items():
print(item)

JavaScript / Node.js (npm install apify-client):

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fecklesspleb/hacker-news-scraper').call(
{
"mode": "search",
"query": "AI agents",
"tags": [
"story"
],
"minPoints": 50,
"postedWithinDays": 30,
"maxItems": 200
},
{ maxTotalChargeUsd: 5 }, // optional spend cap
);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Results can also be exported from the dataset as JSON, CSV, Excel, XML or RSS from the Apify Console or the dataset API.

FAQ

How do I scrape "Ask HN: Who is hiring?" for a specific month? Set mode to whoIsHiring and threads to how many recent months you want (1 = the latest). Each top-level post becomes one job item. Filter with keywords and remoteOnly.

Is the "Who is hiring?" parsing reliable? It follows the convention most posters use: Company | Role | Location | Remote | Salary on the first line. Posts that don't follow it still come through with headline and text, but company, role or location may be null. Check the text for anything critical.

Why are emails removed? To avoid collecting personal contact details by default. Emails become [email removed] and phone numbers [phone removed]. You can turn this off with redactContactDetails: false if you have a lawful reason to keep them.

Can I search comments mentioning my product? Yes: set tags to ["comment"] and query to your product name, and turn on onlyNewItems for a daily alert.

Does it return the HN front page? Use tags: ["story", "front_page"] for stories that Algolia tags as front page. There is no separate top, new or best feed mode.

Do I need an API key or login? No. The Actor reads public endpoints and needs no account on the source site. You only need an Apify account to run it. It obeys robots.txt and rate-limits requests per host.

  • RSS Feed Reader: RSS and Atom feed items as clean JSON, with feed discovery from a website URL.
  • Sitemap Extractor: every URL listed in a website's XML sitemaps.
  • ATS Jobs Scraper: jobs from Greenhouse, Lever, Ashby, Workable, Recruitee and Workday boards in one schema.
  • Remote Jobs Aggregator: remote jobs from Remote OK, We Work Remotely and Jobicy, de-duplicated.