What gained traction in a niche — charged only when it finds movement

Costs 10 credits, and CHARGES ONLY IF IT FINDS MOVEMENT. An empty result is a 200 with credits_charged: 0 and a note saying so, not an error and not a charge: the risk of an empty window sits with us, so you do not need defensive logic to avoid calling.

RANKED BY POINTS GAINED, NOT BY POSITION. This is the caveat that matters most, so it is stated before the parameters. Measured on 2026-09-06 across 19 pairs of windows: position changed for 19 of 29 items WITHOUT A SINGLE POINT CHANGING. Most items in a snapshot sit within a few points of each other, so ties are the rule, and a tie reshuffle looks exactly like movement if you read position. points_gained is Hacker News's own counter, not a number we derive, and it is what this endpoint sorts by.

interval_min IS THE REAL ELAPSED TIME between the two captures compared, not the window you asked for. The endpoint picks the archived window whose real capture time is closest to hours ago — windows are not equidistant, and observed intervals have ranged from 12 to 321 minutes. Asking hours=24 against an archive that is 20 hours deep returns interval_min: 1208, not 1440. Divide by this number, not by the one you sent.

An unknown niche is NOT a 404 here: it produces the same empty, uncharged 200 as a quiet window. Confirm the niche exists at /api/v1/nichos before reading an empty result as 'nothing moved'.

get/api/v1/movers/{niche}

Request

  • Base URL: https://honesthook.com
  • URL: https://honesthook.com/api/v1/movers/{niche}
  • Auth: HTTP bearer

Path parameters

nichestring required

Query parameters

hoursinteger

How far back to look for the comparison window. A target, not a guarantee — the archive answers with the closest window it actually has, and reports the real gap in interval_min.

limitinteger

Top N by points gained. Clamped to 100 in the database; a larger value here does not raise it.

Response

OK — with movement (credits_charged: 10) or without it (credits_charged: 0, items: [], and a note). Both are successes; branch on total, not on the status code.

nichestring required
totalinteger required

Number of items in items.

interval_mininteger nullable

Real minutes between the two captures compared. null when there was no movement to compare. A delta without an interval is a number without a unit — read this before reading points_gained.

credits_charged0 | 10 required

Credits actually charged for this call. 0 when the result was empty.

credits_balanceinteger required

Credits left on the key after this call.

notestring

Present only on an empty, uncharged result.

Example response

{
  "niche": "ai-agents",
  "interval_min": 1208,
  "note": "nothing gained traction in this window -- not charged",
  "items": [
    {
      "external_id": "49569136"
    }
  ]
}

Changes

No recorded changes to this operation across all 1 revision of this API.