Hacker News Scraper API: Top, New, Best, Ask, Show Stories avatar

Hacker News Scraper API: Top, New, Best, Ask, Show Stories

Pricing

from $0.12 / 1,000 hacker news stories

Go to Apify Store
Hacker News Scraper API: Top, New, Best, Ask, Show Stories

Hacker News Scraper API: Top, New, Best, Ask, Show Stories

Read Hacker News stories from the official Firebase API: top, new, best, Ask HN, Show HN and job lists with score, comments, domain and age. Filter by keyword, score and domain. No proxy, no usernames, you pay only for stories delivered.

Pricing

from $0.12 / 1,000 hacker news stories

Rating

0.0

(0)

Developer

Rowcraft

Rowcraft

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

an hour ago

Last modified

Share

Get the stories of Hacker News as clean rows: the front page (top), the newest stories, the best ones, Ask HN, Show HN and the job posts, each with its rank, title, link, domain, points, comment count and age, as JSON, CSV or Excel. The actor reads the official Hacker News API, not the website, so there is no page parsing to break, no proxy and no login. Filter by keyword, minimum score, minimum comments, domain and age before anything is charged, and run it on a schedule to receive only the stories you have not seen yet.

It is built for monitoring and research, and it leaves people out on purpose: no usernames and no comments are ever read, only the number of comments.

Input form of Hacker News Scraper API: Top, New, Best, Ask, Show Stories

What you get

One row per story, with 18 fields:

  • Identity: the Hacker News item id, the type (story, job or poll) and hnUrl, the link to the discussion on Hacker News
  • Where it was found: the list (top, new, best, ask, show or job), the rank in that list (1 = first) and alsoIn, the other lists of your selection that contain the same story
  • The story itself: title, url (null for Ask HN and other text posts) and domain, the host of the link without www.
  • Reception: score (points) and commentCount, the number of comments
  • Time: postedAt (ISO 8601, UTC) and ageHours at the moment the lists were read
  • Kind: isAsk, isShow and isJob, so you can split Ask HN, Show HN and job posts without parsing titles
  • Text: text, the body of Ask HN, Show HN and job posts as plain text, with e-mail addresses and phone numbers masked
  • Run time: scrapedAt, when the lists were read

Empty values are null, never missing, so CSV and Excel columns stay stable from run to run.

The run also writes a COVERAGE record with one line per list you asked for (how many ids it holds, how many were read, delivered, filtered, deleted or already delivered) and a RUN_SUMMARY with the totals, the filters applied and why the run stopped.

Why this actor

  • Official API only. Every request goes to the public Hacker News API on Firebase: six lists of story ids and one item per id. The website is never loaded, so a change in its layout cannot break the actor.
  • Filters before charging. Keywords, exclusions, domains, minimum points, minimum comments and maximum age are applied before a story is delivered. Stories your filters drop cost nothing.
  • A story once. A story that is in several lists (a Show HN that is also on the front page, for example) is delivered once, under the first list in your order, with the others in alsoIn.
  • Fast and polite. Up to 10 requests are in flight and a new one starts every 100 ms by default, so a list of 500 stories takes about a minute. The pace is yours to change with requestIntervalMs.
  • Count first. Tick countOnly to see how many stories match on each list and what they would cost, for free.
  • Ready for schedules. onlyNew delivers, and charges, only stories you have not received before, and notifyUrl sends a message to Slack, Discord, Make, n8n or Zapier when the run ends.
  • No people. Author names are not read, comments are not read, user pages are not requested.

How to use it

  1. Open the Actor and fill in Hacker News lists (the other fields are optional filters).
  2. Set Maximum stories to a small number for a first try (the default is a safe start).
  3. Optional: tick Count only and start once. You get the number of matching rows and the estimated cost, for free (only the start event is charged). Untick it to get the data.
  4. Click Start. The status line shows progress; the run stops cleanly at your limit or at the charge limit you set in the run options.
  5. Open the Dataset tab and download JSON, CSV, Excel, XML or HTML, or send the rows to Google Sheets, Slack, Make, n8n or Zapier with the Integrations tab.
  6. To run it on a schedule, use Schedules in Apify Console and turn on Only new rows since the last run below: every run then costs only the new rows, and a webhook URL tells you when something new came in.

A few habits that save money and time:

  • The lists are read in rank order, so maxItems of 30 on Top gives the 30 highest-ranked stories that pass your filters, not a random sample.
  • Combine lists freely. ["top", "best"] returns the stories of both without repeats.
  • Keywords match whole words, not parts of words: ai finds "AI-powered" and "AI/ML", but not "said" or "maintain".
  • For a daily digest, read the Top list with onlyNew on and a minScore that suits you, and put a Slack webhook in notifyUrl.

Input

