changedInput schema / properties / author / description
Previous value: -"Filter results to a specific author. Useful for finding a user's posts on a topic (hn_get_user only shows recent submissions). Trimmed before filtering; omit the field to search all authors rather than passing a blank string."New value: +"Filter results to a specific author — useful for finding a user's posts on a topic. Matches the HN username exactly and is case-sensitive, so a re-cased name finds nothing. Trimmed before filtering; omit the field to search all authors rather than passing a blank string."
changedInput schema / properties / count / description
Previous value: -"Number of results to return."New value: +"Number of results to return, at most 50 per call. A larger value is served at 50: the search runs at count 50 from the hit where the requested page starts, and the notice names the count and page to pass next. With page above 0, that hit (page × count) must begin a page of 50 hits."
changedInput schema / properties / count / maximum
Previous value: -50New value: +1000
changedInput schema / properties / page / description
Previous value: -"Page number for pagination (0-indexed)."New value: +"Page number for pagination (0-indexed), counted in pages of count results."
changedInput schema / properties / query / description
Previous value: -"Search terms. Supports simple keywords — Algolia handles stemming and relevance. Trimmed before searching; blank or whitespace-only input is rejected. Omit for a filter-only search, which needs at least one of tags, author, storyId, minPoints, or a dateRange bound."New value: +"Search terms. Supports simple keywords — Algolia handles stemming and relevance, and a hit must contain every term. Trimmed before searching; blank or whitespace-only input is rejected. To find discussions of a page, pass its URL alone: a query with no spaces that starts with http://, https://, or www. is searched without that prefix, so submissions under either scheme, with or without www., all match. Omit for a filter-only search, which needs at least one of tags, author, storyId, minPoints, or a dateRange bound."
changedInput schema / properties / storyId / description
Previous value: -"Restrict results to one discussion: the id of a story or poll root, combined with the other filters. Pair with tags \"comment\" to search within a thread. Take it from hits[].storyId or the root item of hn_get_thread — a comment id matches nothing."New value: +"Restrict results to one discussion: the id of a story or poll root, combined with the other filters. Pair with tags \"comment\" to search within a thread. Take it from hits[].storyId, from a poll hit's own id (poll hits carry no storyId), or from hn_get_thread — the root item's id, or its item.storyId when the root is a comment. A comment id matches nothing."
changedInput schema / properties / tags / description
Previous value: -"Filter results by content type: \"story\", \"comment\", \"poll\", or \"job\", or the story subsets \"ask_hn\", \"show_hn\", and \"front_page\". Omit to search all types."New value: +"Filter results by content type: \"story\", \"comment\", \"poll\", or \"job\", or the story subsets \"ask_hn\", \"show_hn\", and \"front_page\". \"front_page\" is the HN front page right now (about 30 stories); no filter selects stories from past front pages. The nearest proxy is \"story\" with dateRange and minPoints — without a query, the default relevance sort ranks by points. Omit to search all types, which also returns poll options (type \"pollopt\"): records with only an id, author, vote count, and date — hn_get_thread reads an option's text and poll."
changedOutput schema / anyOf
Previous value: -[
- {
- "not": {
- "required": [
- "error"
- ]
- },
- "required": [
- "hits",
- "totalHits",
- "page",
- "totalPages"
- ]
- },
- {
- "required": [
- "error"
- ]
- }
-]New value: +[
+ {
+ "not": {
+ "required": [
+ "error"
+ ]
+ },
+ "required": [
+ "hits",
+ "criteria",
+ "totalHits",
+ "page",
+ "totalPages"
+ ]
+ },
+ {
+ "required": [
+ "error"
+ ]
+ }
+]
changedOutput schema / properties / cap / description
Previous value: -"The count cap that was applied."New value: +"The count value served: as passed, or 50 when count was above that cap."
addedOutput schema / properties / criteria
Added value: +{
+ "additionalProperties": false,
+ "description": "The criteria this search ran with: each filter that was set, as sent — author trimmed, dateRange bounds as the exclusive UTC instants applied — then sort, count, and view, defaults included. Unset filters are absent. The searched query is in query.",
+ "properties": {
+ "author": {
+ "description": "Author filter — the username matched, trimmed.",
+ "type": "string"
+ },
+ "count": {
+ "description": "Hits per page sent: count as passed, or 50 when count was above that cap.",
+ "type": "number"
+ },
+ "dateRange": {
+ "additionalProperties": false,
+ "description": "Creation-time window as applied, with only the bounds that were set.",
+ "properties": {
+ "end": {
+ "description": "Items match only when created strictly before this instant: the end bound in ISO 8601 UTC, rounded up to the whole second.",
+ "type": "string"
+ },
+ "start": {
+ "description": "Items match only when created strictly after this instant: the start bound in ISO 8601 UTC, rounded down to the whole second.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "minPoints": {
+ "description": "Minimum score.",
+ "type": "number"
+ },
+ "sort": {
+ "description": "Sort order used.",
+ "enum": [
+ "relevance",
+ "date"
+ ],
+ "type": "string"
+ },
+ "storyId": {
+ "description": "Discussion filter: a story or poll root id.",
+ "type": "number"
+ },
+ "tags": {
+ "description": "Content-type filter.",
+ "enum": [
+ "story",
+ "comment",
+ "poll",
+ "job",
+ "ask_hn",
+ "show_hn",
+ "front_page"
+ ],
+ "type": "string"
+ },
+ "view": {
+ "description": "Projection applied to each hit.",
+ "enum": [
+ "full",
+ "compact"
+ ],
+ "type": "string"
+ }
+ },
+ "required": [
+ "sort",
+ "count",
+ "view"
+ ],
+ "type": "object"
+}
changedOutput schema / properties / error / properties / data / properties / reason / description
Previous value: -"Machine-readable failure mode. Declared by this tool: `missing_query_or_filter`: Neither a query nor any filter was supplied, so there is nothing to search by. `invalid_date_range`: dateRange was supplied with neither bound, or with start not before end. `min_points_unscored_type`: minPoints was combined with tags \"comment\" or \"job\", record types Algolia stores without points. `upstream_rejected`: Algolia answered with a 4xx status other than 429 — it rejected the request as built. `upstream_rate_limited`: Algolia answered with HTTP 429. `upstream_unavailable`: Algolia answered with a 5xx status. `upstream_html`: Algolia served an HTML error page with a 200 status, which it does under rate limiting or maintenance. `upstream_malformed`: Algolia answered with a 200 status and a body that is not JSON. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `missing_query_or_filter`: Neither a query nor any filter was supplied, so there is nothing to search by. `invalid_date_range`: dateRange was supplied with neither bound, or with start not before end. `min_points_unscored_type`: minPoints was combined with tags \"comment\" or \"job\", record types Algolia stores without points. `count_page_unaligned`: count was above the per-call cap of 50 with a page whose first hit (page × count) begins no page of 50 hits, so the requested page cannot be served from its start at the cap. `upstream_rejected`: Algolia answered with a 4xx status other than 429 — it rejected the request as built. `upstream_rate_limited`: Algolia answered with HTTP 429. `upstream_unavailable`: Algolia answered with a 5xx status. `upstream_html`: Algolia served an HTML error page with a 200 status, which it does under rate limiting or maintenance. `upstream_malformed`: Algolia answered with a 200 status and a body that is not JSON. Other values are possible when a failure originates below the handler."
changedOutput schema / properties / error / properties / data / properties / reason / examples
Previous value: -[
- "missing_query_or_filter",
- "invalid_date_range",
- "min_points_unscored_type",
- "upstream_rejected",
- "upstream_rate_limited",
- "upstream_unavailable",
- "upstream_html",
- "upstream_malformed"
-]New value: +[
+ "missing_query_or_filter",
+ "invalid_date_range",
+ "min_points_unscored_type",
+ "count_page_unaligned",
+ "upstream_rejected",
+ "upstream_rate_limited",
+ "upstream_unavailable",
+ "upstream_html",
+ "upstream_malformed"
+]
changedOutput schema / properties / hits / items / description
Previous value: -"A single Algolia search hit (story, comment, poll, or job)."New value: +"A single Algolia search hit (story, comment, poll, poll option, or job)."
changedOutput schema / properties / hits / items / properties / storyId / description
Previous value: -"Parent story ID for comment hits; equals `id` for story hits."New value: +"Parent story ID for comment hits; equals `id` for story hits. Absent for polls, poll options, and jobs — a poll's own `id` is its discussion root."
changedOutput schema / properties / hits / items / properties / text / description
Previous value: -"Comment or story body text (HTML stripped). Absent when the hit has no body, and always absent under view \"compact\" — call hn_get_thread with this id to read it."New value: +"Body text, HTML stripped: a comment's text, a text post's body, or a job's description. A job description is returned but not keyword-searched or highlighted. Absent when the hit has no body, and always absent under view \"compact\" — call hn_get_thread with this id to read it."
addedOutput schema / properties / hits / items / properties / type
Added value: +{
+ "description": "Item type: story (Ask HN, Show HN, and front-page stories included), comment, poll, pollopt (one option of a poll), or job. Absent when the search record names no type.",
+ "enum": [
+ "story",
+ "comment",
+ "poll",
+ "pollopt",
+ "job"
+ ],
+ "type": "string"
+}
changedOutput schema / properties / notice / description
Previous value: -"Agent guidance: the next page to request while more pages remain, the last valid page when the requested page is past the end, or the filters to relax when a first page comes back empty. Absent on the last page of a non-empty result."New value: +"Agent guidance, one string. It opens with the page state: the next page to request while more pages remain, the 1,000-hit ceiling on the last page of a search that matches more, the last valid page when the requested page is past the end, or the filters to relax when a first page comes back empty. Notes on the inputs follow it. Absent when none applies."
changedOutput schema / properties / page / description
Previous value: -"Current page number (0-indexed)."New value: +"Current page number (0-indexed), in pages of criteria.count hits. When count was above the per-call cap, the page of 50 where the requested page starts."
changedOutput schema / properties / query / description
Previous value: -"The query that was searched. Absent for a filter-only search."New value: +"The query that was searched — for a URL query, without its leading scheme and www. Absent for a filter-only search."
addedOutput schema / properties / reachableHits
Added value: +{
+ "description": "How many of totalHits paging can reach: Algolia serves at most 1,000 hits per search. Present only when totalHits exceeds that; split the search into narrower dateRange windows to reach the rest.",
+ "type": "number"
+}
changedOutput schema / properties / totalHits / description
Previous value: -"Total matching results across all pages."New value: +"Matching results across all pages, as Algolia counts them. An estimate when totalHitsExact is false — broad searches can be off by orders of magnitude — and paging reaches only the first 1,000 (see reachableHits)."
addedOutput schema / properties / totalHitsExact
Added value: +{
+ "description": "True when totalHits is an exact count, false when it is an estimate, as it is for keyword searches and broad filter-only searches. Absent when Algolia does not say, and on a page past the 1,000-hit ceiling, where totalHits reads 0.",
+ "type": "boolean"
+}
changedOutput schema / properties / totalPages / description
Previous value: -"Number of pages Algolia will actually serve for this query. Not derived from totalHits — broad queries report a totalHits far larger than the reachable page range, so paginate against this value."New value: +"Number of pages of criteria.count hits Algolia will actually serve for this query, covering at most the first 1,000 hits. Not derived from totalHits — broad queries report a totalHits far larger than the reachable page range, so paginate against this value."