upvote
HN is exported to firebase, which you can hit directly, for that sort of purpose

https://github.com/HackerNews/API

reply
I know that.

I've not worked with the API, and there's the blessing/curse (blurse‽) that HTML is a known, if poor, standard.

API always translates to "one more thing to learn, that's applicable to a single-use case". HTML scraping / sorting I can apply across multiple sites.

That said, a standard, say, JSON packaging of website contents available on request might be fun to have.

reply
I feel less bad hammering firebase in a "while True:" loop vs hitting HN's servers.
reply
reply
Between me and you, I don't think Google would register that amongst the noise of just running the service anyway on their monitoring systems.

You're right to point out that if you're trying to get the contents of dead objects the API is of no use though.

reply
Google might not register it, but in some related testing, even a few hundred requests through the API (serial, not concurrent) takes much longer than a single "Past" page request would, even if the latter were substantially rate-limited. Of course, if those requests (to HN itself rather than the API) are blocked entirely, that's a moot issue.

On dead/flagged items, there's some value. Whilst the title/URL context aren't available, just knowing what fraction of submissions and comments are moderated is interesting data, and it is possible to construct patterns against specific accounts.

I'm frequently encountering what appear to be banned accounts. Being able to trace those through the API to see where and when they were banned, or now much moderated activity they're generating, can be useful. I'm relying heavily on the "/replies?id=<UID>&by=<moderator>" search endpoint (generally dang, tomhow, sctb, or pg as mod) currently to find out if there was a specific ban admonishment from a moderator. That's often but not always the case.

But it's not possible, say, to tell through the API what sites are banned. Looking at site history with "showdead" enabled can tell you that though, e.g.:

<https://news.ycombinator.com/from?site=synthetica.cloud>

(From the New queue, one of several "dead" submissions not flagged, suggesting a site ban.)

Hypothesizing an undocumented "site" API endpoint ... doesn't seem to check out:

    https://hacker-news.firebaseio.com/v0/site/synthetica.cloud?print=pretty
Returns:

    not found
(Similarly for "domain", "url", and "URL".)

And there's the "day" endpoint doesn't seem to work either, though it conspicuously does not report "not found", e.g.:

    https://hacker-news.firebaseio.com/v0/day/2025-07-10?print=pretty
(I've tried a few other date format variants, including Unix time (seconds) without success.)
reply
Looking at the API ...

... it's starting to make sense, but ...

... the API is geared at requesting specific content items (posts, comments, users). There doesn't seem to be a way to directly make a request for a front-page history page (that is, the 30 items archived on a given date. Say, 2008-11-05:

<https://news.ycombinator.com/front?day=2008-11-05>

It's the collection of 30 items from that date I'm interested in. For my scraping, I don't actually need to further query the individual posts as I've got the elements I'm interested in (title, date, story position, URL, votes, comment count, submitter, site/domain) from the index page itself, parsed out of the HTML. The "Past" entries alone are a significant (though not huge) request load. To update the past three years would be about another 1,000 requests, which, if fulfilled and modestly rate-limited would hopefully not keel the servers over.

Once I've pulled in those "Past" pages, I could of course do further API queries, though at this point I don't see any specific need to do so.

I suppose that requesting the "past" links be included in the API set could be a request I might make of HN, or the ability to request, say, all submissions (or comments!) for a given date.

There are groups which have done HN analytics in the past using the API, for example Whaly.io:

"A Year on Hacker News" <https://news.ycombinator.com/item?id=31295219>

"Top Hacker News commenters of 2021" <https://news.ycombinator.com/item?id=29778994>

"What Happened This Year on Hacker News (2021)" <https://news.ycombinator.com/item?id=29769470>

I could look more into their methodology to see if I can use similar approaches.

The existence of "dead" and "deleted" values does seem interesting. I might do some playing with those to see what shows up (I suspect that most additional information is suppressed...)

OK, looking at a recent dead atomic128 comment:

  $ curl -s 'https://hacker-news.firebaseio.com/v0/item/48820709.json?print=pretty'
  {
    "by" : "atomic128",
    "dead" : true,
    "id" : 48820709,
    "parent" : 48819517,
    "text" : "[flagged]",
    "time" : 1783444517,
    "type" : "comment"
  }
So userID is visible.

And from a current dead submission in the New queue:

  $ curl -s 'https://hacker-news.firebaseio.com/v0/item/48868688.json?print=pretty'
  {
    "by" : "millwright-sw",
    "dead" : true,
    "id" : 48868688,
    "score" : 1,
    "time" : 1783743361,
    "type" : "story"
  }
That's missing the title and URL, as I suspected it would, though the submitter UID is available.

To get top stories by date I'd actually have to submit more requests, walking through item numbers, splitting out comments and stories. Based on Whaly's 2021 retrospective, with about 4.2 million items (stories + comments) posted in total, that's about 12,000 items per day. Versus, well, one "Past" page result...

reply