FieldWhat it does
listsWhich lists to read: top, new, best, ask, show, job. Default top. The order decides which list a story is delivered under.
maxItemsStop after this many delivered stories. Default 100, 0 = every story of the chosen lists.
keywordsKeep stories whose title or text contains any of these words or phrases (whole words, not case-sensitive).
excludeKeywordsDrop stories whose title or text contains any of these.
domainsKeep only stories linking to these sites. Sub-domains match, so github.com also keeps gist.github.com. Ask HN posts have no link and are dropped when this is set.
excludeDomainsDrop stories linking to these sites.
minScore, minCommentsKeep stories with at least this many points or comments.
postedWithinHoursKeep stories posted in the last N hours. 0 = any age.
includeTextDeliver the text of Ask HN, Show HN and job posts. Default on; keywords search the text either way.
countOnlyCount the matching stories per list and estimate the cost; nothing is delivered.
onlyNew, stateNameDeliver a story only if you have not received it in an earlier run with the same state name.
notifyUrl, notifyWhenEmptyA webhook that receives one message when the run ends; see Automation below.
requestIntervalMsMinimum time between two requests, default 100 ms, minimum 20 ms.

Example: the 30 highest-ranked front-page stories with at least 100 points.

{
"lists": ["top"],
"maxItems": 30,
"minScore": 100
}

Example: Show HN posts of the last two days about AI, with the text.

{
"lists": ["show"],
"keywords": ["AI", "LLM", "GPT", "agent"],
"postedWithinHours": 48
}

Example: every story in the best list that links to GitHub.

{
"lists": ["best"],
"domains": ["github.com"],
"maxItems": 0
}

Example: an hourly watch on new stories, with a Slack message when something about your product turns up.

{
"lists": ["new", "top"],
"keywords": ["postgres", "supabase"],
"onlyNew": true,
"stateName": "database-watch",
"notifyUrl": "https://hooks.slack.com/services/..."
}

Output

18 fields per row. Empty values are null, never missing, so CSV and Excel columns are stable.

FieldTypeExample
idinteger50141909
typestringstory
liststringtop
alsoInstringbest, show
rankinteger3
titlestringShow HN: I built a tiny database in Rust
urlstringhttps://example.org/blog/tiny-database
domainstringexample.org
hnUrlstringhttps://news.ycombinator.com/item?id=50141909
scoreinteger212
commentCountinteger87
postedAtstring2026-10-18T15:26:06.000Z
ageHoursnumber1.7
isAskbooleanFalse
isShowbooleanTrue
isJobbooleanFalse
textstringWe built it because...
scrapedAtstring2026-10-18T17:05:25.789Z

Example rows

Two real rows from a run (long texts shortened here, complete in the dataset):

[
{
"id": 50138531,
"type": "story",
"list": "top",
"alsoIn": null,
"rank": 6,
"title": "DeepSeek search and fetch – $0.75 per 1000 successful requests",
"url": "https://api-docs.deepseek.com/guides/search/",
"domain": "api-docs.deepseek.com",
"hnUrl": "https://news.ycombinator.com/item?id=50138531",
"score": 419,
"commentCount": 206,
"postedAt": "2026-10-18T06:50:36.000Z",
"ageHours": 10.4,
"isAsk": false,
"isShow": false,
"isJob": false,
"text": null,
"scrapedAt": "2026-10-18T17:14:52.627Z"
},
{
"id": 50137950,
"type": "story",
"list": "show",
"alsoIn": null,
"rank": 2,
"title": "Show HN: Sphinx – A hook that quizzes you on your AI's code before shipping",
"url": "https://sphinx-six-theta.vercel.app/",
"domain": "sphinx-six-theta.vercel.app",
"hnUrl": "https://news.ycombinator.com/item?id=50137950",
"score": 210,
"commentCount": 71,
"postedAt": "2026-10-18T04:33:49.000Z",
"ageHours": 12.7,
"isAsk": false,
"isShow": true,
"isJob": false,
"text": "FOSS, Basically it plugs into your existing coding agent workflow and every time you push to prod it'll throw up a questionnaire that che…",
"scrapedAt": "2026-10-18T17:15:02.140Z"
}
]

Results can be downloaded as JSON, CSV, Excel, XML or HTML from the Dataset tab, or read through the Apify API.

Results of Hacker News Scraper API: Top, New, Best, Ask, Show Stories in the Apify dataset view

Pricing

Pay per result. You pay for each story delivered to your dataset, nothing else: no subscription, no minimum, no charge for rows your filters drop or for the requests behind them.

Your Apify planPrice per 1,000 rowsPrice per row
Free plan$0.18$0.00018
Starter plan$0.16$0.00016
Scale plan$0.14$0.00014
Business plan and above$0.12$0.00012

Example: 1,000 stories cost $0.18 on the Free plan and $0.12 on the Business plan. Platform usage of the run (compute, storage) is included in that price and is not billed to you separately (pay per event: the actor covers it). A start event of $0.00005 is charged once per run (Apify default). Cap your spend: set Maximum total charge in the run options. The actor stops cleanly when the cap is reached and you keep everything delivered until then. The run summary (RUN_SUMMARY in the key-value store) says why a run stopped. Check before you pay: turn on Count only to see how many rows match and what they would cost at your tier. That run delivers nothing and costs only the start event.

What that means in practice: a full read of the Top list (500 stories) costs about $0.09 on the Free plan, and all six lists together (1,113 distinct stories on 18 October 2026, because many stories are in more than one list) cost about $0.20. With filters the bill shrinks, because only the stories that pass are charged.

Automation: only new stories, notifications, schedules

Only new rows since the last run. Turn on onlyNew and the actor remembers every story it delivered to you (in a key-value store named rowcraft-hacker-news-scraper-state in your Apify account). The next run with the same stateName skips what you already have and you pay only for new rows. The first run delivers everything that matches. Use a different stateName for each schedule or search so they keep separate memories.

Notification when the run ends. Put a webhook address in notifyUrl and the actor sends one JSON POST with the number of new rows, links to the dataset (JSON and CSV) and the run. It works out of the box with Slack and Discord incoming webhooks (the message is in text and content), with Make, n8n and Zapier catch hooks, and with your own endpoint. By default it is sent only when there is at least one new row; notifyWhenEmpty sends it every time.

Schedules. Create a schedule in Apify Console (hourly, daily, weekly or cron) with onlyNew on. A daily schedule gives you a feed of new stories for the price of the new rows only.

Integrations. Send the results to Make, n8n, Zapier, Google Sheets, Slack, Google Drive, Airtable or any webhooks from the Integrations tab of the Actor, with no code. Apify also offers native actions for Make, n8n and Zapier.

API, SDKs and AI agents. Every run is available through the Apify API and the official JavaScript and Python clients; the Actor can also be called by AI agents through the Apify MCP server. The example input in the API tab is a working call.

Count only. countOnly returns the number of matching stories and the estimated cost without delivering anything, so you can size a job before paying for it.

A note on how "new" is decided here: a story is identified by its Hacker News id. A story you already received is not delivered again when its points or comments grow, so onlyNew is a feed of stories you have not seen, not a feed of changes. To follow how a story's score develops, run without onlyNew and compare runs by id.

Use cases

  • Launch and mention monitoring: watch the new and top lists for your product, your competitors or your open-source project, and get a Slack message when one appears.
  • Content and newsletter curation: pull the best stories of the day or the week above a score you choose, with the link and the discussion link, and feed an editor, a digest or a social queue.
  • Trend research: count how many stories per week mention a language, a database or a technology, and how many points they earn, from title, score and postedAt.
  • Show HN tracking for founders and investors: collect Show HN posts with their points and comment counts to see which launches get traction.
  • Hiring signals: read the job list to see which companies are hiring from the Hacker News community.
  • Link analysis: group stories by domain to see which sites and blogs earn the most points, or which ones are never upvoted.
  • Datasets for analysis and AI: a clean, flat table of titles, links, points and times, without personal data.

Ready-made examples, each with the input filled in (open one and press Start, or save it as your own task):

What this actor does not do

  • Read comments or authors: no comment text, no comment authors, no usernames, no user pages and no karma. Only the number of comments is delivered. This is a privacy choice, explained in the Privacy section.
  • Search the archive: only the current lists are read, up to 500 stories on Top and New and up to 200 on Best. For older stories use the story's own link.
  • Read the Hacker News website: no page of the site is loaded, and no search service is used.
  • Post, vote, comment, flag or log in.
  • Follow the links of the stories: the target page is not opened, so there is no article text. Use a page extractor for that.

Limits and fair use

  • List sizes. The API gives up to 500 ids for Top and New and up to 200 for Best. On 18 October 2026 the other lists held 160 (Show), 27 (Ask) and 31 (Jobs). The size is set by Hacker News and changes through the day.
  • A snapshot, not a stream. The lists are read once at the start of the run and the rank is the position at that moment. Stories posted during a long run are not added.
  • Speed. Each story is one request. At the default pace of 10 requests a second, 30 stories take a few seconds and the 500 stories of Top about a minute. A larger requestIntervalMs makes it slower and gentler.
  • No rate limit is published, and the actor still keeps at most 10 requests in flight, retries a failed request with growing pauses and stops at once on an anti-bot page or after five failed stories in a row. It uses no proxy, no CAPTCHA solving and no cookies.
  • robots.txt is read first. The API host allows the .json paths this actor uses. If that ever changes, the run stops and says so in RUN_SUMMARY and COVERAGE.
  • Deleted and dead stories (removed by their authors or flagged by the community) and ids that now point to nothing are skipped and not charged.
  • Memory. The actor runs in 256 MB; a run holds a few thousand ids and one small item at a time.
  • The run stops 90 seconds before its timeout with the summary and the Only new rows memory saved.

Data source and licence

The data comes from the public Hacker News API on Firebase, https://hacker-news.firebaseio.com/v0/, documented in the official repository on GitHub. Its documentation describes the data as public and available in near real time, and says there is no rate limit at present. The actor reads only the id lists (topstories, newstories, beststories, askstories, showstories, jobstories) and the items behind them. The website at news.ycombinator.com is not loaded; hnUrl is only a link you can open.

Titles, links and texts are written by Hacker News users and by the companies that post jobs, and belong to their authors. Keep the hnUrl link with a story when you show it, and check the terms of the site before you republish content beyond analysis and monitoring. Rowcraft is independent and not affiliated with or endorsed by Y Combinator or Hacker News. Names are used only to say where the data comes from.

Privacy: no personal data

Rowcraft actors are built not to collect personal data, and this one is stricter than the source:

  • The author of a story is never copied into a row, a summary or a log. The actor does not request user pages either.
  • Comments are never requested; only their count is delivered.
  • The text of Ask HN, Show HN and job posts is delivered as plain text with e-mail addresses, phone numbers and profile links masked, and with the names of contact persons masked where a contact cue stands next to them ("contact", "recruiter", "Mr", "Frau" and similar). A name written inside a normal sentence of a post cannot be told from other words reliably and is not touched; turn includeText off if you need rows without any free text.
  • Nothing is sent to the stories' sites, and the only outside address contacted is the API host.

You are responsible for using the data in line with the law that applies to you.

Other Rowcraft actors

All Rowcraft actors read official or public sources, deliver flat rows without personal data and support only-new runs and notifications:

FAQ

What does the Hacker News Scraper API return? One row per story or job post from the lists you choose: rank, title, link, domain, points, comment count, age, whether it is an Ask HN, Show HN or job post, and the text of text posts. See the Output section for the 18 fields.

Which lists are available? Top (the front page), New, Best, Ask HN, Show HN and Jobs. You can read one or all six in a run; a story that is in several is delivered once.

Where does the data come from? From the official Hacker News API on Firebase. The actor does not load the Hacker News website and does not use any search service.

Is it legal? The actor reads a public API that its operator documents and offers openly, one request per story, politely, and delivers public information without personal data. The content itself belongs to its authors, so how you reuse titles and texts is your responsibility under the law that applies to you. This is not legal advice.

Does it collect personal data? No personal data: no author names, no comments, no user pages, and e-mail addresses and phone numbers inside post texts are masked. See the Privacy section.

Why can't I get usernames or comments? On purpose. Usernames and comment texts identify people, and Rowcraft actors deliver data without persons. The number of comments is delivered, because it shows how much a story is discussed.

Why is the result empty? Usually the filters are too strict for the lists you chose (a high minScore on the New list, a domain nobody linked today, a keyword that is not in any current title), or Only new rows is on and everything that matches was already delivered to you. Open RUN_SUMMARY: it shows how many stories were read, how many your filters dropped and how many were skipped as already delivered, and COVERAGE shows each list. Nothing is charged for stories you do not receive, apart from the start event.

Why did I get fewer stories than I asked for? Either the lists hold fewer stories than your maximum (Ask HN and the job list are short), or fewer stories passed your filters. The COVERAGE record shows, per list, how many ids it held and what happened to them.

Can I get older stories? Not with this actor. It reads the current lists only, so the oldest story you can reach is on the New list, a few hundred stories back. The stories' hnUrl links lead to the full discussion.

Do I pay for stories my filters drop, for duplicates or for deleted stories? No. Only stories delivered to your dataset are charged. Duplicates between lists, filtered stories, deleted or dead stories and stories skipped by Only new rows are free, and so is a Count only run.

Can I follow a keyword and get a message? Yes. Use keywords, turn on onlyNew with a stateName, schedule the run in Apify Console and put a Slack, Discord, Make, n8n or Zapier address in notifyUrl.

How up to date is it? The lists are read at the start of each run, so the data is as fresh as Hacker News itself. Schedule the actor as often as you need; every run costs only the new stories when onlyNew is on.

Support and reviews

Problems, missing fields, questions: open an issue on the Issues tab of this Actor. We answer within one working day and fix confirmed bugs in the next release; the changelog lists every change.

If this Actor saved you time, a short review on its page helps other users find it and helps us keep improving it.