openapi: 3.2.0 info: title: Social Fetch Public Hacker News API version: 1.0.0 description: 'REST API for Social Fetch. Versioned routes under `/v1` accept `x-api-key` credits or x402 USDC on Base (walk-up, no key). OpenAPI: https://api.socialfetch.dev/openapi.json. x402 discovery: https://api.socialfetch.dev/.well-known/x402. MCP: https://api.socialfetch.dev/mcp (POST). Docs and agent guide: https://www.socialfetch.dev/docs and https://www.socialfetch.dev/llms.txt.' servers: - url: https://api.socialfetch.dev description: API origin tags: - name: Hacker News paths: /v1/hackernews/search: get: tags: - Hacker News summary: Search Hacker News description: Search Hacker News by keyword. security: - ApiKeyAuth: [] - {} x-socialfetch-pricing: version: 1 baseCredits: 1 surcharges: [] maxCredits: 1 normalizationFailureCredits: 0 x-socialfetch-credits-pricing: 1 credit per successful request. parameters: - schema: type: string maxLength: 512 description: Full-text search query. Required unless `frontPageOnly`, `author`, `domain`, or `url` is set. required: false description: Full-text search query. Required unless `frontPageOnly`, `author`, `domain`, or `url` is set. name: query in: query - schema: type: string enum: - all - story - comment - ask_hn - show_hn - launch_hn - job - poll description: 'Restrict search results to a Hacker News content type. `ask_hn`: Ask HN posts (questions to the community). `show_hn`: Show HN posts (projects/work being shared). `launch_hn`: Launch HN posts (YC-affiliated company launches). Default: `all`.' required: false description: 'Restrict search results to a Hacker News content type. `ask_hn`: Ask HN posts (questions to the community). `show_hn`: Show HN posts (projects/work being shared). `launch_hn`: Launch HN posts (YC-affiliated company launches). Default: `all`.' name: type in: query - schema: type: string enum: - popularity - date description: 'Ranking mode. Default: `popularity`.' required: false description: 'Ranking mode. Default: `popularity`.' name: sort in: query - schema: type: string enum: - 24h - week - month - year - all description: 'Creation-time window. Default: `all`.' required: false description: 'Creation-time window. Default: `all`.' name: dateRange in: query - schema: type: - integer - 'null' minimum: 0 maximum: 49 description: Zero-based page index (maximum 50 pages, up to 1,000 hits). required: false description: Zero-based page index (maximum 50 pages, up to 1,000 hits). name: page in: query - schema: anyOf: - type: number enum: - 10 - type: number enum: - 20 - type: number enum: - 30 - type: number enum: - 50 description: 'Hits per page. Must be one of 10, 20, 30, 50. Default: 20. Prefer this over `pageSize`.' required: false description: 'Hits per page. Must be one of 10, 20, 30, 50. Default: 20. Prefer this over `pageSize`.' name: limit in: query - schema: type: boolean description: When true, restrict results to current front-page items. Allows omitting `query`. required: false description: When true, restrict results to current front-page items. Allows omitting `query`. name: frontPageOnly in: query - schema: type: boolean description: 'Include story/comment text in searchable fields. Default: true. Set false to search title/URL only.' required: false description: 'Include story/comment text in searchable fields. Default: true. Set false to search title/URL only.' name: searchStoryText in: query - schema: type: boolean description: When true, include author username in the searchable fields. required: false description: When true, include author username in the searchable fields. name: searchAuthor in: query - schema: type: boolean description: When true, enable prefix matching for query tokens. required: false description: When true, enable prefix matching for query tokens. name: prefix in: query - schema: type: boolean description: 'Enable typo tolerance. Default: true.' required: false description: 'Enable typo tolerance. Default: true.' name: typoTolerance in: query - schema: type: string minLength: 1 maxLength: 255 pattern: ^[A-Za-z0-9_-]+$ description: Restrict results to items by this Hacker News username. required: false description: Restrict results to items by this Hacker News username. name: author in: query - schema: type: string minLength: 1 maxLength: 255 description: Restrict search to story URLs matching this domain (e.g. example.com). Can omit `query`. required: false description: Restrict search to story URLs matching this domain (e.g. example.com). Can omit `query`. name: domain in: query - schema: type: string minLength: 1 maxLength: 2048 description: Restrict search to story URLs matching this URL substring. Can omit `query`. required: false description: Restrict search to story URLs matching this URL substring. Can omit `query`. name: url in: query - schema: type: - integer - 'null' minimum: 0 maximum: 1000000 description: Minimum points/score filter. required: false description: Minimum points/score filter. name: minPoints in: query responses: '200': description: Hacker News search results. content: application/json: schema: type: object properties: data: type: object properties: query: type: - string - 'null' description: Search query evaluated for this response, or null for front-page-only. hits: type: array items: type: object properties: id: type: integer description: Hacker News item id. exclusiveMinimum: 0 type: type: string enum: - story - comment - poll - job - pollopt - unknown description: Normalized content type. author: type: - string - 'null' description: Author username when present. createdAt: type: - string - 'null' format: date-time description: Creation time as an ISO-8601 timestamp. title: type: - string - 'null' description: Plain-text title when present. text: type: - string - 'null' description: Plain-text body when present (HTML stripped). url: type: - string - 'null' format: uri description: External story URL when present and publicly safe. score: type: - integer - 'null' description: Points / score when present. commentCount: type: - integer - 'null' description: Comment count for stories when present. storyId: type: - integer - 'null' description: Parent story id for comment hits when present. exclusiveMinimum: 0 parentId: type: - integer - 'null' description: Immediate parent item id when present. exclusiveMinimum: 0 tags: type: array items: type: string minLength: 1 description: Normalized content tags for this hit (e.g. story, ask_hn). itemUrl: type: string format: uri description: Canonical news.ycombinator.com item URL. required: - id - type - author - createdAt - title - text - url - score - commentCount - storyId - parentId - tags - itemUrl description: A single Hacker News search hit. description: Search hits for this page. page: type: object properties: page: type: integer minimum: 0 description: Zero-based page index for this response. pageSize: type: integer description: Requested page size for this response. exclusiveMinimum: 0 returned: type: integer minimum: 0 description: Number of hits returned in this response. hasMore: type: boolean description: Whether another page of results is available. nextPage: type: - integer - 'null' minimum: 0 description: Next page index when hasMore is true; otherwise null. totalHits: type: integer minimum: 0 description: Reported total hit count from the search index. totalHitsExact: type: boolean description: Whether totalHits is exhaustive. When false, treat totalHits as an estimate. maxAccessibleHits: type: integer description: Hard upper bound on pageable hits from the search index (typically 1000). exclusiveMinimum: 0 required: - page - pageSize - returned - hasMore - nextPage - totalHits - totalHitsExact - maxAccessibleHits description: Pagination information for the current response. required: - query - hits - page description: Endpoint-specific response payload. meta: type: object properties: requestId: type: string minLength: 1 description: Unique request identifier for tracing this API call. creditsCharged: type: integer minimum: 0 description: Credits charged for this request. version: type: string enum: - v1 description: Public API version that served the response. cached: type: boolean description: True when served from shared response cache. Credits still apply (full endpoint price); Age header may be present. required: - requestId - creditsCharged - version description: Metadata describing the request and billing outcome. required: - data - meta description: Standard success response envelope. examples: found: value: data: query: Dropbox hits: - id: 8863 type: story author: dhouston createdAt: '2007-04-04T19:16:40.000Z' title: 'My YC app: Dropbox - Throw away your USB drive' text: null url: http://www.getdropbox.com/u/2/screencast.html score: 104 commentCount: 71 storyId: 8863 parentId: null tags: - story - author_dhouston itemUrl: https://news.ycombinator.com/item?id=8863 page: page: 0 pageSize: 20 returned: 1 hasMore: false nextPage: null totalHits: 1 totalHitsExact: true maxAccessibleHits: 1000 meta: requestId: req_01example_hackernews_search creditsCharged: 1 version: v1 empty: value: data: query: zzzznonexistentqueryzzzz hits: [] page: page: 0 pageSize: 20 returned: 0 hasMore: false nextPage: null totalHits: 0 totalHitsExact: true maxAccessibleHits: 1000 meta: requestId: req_01example_hackernews_search_empty creditsCharged: 1 version: v1 '400': description: Invalid search query content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - bad_request description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: bad_request message: Example message. requestId: req_01example '401': description: Missing or invalid API key content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - unauthorized description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: unauthorized message: Example message. requestId: req_01example '402': description: Insufficient credits content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - insufficient_credits description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: insufficient_credits message: Example message. requestId: req_01example '500': description: Unexpected or billing error content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - internal_error description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: internal_error message: Example message. requestId: req_01example '502': description: Lookup could not be completed. content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - lookup_failed description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: lookup_failed message: Example message. requestId: req_01example '503': description: Service temporarily unavailable; safe to retry with backoff. headers: Retry-After: description: Seconds to wait before retrying. Present on capacity, deadline, circuit-open, and safe transport outages (bounded 1–120). schema: type: integer minimum: 1 maximum: 120 example: 1 content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - temporarily_unavailable description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: temporarily_unavailable message: Example message. requestId: req_01example operationId: getV1HackernewsSearch x-operation-id-source: derived /v1/hackernews/feeds/{feed}: get: tags: - Hacker News summary: List a Hacker News feed description: List a Hacker News feed by type (top, new, best, ask, show, or jobs). security: - ApiKeyAuth: [] - {} x-socialfetch-pricing: version: 1 baseCredits: 1 surcharges: [] maxCredits: 1 normalizationFailureCredits: 0 x-socialfetch-credits-pricing: 1 credit per successful request. parameters: - schema: type: string enum: - top - new - best - ask - show - jobs description: 'Hacker News feed: top, new, best, ask, show, or jobs.' required: true description: 'Hacker News feed: top, new, best, ask, show, or jobs.' name: feed in: path - schema: type: - integer - 'null' minimum: 0 maximum: 49 description: 'Zero-based page index (maximum 50 pages). Default: 0. Advance with `data.page.nextPage` when `hasMore` is true.' required: false description: 'Zero-based page index (maximum 50 pages). Default: 0. Advance with `data.page.nextPage` when `hasMore` is true.' name: page in: query - schema: type: integer minimum: 1 maximum: 50 description: 'Items to hydrate per page (1–50). Default: 30. Prefer this over `pageSize`.' required: false description: 'Items to hydrate per page (1–50). Default: 30. Prefer this over `pageSize`.' name: limit in: query responses: '200': description: Hydrated feed page. content: application/json: schema: type: object properties: data: type: object properties: feed: type: string enum: - top - new - best - ask - show - jobs description: Requested feed name. items: type: array items: type: object properties: id: type: integer description: Unique Hacker News item id. exclusiveMinimum: 0 type: type: string enum: - story - comment - job - poll - pollopt - unknown description: Item type. author: type: - string - 'null' description: Author username when present. createdAt: type: - string - 'null' format: date-time description: Creation time as an ISO-8601 timestamp. title: type: - string - 'null' description: Plain-text title when present. text: type: - string - 'null' description: Plain-text body when present (HTML stripped). url: type: - string - 'null' format: uri description: External URL when present and publicly safe. score: type: - integer - 'null' description: Score / votes when present. commentCount: type: - integer - 'null' description: Total comment count when present (stories/polls). parentId: type: - integer - 'null' description: Parent item id for comments/pollopts. exclusiveMinimum: 0 childIds: type: array items: type: integer exclusiveMinimum: 0 description: Child item ids in ranked display order when present. Some list endpoints omit children and return an empty array. dead: type: boolean description: Whether the item is marked dead. Some list endpoints omit this signal and return false. deleted: type: boolean description: Whether the item is marked deleted. Some list endpoints omit this signal and return false. itemUrl: type: string format: uri description: Canonical news.ycombinator.com item URL. required: - id - type - author - createdAt - title - text - url - score - commentCount - parentId - childIds - dead - deleted - itemUrl description: Compact Hacker News item (any type). description: Hydrated feed items in official ranking order. page: type: object properties: page: type: integer minimum: 0 description: Zero-based page index for this response. pageSize: type: integer description: Requested page size for this response. exclusiveMinimum: 0 returned: type: integer minimum: 0 description: Number of hydrated items returned. totalIds: type: integer minimum: 0 description: Length of the upstream feed id array. hasMore: type: boolean description: True when more ids remain after this page window. nextPage: type: - integer - 'null' minimum: 0 description: Next page index when hasMore is true; otherwise null. droppedCount: type: integer minimum: 0 description: Ids in the window that could not be hydrated (deleted/missing). required: - page - pageSize - returned - totalIds - hasMore - nextPage - droppedCount description: Feed pagination metadata. required: - feed - items - page description: Endpoint-specific response payload. meta: type: object properties: requestId: type: string minLength: 1 description: Unique request identifier for tracing this API call. creditsCharged: type: integer minimum: 0 description: Credits charged for this request. version: type: string enum: - v1 description: Public API version that served the response. cached: type: boolean description: True when served from shared response cache. Credits still apply (full endpoint price); Age header may be present. required: - requestId - creditsCharged - version description: Metadata describing the request and billing outcome. required: - data - meta description: Standard success response envelope. example: data: feed: top items: - id: 49038433 type: story author: alvis createdAt: '2026-07-24T16:57:41.000Z' title: Claude Opus 5 text: https://www.anthropic.com/claude-opus-5-system-card url: https://www.anthropic.com/news/claude-opus-5 score: 1386 commentCount: 755 parentId: null childIds: - 49038959 - 49039922 - 49040857 - 49044428 - 49038676 - 49038571 - 49038745 - 49043731 - 49038705 - 49039052 - 49044265 - 49038865 - 49038677 - 49038690 - 49038666 - 49039863 - 49038589 - 49038813 - 49038776 - 49040983 - 49038637 - 49039086 - 49038796 - 49043144 - 49042098 - 49041739 - 49038728 - 49038671 - 49040308 - 49042669 - 49042234 - 49038875 - 49039621 - 49038769 - 49039206 - 49038685 - 49038897 - 49043404 - 49039967 - 49042480 - 49039458 - 49043333 - 49040405 - 49039383 - 49039331 - 49039488 - 49042628 - 49040499 - 49039547 - 49041918 - 49039597 - 49040949 - 49040629 - 49042696 - 49038862 - 49044422 - 49042393 - 49038801 - 49038642 - 49040252 - 49041102 - 49041326 - 49039872 - 49039307 - 49039014 - 49038698 - 49042308 - 49038772 - 49040441 - 49039084 - 49043181 - 49039641 - 49040087 - 49040689 - 49042814 - 49038869 - 49038817 - 49043066 - 49039135 - 49039705 - 49039313 - 49038517 - 49043791 - 49038479 - 49038535 - 49038660 - 49039044 - 49038594 - 49039193 - 49039271 - 49038835 - 49038950 - 49038855 - 49040006 - 49039356 - 49038585 - 49038515 - 49038893 - 49040313 - 49039182 - 49043784 - 49040060 - 49043554 - 49039774 - 49039663 - 49038931 - 49038552 - 49039218 - 49041693 - 49038770 - 49038723 - 49038741 - 49038664 - 49038629 - 49039719 - 49043201 - 49039446 - 49038693 - 49039478 - 49042842 - 49042433 - 49038696 - 49039644 - 49039004 - 49040784 - 49041373 - 49040136 - 49038987 - 49040845 - 49039906 - 49038797 - 49039595 - 49039483 - 49039352 - 49039183 - 49038926 - 49038407 - 49042392 - 49038584 - 49039366 - 49038733 - 49039272 - 49038678 - 49042305 - 49040865 - 49043213 - 49040776 - 49041117 - 49039469 - 49042272 - 49041645 - 49039209 - 49039826 - 49043146 - 49038625 - 49038524 - 49038746 - 49039511 - 49038704 dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=49038433 - id: 49040296 type: story author: KraftyOne createdAt: '2026-07-24T19:05:53.000Z' title: Postgres LISTEN/NOTIFY actually scales text: null url: https://www.dbos.dev/blog/postgres-listen-notify-scalability score: 238 commentCount: 43 parentId: null childIds: - 49040671 - 49040676 - 49042117 - 49043376 - 49041452 - 49040502 - 49040558 - 49044225 - 49042259 - 49044399 - 49043460 - 49041307 - 49042048 - 49041152 - 49041062 - 49042671 - 49041086 - 49042071 - 49041270 - 49041233 - 49042756 dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=49040296 - id: 49044074 type: story author: JumpCrisscross createdAt: '2026-07-25T02:54:36.000Z' title: Taylor Farms Called White House to Try to Delay Cyclospora Recall text: null url: https://www.wsj.com/health/taylor-farms-cyclospora-recall-delay-call-41fef0bc score: 74 commentCount: 11 parentId: null childIds: - 49044368 - 49044451 - 49044397 - 49044342 dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=49044074 page: page: 0 pageSize: 3 returned: 3 totalIds: 500 hasMore: true nextPage: 1 droppedCount: 0 meta: requestId: req_01example_hackernews_feed creditsCharged: 1 version: v1 '400': description: Invalid request content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - bad_request description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: bad_request message: Example message. requestId: req_01example '401': description: Missing or invalid API key content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - unauthorized description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: unauthorized message: Example message. requestId: req_01example '402': description: Insufficient credits content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - insufficient_credits description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: insufficient_credits message: Example message. requestId: req_01example '500': description: Unexpected or billing error content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - internal_error description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: internal_error message: Example message. requestId: req_01example '502': description: Lookup could not be completed. content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - lookup_failed description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: lookup_failed message: Example message. requestId: req_01example '503': description: Service temporarily unavailable; safe to retry with backoff. headers: Retry-After: description: Seconds to wait before retrying. Present on capacity, deadline, circuit-open, and safe transport outages (bounded 1–120). schema: type: integer minimum: 1 maximum: 120 example: 1 content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - temporarily_unavailable description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: temporarily_unavailable message: Example message. requestId: req_01example operationId: getV1HackernewsFeedsByFeed x-operation-id-source: derived /v1/hackernews/stories/{id}: get: tags: - Hacker News summary: Get a Hacker News story description: Get a Hacker News story by id. security: - ApiKeyAuth: [] - {} x-socialfetch-pricing: version: 1 baseCredits: 1 surcharges: [] maxCredits: 1 normalizationFailureCredits: 0 x-socialfetch-credits-pricing: 1 credit per successful request. parameters: - schema: type: integer maximum: 9007199254740991 description: Hacker News story id. exclusiveMinimum: 0 required: true description: Hacker News story id. name: id in: path responses: '200': description: Hacker News story lookup result. content: application/json: schema: type: object properties: data: type: object properties: lookupStatus: type: string enum: - found - not_found - not_story description: Whether the story was found, not found, or not a story. story: type: - object - 'null' properties: id: type: integer description: Unique Hacker News story id. exclusiveMinimum: 0 author: type: - string - 'null' description: Author username when present. createdAt: type: - string - 'null' format: date-time description: Creation time as an ISO-8601 timestamp. title: type: - string - 'null' description: Plain-text title when present. text: type: - string - 'null' description: Plain-text body when present (HTML stripped). url: type: - string - 'null' format: uri description: External story URL when present and publicly safe. score: type: - integer - 'null' description: Score / votes when present. commentCount: type: - integer - 'null' description: Total comment count when present. childIds: type: array items: type: integer exclusiveMinimum: 0 description: Top-level comment ids in ranked display order. dead: type: boolean description: Whether the story is marked dead. deleted: type: boolean description: Whether the story is marked deleted. itemUrl: type: string format: uri description: Canonical news.ycombinator.com item URL. required: - id - author - createdAt - title - text - url - score - commentCount - childIds - dead - deleted - itemUrl description: Story when lookupStatus is `found`; null when `not_found` or `not_story`. required: - lookupStatus - story description: Endpoint-specific response payload. meta: type: object properties: requestId: type: string minLength: 1 description: Unique request identifier for tracing this API call. creditsCharged: type: integer minimum: 0 description: Credits charged for this request. version: type: string enum: - v1 description: Public API version that served the response. cached: type: boolean description: True when served from shared response cache. Credits still apply (full endpoint price); Age header may be present. required: - requestId - creditsCharged - version description: Metadata describing the request and billing outcome. required: - data - meta description: Standard success response envelope. examples: found: value: data: lookupStatus: found story: id: 8863 author: dhouston createdAt: '2007-04-04T19:16:40.000Z' title: 'My YC app: Dropbox - Throw away your USB drive' text: null url: http://www.getdropbox.com/u/2/screencast.html score: 104 commentCount: 71 childIds: - 9224 - 8917 - 8884 - 8887 - 8952 - 8869 - 8873 - 8958 - 8940 - 8908 - 9005 - 9671 - 9067 - 9055 - 8865 - 8881 - 8872 - 8955 - 10403 - 8903 - 8928 - 9125 - 8998 - 8901 - 8902 - 8907 - 8894 - 8870 - 8878 - 8980 - 8934 - 8943 - 8876 dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=8863 meta: requestId: req_01example_hackernews_story creditsCharged: 1 version: v1 not_found: value: data: lookupStatus: not_found story: null meta: requestId: req_01example_hackernews_story_nf creditsCharged: 1 version: v1 not_story: value: data: lookupStatus: not_story story: null meta: requestId: req_01example_hackernews_story_ns creditsCharged: 1 version: v1 '400': description: Invalid story id content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - bad_request description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: bad_request message: Example message. requestId: req_01example '401': description: Missing or invalid API key content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - unauthorized description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: unauthorized message: Example message. requestId: req_01example '402': description: Insufficient credits content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - insufficient_credits description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: insufficient_credits message: Example message. requestId: req_01example '500': description: Unexpected or billing error content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - internal_error description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: internal_error message: Example message. requestId: req_01example '502': description: Lookup could not be completed. content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - lookup_failed description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: lookup_failed message: Example message. requestId: req_01example '503': description: Service temporarily unavailable; safe to retry with backoff. headers: Retry-After: description: Seconds to wait before retrying. Present on capacity, deadline, circuit-open, and safe transport outages (bounded 1–120). schema: type: integer minimum: 1 maximum: 120 example: 1 content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - temporarily_unavailable description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: temporarily_unavailable message: Example message. requestId: req_01example operationId: getV1HackernewsStoriesById x-operation-id-source: derived /v1/hackernews/stories/{id}/comments: get: tags: - Hacker News summary: Get comments on a Hacker News story description: List comments on a Hacker News story by id. security: - ApiKeyAuth: [] - {} x-socialfetch-pricing: version: 1 baseCredits: 3 surcharges: [] maxCredits: 3 normalizationFailureCredits: 0 x-socialfetch-credits-pricing: 3 credits per successful request. parameters: - schema: type: integer maximum: 9007199254740991 description: Hacker News story id whose comment tree should be returned. exclusiveMinimum: 0 required: true description: Hacker News story id whose comment tree should be returned. name: id in: path - schema: type: integer minimum: 1 maximum: 100 description: 'Maximum comment nodes to return in this page (1–100). Default: 50.' required: false description: 'Maximum comment nodes to return in this page (1–100). Default: 50.' name: limit in: query - schema: type: string minLength: 1 description: Opaque continuation cursor from a previous response. Omit for the first page. required: false description: Opaque continuation cursor from a previous response. Omit for the first page. name: cursor in: query responses: '200': description: Hacker News story comment tree page. Each successful page costs one credit, including cursor continuations. content: application/json: schema: type: object properties: data: type: object properties: lookupStatus: type: string enum: - found - not_found - not_story description: Whether the story was found, not found, or not a story. story: type: - object - 'null' properties: id: type: integer description: Story id. exclusiveMinimum: 0 title: type: - string - 'null' description: Plain-text title when present. author: type: - string - 'null' description: Author username when present. commentCount: type: - integer - 'null' description: Total comment count when present. itemUrl: type: string format: uri description: Canonical news.ycombinator.com item URL. required: - id - title - author - commentCount - itemUrl description: Story summary when lookupStatus is `found`; null otherwise. rootCommentIds: type: array items: type: integer exclusiveMinimum: 0 description: Top-level comment ids in ranked display order. Empty when the story has no comments or lookupStatus is not `found`. comments: type: array items: type: object properties: id: type: integer description: Comment item id. exclusiveMinimum: 0 parentId: type: integer description: Immediate parent item id (story or comment). exclusiveMinimum: 0 childIds: type: array items: type: integer exclusiveMinimum: 0 description: Child comment ids in ranked display order. Unresolved children may still appear here when traversal is incomplete. author: type: - string - 'null' description: Author username when available. createdAt: type: - string - 'null' format: date-time description: Creation time as an ISO-8601 timestamp when available. text: type: - string - 'null' description: Plain-text body when available (HTML stripped). Null for deleted/tombstone nodes. dead: type: boolean description: Whether the comment is marked dead. deleted: type: boolean description: Whether the comment is marked deleted. itemUrl: type: string format: uri description: Canonical news.ycombinator.com item URL. required: - id - parentId - childIds - author - createdAt - text - dead - deleted - itemUrl description: A single comment node in the discussion graph. Deleted/dead nodes keep their position with null content fields. description: Comment nodes returned in this page. Reconstruct the tree using rootCommentIds and each node's childIds. page: type: - object - 'null' properties: hasMore: type: boolean description: Whether another page is available. nextCursor: type: - string - 'null' description: Cursor to pass in the next request when more pages exist; null on the last page. required: - hasMore - nextCursor description: Pagination state when lookupStatus is `found`; null otherwise. `hasMore` is true while more comment nodes remain in the traversal. traversal: type: - object - 'null' properties: returnedNodes: type: integer minimum: 0 description: Number of comment nodes returned in this page. discoveredNodes: type: integer minimum: 0 description: Total comment nodes discovered so far across this traversal snapshot. snapshotAt: type: string format: date-time description: ISO-8601 timestamp when this traversal snapshot began (first page). required: - returnedNodes - discoveredNodes - snapshotAt description: Traversal telemetry when lookupStatus is `found`; null otherwise. Continuation uses `page`, not this object. required: - lookupStatus - story - rootCommentIds - comments - page - traversal description: Endpoint-specific response payload. meta: type: object properties: requestId: type: string minLength: 1 description: Unique request identifier for tracing this API call. creditsCharged: type: integer minimum: 0 description: Credits charged for this request. version: type: string enum: - v1 description: Public API version that served the response. cached: type: boolean description: True when served from shared response cache. Credits still apply (full endpoint price); Age header may be present. required: - requestId - creditsCharged - version description: Metadata describing the request and billing outcome. required: - data - meta description: Standard success response envelope. examples: found: value: data: lookupStatus: found story: id: 49044400 title: Corporate America Has Suddenly Decided to Stop Blowing Money on AI author: Alien1Being commentCount: 2 itemUrl: https://news.ycombinator.com/item?id=49044400 rootCommentIds: - 49044487 - 49044464 comments: - id: 49044487 parentId: 49044400 childIds: [] author: k310 createdAt: '2026-07-25T04:19:09.000Z' text: 'Syndicated, no hassle, at MSN. https://www.msn.com/en-us/money/general/corporate-america-ha...' dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=49044487 - id: 49044464 parentId: 49044400 childIds: [] author: polski-g createdAt: '2026-07-25T04:15:26.000Z' text: Openrouter shows it's gone from 5T to 70T tokens per week in the past year. dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=49044464 page: hasMore: false nextCursor: null traversal: returnedNodes: 2 discoveredNodes: 2 snapshotAt: '2026-08-03T17:09:09.041Z' meta: requestId: req_01example_hackernews_comments_found creditsCharged: 3 version: v1 partial: value: data: lookupStatus: found story: id: 49044400 title: Corporate America Has Suddenly Decided to Stop Blowing Money on AI author: Alien1Being commentCount: 2 itemUrl: https://news.ycombinator.com/item?id=49044400 rootCommentIds: - 49044487 - 49044464 comments: - id: 49044487 parentId: 49044400 childIds: [] author: k310 createdAt: '2026-07-25T04:19:09.000Z' text: 'Syndicated, no hassle, at MSN. https://www.msn.com/en-us/money/general/corporate-america-ha...' dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=49044487 page: hasMore: true nextCursor: hnc_01examplePlaygroundCursorToken01 traversal: returnedNodes: 1 discoveredNodes: 2 snapshotAt: '2026-08-03T17:09:09.042Z' meta: requestId: req_01example_hackernews_comments_partial creditsCharged: 3 version: v1 not_found: value: data: lookupStatus: not_found story: null rootCommentIds: [] comments: [] page: null traversal: null meta: requestId: req_01example_hackernews_comments_nf creditsCharged: 3 version: v1 not_story: value: data: lookupStatus: not_story story: null rootCommentIds: [] comments: [] page: null traversal: null meta: requestId: req_01example_hackernews_comments_ns creditsCharged: 3 version: v1 '400': description: Invalid story id, limit, or expired continuation cursor content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - bad_request description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: bad_request message: Example message. requestId: req_01example '401': description: Missing or invalid API key content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - unauthorized description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: unauthorized message: Example message. requestId: req_01example '402': description: Insufficient credits content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - insufficient_credits description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: insufficient_credits message: Example message. requestId: req_01example '500': description: Unexpected or billing error content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - internal_error description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: internal_error message: Example message. requestId: req_01example '502': description: Lookup could not be completed. content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - lookup_failed description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: lookup_failed message: Example message. requestId: req_01example '503': description: Service temporarily unavailable; safe to retry with backoff. headers: Retry-After: description: Seconds to wait before retrying. Present on capacity, deadline, circuit-open, and safe transport outages (bounded 1–120). schema: type: integer minimum: 1 maximum: 120 example: 1 content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - temporarily_unavailable description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: temporarily_unavailable message: Example message. requestId: req_01example operationId: getV1HackernewsStoriesByIdComments x-operation-id-source: derived /v1/hackernews/items/{id}: get: tags: - Hacker News summary: Get a Hacker News item description: Get a Hacker News item by id. security: - ApiKeyAuth: [] - {} x-socialfetch-pricing: version: 1 baseCredits: 1 surcharges: [] maxCredits: 1 normalizationFailureCredits: 0 x-socialfetch-credits-pricing: 1 credit per successful request. parameters: - schema: type: integer maximum: 9007199254740991 description: Hacker News item id. exclusiveMinimum: 0 required: true description: Hacker News item id. name: id in: path responses: '200': description: Item lookup result. content: application/json: schema: type: object properties: data: type: object properties: lookupStatus: type: string enum: - found - not_found description: Whether the item was found or not found. item: type: - object - 'null' properties: id: type: integer description: Unique Hacker News item id. exclusiveMinimum: 0 type: type: string enum: - story - comment - job - poll - pollopt - unknown description: Item type. author: type: - string - 'null' description: Author username when present. createdAt: type: - string - 'null' format: date-time description: Creation time as an ISO-8601 timestamp. title: type: - string - 'null' description: Plain-text title when present. text: type: - string - 'null' description: Plain-text body when present (HTML stripped). url: type: - string - 'null' format: uri description: External URL when present and publicly safe. score: type: - integer - 'null' description: Score / votes when present. commentCount: type: - integer - 'null' description: Total comment count when present (stories/polls). parentId: type: - integer - 'null' description: Parent item id for comments/pollopts. exclusiveMinimum: 0 childIds: type: array items: type: integer exclusiveMinimum: 0 description: Child item ids in ranked display order when present. Some list endpoints omit children and return an empty array. dead: type: boolean description: Whether the item is marked dead. Some list endpoints omit this signal and return false. deleted: type: boolean description: Whether the item is marked deleted. Some list endpoints omit this signal and return false. itemUrl: type: string format: uri description: Canonical news.ycombinator.com item URL. required: - id - type - author - createdAt - title - text - url - score - commentCount - parentId - childIds - dead - deleted - itemUrl description: Item when lookupStatus is `found`; null when `not_found`. required: - lookupStatus - item description: Endpoint-specific response payload. meta: type: object properties: requestId: type: string minLength: 1 description: Unique request identifier for tracing this API call. creditsCharged: type: integer minimum: 0 description: Credits charged for this request. version: type: string enum: - v1 description: Public API version that served the response. cached: type: boolean description: True when served from shared response cache. Credits still apply (full endpoint price); Age header may be present. required: - requestId - creditsCharged - version description: Metadata describing the request and billing outcome. required: - data - meta description: Standard success response envelope. examples: found: value: data: lookupStatus: found item: id: 8863 type: story author: dhouston createdAt: '2007-04-04T19:16:40.000Z' title: 'My YC app: Dropbox - Throw away your USB drive' text: null url: http://www.getdropbox.com/u/2/screencast.html score: 104 commentCount: 71 parentId: null childIds: - 9224 - 8917 - 8884 - 8887 - 8952 - 8869 - 8873 - 8958 - 8940 - 8908 - 9005 - 9671 - 9067 - 9055 - 8865 - 8881 - 8872 - 8955 - 10403 - 8903 - 8928 - 9125 - 8998 - 8901 - 8902 - 8907 - 8894 - 8870 - 8878 - 8980 - 8934 - 8943 - 8876 dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=8863 meta: requestId: req_01example_hackernews_item creditsCharged: 1 version: v1 not_found: value: data: lookupStatus: not_found item: null meta: requestId: req_01example_hackernews_item_nf creditsCharged: 1 version: v1 '400': description: Invalid item id content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - bad_request description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: bad_request message: Example message. requestId: req_01example '401': description: Missing or invalid API key content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - unauthorized description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: unauthorized message: Example message. requestId: req_01example '402': description: Insufficient credits content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - insufficient_credits description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: insufficient_credits message: Example message. requestId: req_01example '500': description: Unexpected or billing error content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - internal_error description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: internal_error message: Example message. requestId: req_01example '502': description: Lookup could not be completed. content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - lookup_failed description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: lookup_failed message: Example message. requestId: req_01example '503': description: Service temporarily unavailable; safe to retry with backoff. headers: Retry-After: description: Seconds to wait before retrying. Present on capacity, deadline, circuit-open, and safe transport outages (bounded 1–120). schema: type: integer minimum: 1 maximum: 120 example: 1 content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - temporarily_unavailable description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: temporarily_unavailable message: Example message. requestId: req_01example operationId: getV1HackernewsItemsById x-operation-id-source: derived /v1/hackernews/comments/{id}/context: get: tags: - Hacker News summary: Get a Hacker News comment with ancestor context description: Get a Hacker News comment with its ancestor chain to the root story. security: - ApiKeyAuth: [] - {} x-socialfetch-pricing: version: 1 baseCredits: 2 surcharges: [] maxCredits: 2 normalizationFailureCredits: 0 x-socialfetch-credits-pricing: 2 credits per successful request. parameters: - schema: type: integer maximum: 9007199254740991 description: Hacker News comment id. exclusiveMinimum: 0 required: true description: Hacker News comment id. name: id in: path responses: '200': description: Comment context result. content: application/json: schema: type: object properties: data: type: object properties: lookupStatus: type: string enum: - found - not_found - not_comment description: Whether the item was found as a comment, was missing, or exists but is not a comment. comment: type: - object - 'null' properties: id: type: integer description: Unique Hacker News item id. exclusiveMinimum: 0 type: type: string enum: - story - comment - job - poll - pollopt - unknown description: Item type. author: type: - string - 'null' description: Author username when present. createdAt: type: - string - 'null' format: date-time description: Creation time as an ISO-8601 timestamp. title: type: - string - 'null' description: Plain-text title when present. text: type: - string - 'null' description: Plain-text body when present (HTML stripped). url: type: - string - 'null' format: uri description: External URL when present and publicly safe. score: type: - integer - 'null' description: Score / votes when present. commentCount: type: - integer - 'null' description: Total comment count when present (stories/polls). parentId: type: - integer - 'null' description: Parent item id for comments/pollopts. exclusiveMinimum: 0 childIds: type: array items: type: integer exclusiveMinimum: 0 description: Child item ids in ranked display order when present. Some list endpoints omit children and return an empty array. dead: type: boolean description: Whether the item is marked dead. Some list endpoints omit this signal and return false. deleted: type: boolean description: Whether the item is marked deleted. Some list endpoints omit this signal and return false. itemUrl: type: string format: uri description: Canonical news.ycombinator.com item URL. required: - id - type - author - createdAt - title - text - url - score - commentCount - parentId - childIds - dead - deleted - itemUrl description: The requested comment when found. ancestors: type: array items: type: object properties: id: type: integer description: Unique Hacker News item id. exclusiveMinimum: 0 type: type: string enum: - story - comment - job - poll - pollopt - unknown description: Item type. author: type: - string - 'null' description: Author username when present. createdAt: type: - string - 'null' format: date-time description: Creation time as an ISO-8601 timestamp. title: type: - string - 'null' description: Plain-text title when present. text: type: - string - 'null' description: Plain-text body when present (HTML stripped). url: type: - string - 'null' format: uri description: External URL when present and publicly safe. score: type: - integer - 'null' description: Score / votes when present. commentCount: type: - integer - 'null' description: Total comment count when present (stories/polls). parentId: type: - integer - 'null' description: Parent item id for comments/pollopts. exclusiveMinimum: 0 childIds: type: array items: type: integer exclusiveMinimum: 0 description: Child item ids in ranked display order when present. Some list endpoints omit children and return an empty array. dead: type: boolean description: Whether the item is marked dead. Some list endpoints omit this signal and return false. deleted: type: boolean description: Whether the item is marked deleted. Some list endpoints omit this signal and return false. itemUrl: type: string format: uri description: Canonical news.ycombinator.com item URL. required: - id - type - author - createdAt - title - text - url - score - commentCount - parentId - childIds - dead - deleted - itemUrl description: Compact Hacker News item (any type). description: Ancestor items from immediate parent up to (but not including) the story, nearest-parent first. story: type: - object - 'null' properties: id: type: integer description: Unique Hacker News item id. exclusiveMinimum: 0 type: type: string enum: - story - comment - job - poll - pollopt - unknown description: Item type. author: type: - string - 'null' description: Author username when present. createdAt: type: - string - 'null' format: date-time description: Creation time as an ISO-8601 timestamp. title: type: - string - 'null' description: Plain-text title when present. text: type: - string - 'null' description: Plain-text body when present (HTML stripped). url: type: - string - 'null' format: uri description: External URL when present and publicly safe. score: type: - integer - 'null' description: Score / votes when present. commentCount: type: - integer - 'null' description: Total comment count when present (stories/polls). parentId: type: - integer - 'null' description: Parent item id for comments/pollopts. exclusiveMinimum: 0 childIds: type: array items: type: integer exclusiveMinimum: 0 description: Child item ids in ranked display order when present. Some list endpoints omit children and return an empty array. dead: type: boolean description: Whether the item is marked dead. Some list endpoints omit this signal and return false. deleted: type: boolean description: Whether the item is marked deleted. Some list endpoints omit this signal and return false. itemUrl: type: string format: uri description: Canonical news.ycombinator.com item URL. required: - id - type - author - createdAt - title - text - url - score - commentCount - parentId - childIds - dead - deleted - itemUrl description: Root story when reachable within the depth cap; otherwise null. required: - lookupStatus - comment - ancestors - story description: Endpoint-specific response payload. meta: type: object properties: requestId: type: string minLength: 1 description: Unique request identifier for tracing this API call. creditsCharged: type: integer minimum: 0 description: Credits charged for this request. version: type: string enum: - v1 description: Public API version that served the response. cached: type: boolean description: True when served from shared response cache. Credits still apply (full endpoint price); Age header may be present. required: - requestId - creditsCharged - version description: Metadata describing the request and billing outcome. required: - data - meta description: Standard success response envelope. example: data: lookupStatus: found comment: id: 9224 type: comment author: sackam createdAt: '2007-04-05T00:32:00.000Z' title: null text: Looks cool url: null score: null commentCount: null parentId: 8863 childIds: - 9272 dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=9224 ancestors: [] story: id: 8863 type: story author: dhouston createdAt: '2007-04-04T19:16:40.000Z' title: 'My YC app: Dropbox - Throw away your USB drive' text: null url: http://www.getdropbox.com/u/2/screencast.html score: 104 commentCount: 71 parentId: null childIds: - 9224 - 8917 - 8884 - 8887 - 8952 - 8869 - 8873 - 8958 - 8940 - 8908 - 9005 - 9671 - 9067 - 9055 - 8865 - 8881 - 8872 - 8955 - 10403 - 8903 - 8928 - 9125 - 8998 - 8901 - 8902 - 8907 - 8894 - 8870 - 8878 - 8980 - 8934 - 8943 - 8876 dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=8863 meta: requestId: req_01example_hackernews_comment_ctx creditsCharged: 2 version: v1 '400': description: Invalid request content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - bad_request description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: bad_request message: Example message. requestId: req_01example '401': description: Missing or invalid API key content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - unauthorized description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: unauthorized message: Example message. requestId: req_01example '402': description: Insufficient credits content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - insufficient_credits description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: insufficient_credits message: Example message. requestId: req_01example '500': description: Unexpected or billing error content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - internal_error description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: internal_error message: Example message. requestId: req_01example '502': description: Lookup could not be completed. content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - lookup_failed description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: lookup_failed message: Example message. requestId: req_01example '503': description: Service temporarily unavailable; safe to retry with backoff. headers: Retry-After: description: Seconds to wait before retrying. Present on capacity, deadline, circuit-open, and safe transport outages (bounded 1–120). schema: type: integer minimum: 1 maximum: 120 example: 1 content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - temporarily_unavailable description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: temporarily_unavailable message: Example message. requestId: req_01example operationId: getV1HackernewsCommentsByIdContext x-operation-id-source: derived /v1/hackernews/users/{username}: get: tags: - Hacker News summary: Get a Hacker News user profile description: Get a Hacker News user profile by username. security: - ApiKeyAuth: [] - {} x-socialfetch-pricing: version: 1 baseCredits: 1 surcharges: [] maxCredits: 1 normalizationFailureCredits: 0 x-socialfetch-credits-pricing: 1 credit per successful request. parameters: - schema: type: string minLength: 1 maxLength: 255 pattern: ^[A-Za-z0-9_-]+$ description: Hacker News username (case-sensitive). required: true description: Hacker News username (case-sensitive). name: username in: path responses: '200': description: Hacker News user profile lookup result. content: application/json: schema: type: object properties: data: type: object properties: lookupStatus: type: string enum: - found - not_found description: Whether the user was found or not found. profile: type: - object - 'null' properties: username: type: string minLength: 1 description: Canonical Hacker News username. createdAt: type: - string - 'null' format: date-time description: Account creation time as an ISO-8601 timestamp. karma: type: - integer - 'null' description: Public karma score when present. about: type: - string - 'null' description: Plain-text about section when present (HTML stripped). profileUrl: type: string format: uri description: Canonical news.ycombinator.com user URL. required: - username - createdAt - karma - about - profileUrl description: Profile when lookupStatus is `found`; null when `not_found`. required: - lookupStatus - profile description: Endpoint-specific response payload. meta: type: object properties: requestId: type: string minLength: 1 description: Unique request identifier for tracing this API call. creditsCharged: type: integer minimum: 0 description: Credits charged for this request. version: type: string enum: - v1 description: Public API version that served the response. cached: type: boolean description: True when served from shared response cache. Credits still apply (full endpoint price); Age header may be present. required: - requestId - creditsCharged - version description: Metadata describing the request and billing outcome. required: - data - meta description: Standard success response envelope. examples: found: value: data: lookupStatus: found profile: username: pg createdAt: '2006-10-09T18:21:32.000Z' karma: 157316 about: Bug fixer. profileUrl: https://news.ycombinator.com/user?id=pg meta: requestId: req_01example_hackernews_user creditsCharged: 1 version: v1 not_found: value: data: lookupStatus: not_found profile: null meta: requestId: req_01example_hackernews_user_nf creditsCharged: 1 version: v1 '400': description: Invalid username content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - bad_request description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: bad_request message: Example message. requestId: req_01example '401': description: Missing or invalid API key content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - unauthorized description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: unauthorized message: Example message. requestId: req_01example '402': description: Insufficient credits content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - insufficient_credits description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: insufficient_credits message: Example message. requestId: req_01example '500': description: Unexpected or billing error content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - internal_error description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: internal_error message: Example message. requestId: req_01example '502': description: Lookup could not be completed. content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - lookup_failed description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: lookup_failed message: Example message. requestId: req_01example '503': description: Service temporarily unavailable; safe to retry with backoff. headers: Retry-After: description: Seconds to wait before retrying. Present on capacity, deadline, circuit-open, and safe transport outages (bounded 1–120). schema: type: integer minimum: 1 maximum: 120 example: 1 content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - temporarily_unavailable description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: temporarily_unavailable message: Example message. requestId: req_01example operationId: getV1HackernewsUsersByUsername x-operation-id-source: derived /v1/hackernews/users/{username}/submissions: get: tags: - Hacker News summary: List a Hacker News user's submissions description: List a Hacker News user's stories, polls, and jobs (newest first). security: - ApiKeyAuth: [] - {} x-socialfetch-pricing: version: 1 baseCredits: 1 surcharges: [] maxCredits: 1 normalizationFailureCredits: 0 x-socialfetch-credits-pricing: 1 credit per successful request. parameters: - schema: type: string minLength: 1 maxLength: 255 pattern: ^[A-Za-z0-9_-]+$ description: Hacker News username (case-sensitive). required: true description: Hacker News username (case-sensitive). name: username in: path - schema: type: - integer - 'null' minimum: 0 maximum: 49 description: Zero-based page index (maximum 50 pages, up to 1,000 hits). required: false description: Zero-based page index (maximum 50 pages, up to 1,000 hits). name: page in: query - schema: type: integer minimum: 1 maximum: 50 description: 'Hits per page (1–50). Default: 20. Prefer this over `pageSize`.' required: false description: 'Hits per page (1–50). Default: 20. Prefer this over `pageSize`.' name: limit in: query responses: '200': description: User submissions page. content: application/json: schema: type: object properties: data: type: object properties: lookupStatus: type: string enum: - found - not_found description: Whether the user was found or not found. user: type: - object - 'null' properties: username: type: string minLength: 1 description: Hacker News username. profileUrl: type: string format: uri description: Canonical news.ycombinator.com user URL. required: - username - profileUrl description: User summary when found; null when not_found. items: type: array items: type: object properties: id: type: integer description: Unique Hacker News item id. exclusiveMinimum: 0 type: type: string enum: - story - comment - job - poll - pollopt - unknown description: Item type. author: type: - string - 'null' description: Author username when present. createdAt: type: - string - 'null' format: date-time description: Creation time as an ISO-8601 timestamp. title: type: - string - 'null' description: Plain-text title when present. text: type: - string - 'null' description: Plain-text body when present (HTML stripped). url: type: - string - 'null' format: uri description: External URL when present and publicly safe. score: type: - integer - 'null' description: Score / votes when present. commentCount: type: - integer - 'null' description: Total comment count when present (stories/polls). parentId: type: - integer - 'null' description: Parent item id for comments/pollopts. exclusiveMinimum: 0 childIds: type: array items: type: integer exclusiveMinimum: 0 description: Child item ids in ranked display order when present. Some list endpoints omit children and return an empty array. dead: type: boolean description: Whether the item is marked dead. Some list endpoints omit this signal and return false. deleted: type: boolean description: Whether the item is marked deleted. Some list endpoints omit this signal and return false. itemUrl: type: string format: uri description: Canonical news.ycombinator.com item URL. required: - id - type - author - createdAt - title - text - url - score - commentCount - parentId - childIds - dead - deleted - itemUrl description: Compact Hacker News item (any type). description: Non-comment submissions (stories, jobs, polls, …) newest-first. page: type: - object - 'null' properties: page: type: integer minimum: 0 description: Zero-based page index. pageSize: type: integer description: Requested hits per page. exclusiveMinimum: 0 returned: type: integer minimum: 0 description: Number of items returned in this page. hasMore: type: boolean description: True when another page is available within the accessible window. nextPage: type: - integer - 'null' minimum: 0 description: Next page index when hasMore is true; otherwise null. required: - page - pageSize - returned - hasMore - nextPage description: Pagination metadata when found; null when not_found. required: - lookupStatus - user - items - page description: Endpoint-specific response payload. meta: type: object properties: requestId: type: string minLength: 1 description: Unique request identifier for tracing this API call. creditsCharged: type: integer minimum: 0 description: Credits charged for this request. version: type: string enum: - v1 description: Public API version that served the response. cached: type: boolean description: True when served from shared response cache. Credits still apply (full endpoint price); Age header may be present. required: - requestId - creditsCharged - version description: Metadata describing the request and billing outcome. required: - data - meta description: Standard success response envelope. examples: found: value: data: lookupStatus: found user: username: jl profileUrl: https://news.ycombinator.com/user?id=jl items: - id: 44074017 type: story author: jl createdAt: '2025-05-23T16:02:02.000Z' title: Find Your People text: null url: https://foundersatwork.posthaven.com/find-your-people score: 806 commentCount: 283 parentId: null childIds: - 44075336 - 44076196 - 44076711 - 44075829 - 44075221 - 44078178 - 44075360 - 44076186 - 44083516 - 44076687 - 44075377 - 44075168 - 44078199 - 44074719 - 44076261 - 44078296 - 44079946 - 44077958 - 44077201 - 44075299 - 44081454 - 44075373 - 44074352 - 44076066 - 44076743 - 44074424 - 44075426 - 44078482 - 44075167 - 44074741 - 44085115 - 44077389 - 44075028 - 44074607 - 44074354 - 44076543 - 44081021 - 44077580 - 44080488 - 44076654 - 44076225 - 44075018 - 44076137 - 44075574 - 44076409 - 44074629 - 44079955 - 44075700 - 44074433 - 44075805 - 44081286 - 44075550 - 44075400 - 44075218 dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=44074017 - id: 35675818 type: story author: jl createdAt: '2023-04-23T12:50:59.000Z' title: Listen to Steve Huffman tell the story of how Reddit got started text: null url: https://pod.link/1677066062/episode/e1eed71375798a8850bbfd90b03256bc score: 141 commentCount: 195 parentId: null childIds: - 35681160 - 35677196 - 35682266 - 35677365 - 35690717 - 35677226 - 35682563 - 35679831 - 35678153 - 35678386 - 35677806 - 35683252 - 35678561 - 35681866 - 35678668 - 35678349 - 35677447 - 35677417 - 35677380 - 35680646 - 35678412 - 35678050 - 35677461 - 35677543 dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=35675818 - id: 19464269 type: story author: jl createdAt: '2019-03-22T16:42:12.000Z' title: 'Women: Learn to Program This Summer' text: null url: http://foundersatwork.posthaven.com/women-learn-to-program-this-summer score: 268 commentCount: 536 parentId: null childIds: - 19464832 - 19465697 - 19465135 - 19464960 - 19465786 - 19465019 - 19464652 - 19466183 - 19470050 - 19465299 - 19465037 - 19467582 - 19466713 - 19466536 - 19467580 - 19465893 - 19466505 - 19464708 - 19465389 - 19467096 - 19466016 - 19465003 - 19465088 - 19469424 - 19468661 - 19468811 - 19475637 - 19471240 - 19468924 - 19465592 - 19469386 - 19466312 - 19467740 - 19466241 - 19466112 - 19465889 - 19467249 - 19475393 - 19465474 - 19465638 - 19466066 - 19466993 - 19465036 - 19467011 - 19467899 - 19465798 - 19466036 - 19465314 - 19465127 - 19465038 - 19467292 - 19464560 dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=19464269 page: page: 0 pageSize: 3 returned: 3 hasMore: true nextPage: 1 meta: requestId: req_01example_hackernews_user_subs creditsCharged: 1 version: v1 not_found: value: data: lookupStatus: not_found user: null items: [] page: null meta: requestId: req_01example_hackernews_user_subs_nf creditsCharged: 1 version: v1 '400': description: Invalid request content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - bad_request description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: bad_request message: Example message. requestId: req_01example '401': description: Missing or invalid API key content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - unauthorized description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: unauthorized message: Example message. requestId: req_01example '402': description: Insufficient credits content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - insufficient_credits description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: insufficient_credits message: Example message. requestId: req_01example '500': description: Unexpected or billing error content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - internal_error description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: internal_error message: Example message. requestId: req_01example '502': description: Lookup could not be completed. content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - lookup_failed description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: lookup_failed message: Example message. requestId: req_01example '503': description: Service temporarily unavailable; safe to retry with backoff. headers: Retry-After: description: Seconds to wait before retrying. Present on capacity, deadline, circuit-open, and safe transport outages (bounded 1–120). schema: type: integer minimum: 1 maximum: 120 example: 1 content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - temporarily_unavailable description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: temporarily_unavailable message: Example message. requestId: req_01example operationId: getV1HackernewsUsersByUsernameSubmissions x-operation-id-source: derived /v1/hackernews/users/{username}/comments: get: tags: - Hacker News summary: List a Hacker News user's comments description: List a Hacker News user's comments (newest first). security: - ApiKeyAuth: [] - {} x-socialfetch-pricing: version: 1 baseCredits: 1 surcharges: [] maxCredits: 1 normalizationFailureCredits: 0 x-socialfetch-credits-pricing: 1 credit per successful request. parameters: - schema: type: string minLength: 1 maxLength: 255 pattern: ^[A-Za-z0-9_-]+$ description: Hacker News username (case-sensitive). required: true description: Hacker News username (case-sensitive). name: username in: path - schema: type: - integer - 'null' minimum: 0 maximum: 49 description: Zero-based page index (maximum 50 pages, up to 1,000 hits). required: false description: Zero-based page index (maximum 50 pages, up to 1,000 hits). name: page in: query - schema: type: integer minimum: 1 maximum: 50 description: 'Hits per page (1–50). Default: 20. Prefer this over `pageSize`.' required: false description: 'Hits per page (1–50). Default: 20. Prefer this over `pageSize`.' name: limit in: query responses: '200': description: User comments page. content: application/json: schema: type: object properties: data: type: object properties: lookupStatus: type: string enum: - found - not_found description: Whether the user was found or not found. user: type: - object - 'null' properties: username: type: string minLength: 1 description: Hacker News username. profileUrl: type: string format: uri description: Canonical news.ycombinator.com user URL. required: - username - profileUrl description: User summary when found; null when not_found. items: type: array items: type: object properties: id: type: integer description: Unique Hacker News item id. exclusiveMinimum: 0 type: type: string enum: - story - comment - job - poll - pollopt - unknown description: Item type. author: type: - string - 'null' description: Author username when present. createdAt: type: - string - 'null' format: date-time description: Creation time as an ISO-8601 timestamp. title: type: - string - 'null' description: Plain-text title when present. text: type: - string - 'null' description: Plain-text body when present (HTML stripped). url: type: - string - 'null' format: uri description: External URL when present and publicly safe. score: type: - integer - 'null' description: Score / votes when present. commentCount: type: - integer - 'null' description: Total comment count when present (stories/polls). parentId: type: - integer - 'null' description: Parent item id for comments/pollopts. exclusiveMinimum: 0 childIds: type: array items: type: integer exclusiveMinimum: 0 description: Child item ids in ranked display order when present. Some list endpoints omit children and return an empty array. dead: type: boolean description: Whether the item is marked dead. Some list endpoints omit this signal and return false. deleted: type: boolean description: Whether the item is marked deleted. Some list endpoints omit this signal and return false. itemUrl: type: string format: uri description: Canonical news.ycombinator.com item URL. required: - id - type - author - createdAt - title - text - url - score - commentCount - parentId - childIds - dead - deleted - itemUrl description: Compact Hacker News item (any type). description: Comment items newest-first. page: type: - object - 'null' properties: page: type: integer minimum: 0 description: Zero-based page index. pageSize: type: integer description: Requested hits per page. exclusiveMinimum: 0 returned: type: integer minimum: 0 description: Number of comments returned in this page. hasMore: type: boolean description: True when another page is available within the accessible window. nextPage: type: - integer - 'null' minimum: 0 description: Next page index when hasMore is true; otherwise null. required: - page - pageSize - returned - hasMore - nextPage description: Pagination metadata when found; null when not_found. required: - lookupStatus - user - items - page description: Endpoint-specific response payload. meta: type: object properties: requestId: type: string minLength: 1 description: Unique request identifier for tracing this API call. creditsCharged: type: integer minimum: 0 description: Credits charged for this request. version: type: string enum: - v1 description: Public API version that served the response. cached: type: boolean description: True when served from shared response cache. Credits still apply (full endpoint price); Age header may be present. required: - requestId - creditsCharged - version description: Metadata describing the request and billing outcome. required: - data - meta description: Standard success response envelope. examples: found: value: data: lookupStatus: found user: username: jl profileUrl: https://news.ycombinator.com/user?id=jl items: - id: 35686379 type: comment author: jl createdAt: '2023-04-24T11:44:01.000Z' title: null text: Joshua, Delicious/popular was mentioned a bunch of times in the podcast as a main inspiration. I'll send you a transcript someday if I can arrange it :) url: null score: null commentCount: null parentId: 35681160 childIds: [] dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=35686379 - id: 25172559 type: comment author: jl createdAt: '2020-11-21T20:34:02.000Z' title: null text: Thanks Breck! url: null score: null commentCount: null parentId: 25172482 childIds: [] dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=25172559 - id: 25172553 type: comment author: jl createdAt: '2020-11-21T20:32:33.000Z' title: null text: '"But remember that making something for yourself is just a heuristic to guide you in finding an idea. In the actual execution, you need to focus on users. You need to understand what they want, and be fanatically dedicated to making them happy." This point aside, I haven''t written anything in 2 years, so it''s possible I''m out of shape :)' url: null score: null commentCount: null parentId: 25172042 childIds: - 25172623 - 25173812 dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=25172553 page: page: 0 pageSize: 3 returned: 3 hasMore: true nextPage: 1 meta: requestId: req_01example_hackernews_user_comments creditsCharged: 1 version: v1 not_found: value: data: lookupStatus: not_found user: null items: [] page: null meta: requestId: req_01example_hackernews_user_comments_nf creditsCharged: 1 version: v1 '400': description: Invalid request content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - bad_request description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: bad_request message: Example message. requestId: req_01example '401': description: Missing or invalid API key content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - unauthorized description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: unauthorized message: Example message. requestId: req_01example '402': description: Insufficient credits content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - insufficient_credits description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: insufficient_credits message: Example message. requestId: req_01example '500': description: Unexpected or billing error content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - internal_error description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: internal_error message: Example message. requestId: req_01example '502': description: Lookup could not be completed. content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - lookup_failed description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: lookup_failed message: Example message. requestId: req_01example '503': description: Service temporarily unavailable; safe to retry with backoff. headers: Retry-After: description: Seconds to wait before retrying. Present on capacity, deadline, circuit-open, and safe transport outages (bounded 1–120). schema: type: integer minimum: 1 maximum: 120 example: 1 content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - temporarily_unavailable description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: temporarily_unavailable message: Example message. requestId: req_01example operationId: getV1HackernewsUsersByUsernameComments x-operation-id-source: derived /v1/hackernews/users/{username}/favorites: get: tags: - Hacker News summary: List a Hacker News user's public favorites description: List favorites for a Hacker News user by username. security: - ApiKeyAuth: [] - {} x-socialfetch-pricing: version: 1 baseCredits: 1 surcharges: [] maxCredits: 1 normalizationFailureCredits: 0 x-socialfetch-credits-pricing: 1 credit per successful request. parameters: - schema: type: string minLength: 1 maxLength: 255 pattern: ^[A-Za-z0-9_-]+$ description: Hacker News username (case-sensitive). required: true description: Hacker News username (case-sensitive). name: username in: path - schema: type: integer minimum: 1 maximum: 100 description: 'One-based HTML favorites page number. Default: 1. Each page bills 1 credit.' required: false description: 'One-based HTML favorites page number. Default: 1. Each page bills 1 credit.' name: page in: query responses: '200': description: Public favorites page. content: application/json: schema: type: object properties: data: type: object properties: lookupStatus: type: string enum: - found - not_found - private_or_unavailable description: Whether public favorites were found, the user/page was missing, or favorites are private/unavailable. user: type: - object - 'null' properties: username: type: string minLength: 1 description: Hacker News username. profileUrl: type: string format: uri description: Canonical news.ycombinator.com user URL. required: - username - profileUrl description: User summary when favorites are public; null for not_found / private_or_unavailable. items: type: array items: type: object properties: id: type: integer description: Unique Hacker News item id. exclusiveMinimum: 0 type: type: string enum: - story - comment - job - poll - pollopt - unknown description: Item type. author: type: - string - 'null' description: Author username when present. createdAt: type: - string - 'null' format: date-time description: Creation time as an ISO-8601 timestamp. title: type: - string - 'null' description: Plain-text title when present. text: type: - string - 'null' description: Plain-text body when present (HTML stripped). url: type: - string - 'null' format: uri description: External URL when present and publicly safe. score: type: - integer - 'null' description: Score / votes when present. commentCount: type: - integer - 'null' description: Total comment count when present (stories/polls). parentId: type: - integer - 'null' description: Parent item id for comments/pollopts. exclusiveMinimum: 0 childIds: type: array items: type: integer exclusiveMinimum: 0 description: Child item ids in ranked display order when present. Some list endpoints omit children and return an empty array. dead: type: boolean description: Whether the item is marked dead. Some list endpoints omit this signal and return false. deleted: type: boolean description: Whether the item is marked deleted. Some list endpoints omit this signal and return false. itemUrl: type: string format: uri description: Canonical news.ycombinator.com item URL. required: - id - type - author - createdAt - title - text - url - score - commentCount - parentId - childIds - dead - deleted - itemUrl description: Compact Hacker News item (any type). description: Favorited items when available. page: type: - object - 'null' properties: page: type: integer description: Requested HTML page number. exclusiveMinimum: 0 returned: type: integer minimum: 0 description: Number of hydrated favorites returned. hasMore: type: boolean description: True when the HTML page indicates another favorites page. nextPage: type: - integer - 'null' description: Next page number when more pages exist; null on the last page. exclusiveMinimum: 0 droppedCount: type: integer minimum: 0 description: Parsed ids that could not be hydrated. required: - page - returned - hasMore - nextPage - droppedCount description: Pagination metadata when found; null otherwise. required: - lookupStatus - user - items - page description: Endpoint-specific response payload. meta: type: object properties: requestId: type: string minLength: 1 description: Unique request identifier for tracing this API call. creditsCharged: type: integer minimum: 0 description: Credits charged for this request. version: type: string enum: - v1 description: Public API version that served the response. cached: type: boolean description: True when served from shared response cache. Credits still apply (full endpoint price); Age header may be present. required: - requestId - creditsCharged - version description: Metadata describing the request and billing outcome. required: - data - meta description: Standard success response envelope. examples: found: value: data: lookupStatus: found user: username: tptacek profileUrl: https://news.ycombinator.com/user?id=tptacek items: - id: 36354213 type: story author: engeljohnb createdAt: '2023-06-16T10:20:46.000Z' title: Lingua Latina per se illustrata (2012) text: null url: https://arltblog.wordpress.com/lingua-latina-per-se-illustrata-hans-orberg/ score: 19 commentCount: 10 parentId: null childIds: - 36370601 - 36370886 - 36370406 - 36375028 - 36370710 - 36370575 - 36370848 dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=36354213 - id: 38859219 type: story author: g0xA52A2A createdAt: '2024-01-03T20:15:40.000Z' title: '30 Years of Decompilation and the Unsolved Structuring Problem: Part 1' text: null url: https://mahaloz.re/dec-history-pt1 score: 83 commentCount: 14 parentId: null childIds: - 38861144 - 38863422 - 38862193 - 38860899 dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=38859219 - id: 32870677 type: story author: ribosometronome createdAt: '2022-09-16T19:11:39.000Z' title: EVGA terminates Nvidia partnership [video] text: null url: https://www.youtube.com/watch?v=cV9QES-FUAM score: 742 commentCount: 479 parentId: null childIds: - 32871062 - 32873217 - 32871207 - 32871312 - 32871527 - 32871441 - 32871220 - 32871186 - 32871522 - 32871072 - 32871326 - 32872040 - 32871591 - 32872536 - 32870967 - 32871071 - 32871091 - 32871208 - 32873410 - 32871094 - 32871494 - 32871562 - 32871444 - 32872019 - 32871097 - 32871600 - 32870976 - 32871931 - 32871358 - 32871888 - 32870969 - 32871958 - 32874068 - 32871620 - 32872838 - 32872421 - 32875687 - 32876381 - 32871785 - 32874948 - 32871095 - 32871957 - 32871253 - 32871590 - 32876182 - 32875072 - 32871262 - 32874389 - 32875407 - 32872301 - 32874074 - 32871975 - 32883556 - 32870963 - 32871226 - 32871552 - 32872472 - 32874154 - 32871582 - 32873861 - 32871827 - 32872026 - 32872531 - 32871425 - 32873875 - 32871087 - 32871483 - 32871480 - 32871344 dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=32870677 - id: 31251974 type: story author: paulpauper createdAt: '2022-05-03T18:48:14.000Z' title: The strange business of hole-in-one insurance text: null url: https://thehustle.co/the-strange-business-of-hole-in-one-insurance/ score: 481 commentCount: 266 parentId: null childIds: - 31253339 - 31252911 - 31252884 - 31252685 - 31253694 - 31253788 - 31252806 - 31256075 - 31254418 - 31254311 - 31253891 - 31253404 - 31255048 - 31252619 - 31254537 - 31252906 - 31258906 - 31252629 - 31252740 - 31254772 - 31260203 - 31255993 - 31254603 - 31255798 - 31253908 - 31254804 - 31254431 - 31254002 - 31254512 - 31256627 - 31252712 - 31252878 - 31257373 - 31255269 - 31256081 - 31254649 dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=31251974 - id: 26539088 type: story author: adriancooney createdAt: '2021-03-22T10:53:06.000Z' title: Groove Pizza text: null url: https://apps.musedlab.org/groovepizza/ score: 399 commentCount: 33 parentId: null childIds: - 26563624 - 26561822 - 26561805 - 26561644 - 26562496 - 26565246 - 26563835 - 26569575 - 26561539 - 26561881 - 26566769 - 26562082 - 26562142 - 26563435 - 26567606 - 26561575 - 26562197 - 26564160 - 26565570 - 26562414 - 26563846 - 26561659 dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=26539088 - id: 25672461 type: story author: jaredwiener createdAt: '2021-01-07T15:58:29.000Z' title: Facebook Indefinitely Suspends Trump text: null url: https://www.facebook.com/4/posts/10112681480907401/ score: 953 commentCount: 1293 parentId: null childIds: - 25673099 - 25673860 - 25672690 - 25672884 - 25673768 - 25673013 - 25672666 - 25674844 - 25672595 - 25672610 - 25676130 - 25672862 - 25672752 - 25672584 - 25673134 - 25673842 - 25672970 - 25672691 - 25674271 - 25681482 - 25673607 - 25676221 - 25673077 - 25674182 - 25672943 - 25673103 - 25673296 - 25676004 - 25676302 - 25673395 - 25675662 - 25677642 - 25672638 - 25673028 - 25673269 - 25673901 - 25672593 - 25675542 - 25675066 - 25679497 - 25673874 - 25675418 - 25672939 - 25679694 - 25678813 - 25672577 - 25673514 - 25673685 - 25672645 - 25673571 - 25673325 - 25673996 - 25672624 - 25674035 - 25674064 - 25673147 - 25673060 - 25673676 - 25679567 - 25675313 - 25673033 - 25674982 - 25673128 - 25673071 - 25672763 - 25673568 - 25673003 - 25673083 - 25673811 - 25673574 - 25675061 - 25672877 - 25672737 - 25674660 - 25673597 - 25674127 - 25675382 - 25672783 - 25677380 - 25672958 - 25672635 - 25673061 - 25672582 - 25672986 - 25673376 - 25673420 - 25672580 - 25676542 - 25680638 - 25673934 - 25672795 - 25672834 - 25672728 - 25672687 - 25673492 - 25673049 - 25672988 - 25672616 - 25672618 - 25675884 - 25673783 - 25672599 - 25673088 - 25672665 - 25673459 - 25672708 - 25673714 - 25672755 - 25672589 - 25672995 - 25673179 - 25673081 - 25673027 - 25672613 - 25672588 - 25674992 - 25676772 - 25672698 - 25673007 - 25672889 - 25673206 - 25672623 - 25672966 - 25672780 - 25673552 dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=25672461 - id: 18302349 type: story author: untog createdAt: '2018-10-25T16:53:00.000Z' title: Google paid Andy Rubin $90M while keeping silent about a misconduct claim text: null url: https://www.nytimes.com/2018/10/25/technology/google-sexual-harassment-andy-rubin.html score: 819 commentCount: 535 parentId: null childIds: - 18303439 - 18302550 - 18304997 - 18302807 - 18303315 - 18304973 - 18303114 - 18302673 - 18304426 - 18302558 - 18303484 - 18302382 - 18304561 - 18303612 - 18305908 - 18304299 - 18302512 - 18304766 - 18304928 - 18304542 - 18305475 - 18303373 - 18303196 - 18303910 - 18303043 - 18303280 - 18303088 - 18308246 - 18303921 - 18303286 - 18304303 - 18303857 - 18303571 - 18307892 - 18304611 - 18307609 - 18304347 - 18304621 - 18306697 - 18307404 - 18306472 - 18304508 - 18309644 - 18305949 - 18302541 - 18307006 - 18302525 - 18303207 - 18302592 - 18303572 - 18303084 - 18302472 - 18302899 - 18302594 - 18302411 - 18306230 - 18304547 - 18302972 dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=18302349 - id: 13292528 type: story author: codeful createdAt: '2016-12-31T19:01:24.000Z' title: High-quality ordered math videos from ground up text: null url: https://www.youtube.com/channel/UCoHhuummRZaIVX7bD4t2czg score: 93 commentCount: 7 parentId: null childIds: - 13293100 - 13293444 - 13294176 dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=13292528 - id: 639976 type: story author: dfranke createdAt: '2009-06-03T16:27:07.000Z' title: How I Hacked Hacker News (with arc security advisory) text: "[Condensed version of this narrative: the news.yc code, prior to the\nthe release of arc3, contains a remotely-exploitable vulnerability\npermitting account theft. Anyone running a news installation who has\nnot yet upgraded to arc3 should do so.]\nHacker News login cookies are random eight-character strings, stored\nserver-side in a hash table mapping them to user names. I discovered\na few weeks ago that these strings were rather less random than they\nwere meant to be, and, through a delightful combination of exploits,\ncould be predicted, enabling an attacker to steal accounts.\nHere's the rand-string function from arc.arc, version 2. It gets\ncalled with n=8 to generate login cookies, and n=10 for the \"fnids\"\nthat get used all over the site as hash keys identifying closures.\n (def rand-string (n)\n (with (cap (fn () (+ 65 (rand 26)))\n sm (fn () (+ 97 (rand 26)))\n dig (fn () (+ 48 (rand 10))))\n (coerce (map [coerce _ 'char]\n (cons (rand-choice (cap) (sm))\n (n-of (- n 1) (rand-choice (cap) (sm) (dig)))))\n 'string)))\n\nThe first thing you might notice about this function is that not all\ncharacters are equally probable. Each digit has a 1/30 chance of\noccuring, while each letter has a 1/78 chance. This alone is no big\ndeal: this distribution means that each character carries 5.826 bits\nof entropy, versus the 5.954 that a uniform distribution would\nprovide. So for an eight-character string, this bug reduces the\neffective keyspace by just over a factor of two -- not enough to have\nany practical implications.\nThe 'rand' function is an arc primitive, bound directly to mzscheme's\n'random':\n ; need to use a better seed\n (xdef 'rand random)\n\nThe comment seen here is prescient, as we'll see.\nThis is the C function which implements mzscheme's 'random' function:\n static long sch_int_rand(long n, Scheme_Random_State *rs)\n {\n double x, q, qn, xq;\n\n /* generate result in {0..n-1} using the rejection method */\n q = (double)( (unsigned long)(m1 / (double)n) );\n qn = q * n;\n do {\n x = mrg32k3a(rs);\n } while (x >= qn);\n xq = x / q;\n\n /* return result */\n return (long)xq;\n }\n\nWhere mrg32k3a() is:\n static double mrg32k3a(Scheme_Random_State *s) { /*(double), in {0..m1-1}*/\n double x10, x20, y;\n long k10, k20;\n\n /* component 1 */\n x10 = a12*(s->x11) - a13n*(s->x12);\n k10 = (long)(x10 / m1);\n x10 -= k10 * m1;\n if (x10 < 0.0)\n x10 += m1;\n s->x12 = s->x11;\n s->x11 = s->x10;\n s->x10 = x10;\n\n /* component 2 */\n x20 = a21*(s->x20) - a23n*(s->x22);\n k20 = (long)(x20 / m2);\n x20 -= k20 * m2;\n if (x20 < 0.0)\n x20 += m2;\n s->x22 = s->x21;\n s->x21 = s->x20;\n s->x20 = x20;\n\n /* combination of component */\n y = x10 - x20;\n if (y < 0.0)\n y += m1;\n return y;\n }\n\nThis, obviously, is not a cryptographically strong PRNG. Is it possible\nthat we could break it, computing its internal state by seeing a few\nconsecutively-generated rand-strings? Probably: it looks as though it\ncould be represented as the solution to a manageable system of diophantine\nequations. That, though, was more math than I felt like doing, so I went\nlooking for an easier approach.\nWhere does the RNG seed come from? Ah ha:\n rs = scheme_make_random_state(scheme_get_milliseconds());\n\nWhere scheme_get_milliseconds is defined, after eliding some\npreprocessor cruft, as:\n long scheme_get_milliseconds(void)\n {\n struct timeb now;\n ftime(&now);\n return now.time * 1000 + now.millitm;\n }\n\nIn other words, the random seed is merely the number of milliseconds\nsince epoch at the time the seed function was called.\nThe part of mzscheme that calls the seed function is a bit daunting:\nit appears that in some cases, the PRNG state can be thread-local and\nbe initialized when the thread is spawned. However, instrumenting\nsch_int_rand() with some debug output showed that in arc, the same\nstate vector gets used everywhere, and is initialized when the\nmzscheme runtime starts up.\nThe millisecond at which news.yc last started is not an immediately\nsimple thing to determine, though it was at least easy to verify the\nsanity of the system clock, thanks to an open NTP serevr:\n dfranke@feanor:~$ sudo ntpdate -q news.ycombinator.com\n server 174.132.225.106, stratum 2, offset 0.370866, delay 0.08228\n 17 May 01:45:13 ntpdate[27901]: adjust time server 174.132.225.106 offset 0.370866 sec\n\nSo for a start, I thought, perhaps I could determine the server's\nstart time to within a few seconds or minutes. A boring way to go\nabout this would be simply to monitor the server for downtime, and\nrecord when it became accessible again. But impatience is one of the\nthree great programmer's virtues, and the best way to predict the future\nis to create it, and so forth, so I decided on a more proactive\napproach: crash it!\nA couple months ago, PG left this comment after news.yc recovered from\nsome downtime:\n HN was down today for around 2 hours. Sorry about that.\n\n The News server currently crashes a couple times a day when it runs\n out of memory. All the comments and stories no longer fit in the 2 GB\n we can get on a 32 bit machine. We'd been planning to upgrade to a new\n 64 bit server. In the meantime it was arguably a rather slow form of\n GC.\n\n Unfortunately the process somehow got wedged in the middle of\n segfaulting. We're not sure why and will probably never know. But that\n meant the process that usually notices when News is wedged and\n restarts it was unable to kill it.\n\n(The server had since been upgraded, so these crashes are/were no longer\nhappening.)\nI figured that the watchdog works by requesting a page and checking to\nmake sure it gets a response, and that if it doesn't get one, then it\nassumes the server is wedged and restarts it.\nHere's arc2's top-level request handler:\n (= srvthreads* nil threadlimit* 50 threadlife* 30)\n\n ; Could auto-throttle ips, e.g. if one has more than x% of recent requests.\n (= requests* 0 requests/ip* (table) throttle-ips* (table) throttle-time* 30)\n\n (def handle-request (s (o life threadlife*))\n (if (len< (pull dead srvthreads*) threadlimit*)\n (let (i o ip) (socket-accept s)\n (++ requests*)\n (= (requests/ip* ip) (+ 1 (or (requests/ip* ip) 0)))\n (let th (thread\n (if (throttle-ips* ip) (sleep (rand throttle-time*)))\n (handle-request-thread i o ip))\n (push th srvthreads*)\n (thread (sleep life)\n (unless (dead th) (prn \"srv thread took too long\"))\n (break-thread th)\n (close i o))))\n (sleep .2)))\n\nSo, there's a limit of 50 concurrent threads, and threads are killed\nafter 30 seconds if they haven't already terminated. So if I were to\nhold open 50 concurrent connections, and the watchdog were to run during\nthe following 30 seconds, then the server ought to restart.\nThe watchdog code has not been released, so rather than soil my hat\ncolor by DoSing the production server, I decided to continue hacking\non my local install on the assumption that I had the ability to\ndetermine the server's start time to within one minute.\nSo, a one-minute interval is 60,000 possible PRNG seeds. If I kept\npolling to see when the server came back up after the watchdog killed\nit, then let's very conservatively assume that I could be among the\nfirst 50 people to issue an HTTP request. Each page that comes back\nfrom the server typically contains 2-3 fnids, so the reply I got would\ncontain some from among first few hundred to be generated, and thus\nfrom among the first few thousand iterations of of the PRNG.\nThis leaves determination of the PRNG seed comfortably within the\nreach of brute force: run the PRNG for 10,000 iterations for each of\nthe 60,000 possible seeds, and see which one produces the fnids I saw\nin response to my request. I wrote a program that does just this:\n http://dfranke.us/hacknews.c\n\nSo now I was able to determine PRNG seeds, but I couldn't conclude my\nadventure quite yet. Since logging into news.yc is an uncommon\noperation compared to simply browsing around, only a tiny fraction of\nrand-strings that the server generates correspond to login cookies.\nFurthermore, since fnids and login cookies have different lengths, and\nsince the PRNG gets called for a few other purposes at unpredictable\ntimes, every individual PRNG iteration begins a candidate login\ncookie. That's 40 or more false candidates produced for every page\nview.\nNonetheless, online brute force would still be manageable. If each\npage view produces an average of 50 candidates, and one in every\nthousand page views is a login (this might be slightly optimistic),\nthat's 50,000 attempts necessary in order to find a working login. HN\ngets about 500,000 hits on a busy day, so this could be done in a day\nor two while likely staying under the radar.\nA marginally more efficient approach would be a bit of social engineering:\n1. Request a page. Find a generated fnid from the page source and\nlook it up in our candidate list. Call this A.\n2.\n ERC> /join #startups\n Hey guys, I haven't been able to log in to news.yc\n since the server restarted a little while ago. Anyone\n else having problems?\n dfranke: Works for me.\n Hmm, weird. I'll just try again later I guess.\n3. Request another page, note the fnid, find it in the candidate\nlist. Call this B.\nStep 4: Test the cookies that fall between A and B.\nIf this conversation takes one minute, then this reduces the search to\nabout 17,500 attempts -- less than a day's worth at a modest rate of\nquerying -- and possibly picks up multiple accounts in the process.\nEpilogue:\nI sent PG a draft of this post. RTM and I wrote a better implementation\nof rand-string which reads from /dev/urandom and obeys a proper uniform\ndistribution. This new version appears in arc3:\n (def rand-string (n)\n (let c \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n (with (nc 62 s (newstring n) i 0)\n (w/infile str \"/dev/urandom\"\n (while (< i n)\n (let x (readb str)\n (unless (> x 247)\n (= (s i) (c (mod x nc)))\n (++ i)))))\n s)))\n\nPG removed the 50-thread concurrency limit and replaced it with a\nper-IP rate limiter, so the DoS attack described here should no longer\nwork." url: null score: 928 commentCount: 78 parentId: null childIds: - 640026 - 640017 - 640021 - 640213 - 640372 - 640004 - 640302 - 639979 - 640284 - 640094 - 640299 - 640099 - 640006 - 642481 - 640019 - 640009 - 640329 - 640007 - 640151 - 642029 - 641299 - 640121 - 640961 - 640399 - 640038 - 640237 - 641144 dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=639976 - id: 12396883 type: story author: shubhamjain createdAt: '2016-08-31T08:46:53.000Z' title: 'Ask HN: How are credentials managed at your company?' text: 'Access to servers, SaaS apps, crucial infrastructure software. There are tons of things that need to be accessed by people in the organisation. Although, in many cases, there is an option to create new users but sometimes it''s not and often, creating new users is more of a hassle every time someone needs access. How does your company deal with giving and managing access?' url: null score: 138 commentCount: 93 parentId: null childIds: - 12397212 - 12397133 - 12396992 - 12397526 - 12397225 - 12397026 - 12397368 - 12398078 - 12397817 - 12397071 - 12397536 - 12398074 - 12398109 - 12398636 - 12397453 - 12398194 - 12398215 - 12398014 - 12398145 - 12402994 - 12397823 - 12397422 - 12397061 - 12397980 - 12397448 - 12397736 - 12399624 - 12397463 - 12397426 - 12396896 - 12396917 - 12398641 - 12397135 - 12398397 - 12397859 - 12400212 - 12398206 - 12397088 - 12397158 - 12397474 - 12397169 - 12397846 dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=12396883 - id: 12094882 type: story author: goshakkk createdAt: '2016-07-14T15:56:36.000Z' title: Making custom renderers for React text: null url: http://goshakkk.name/react-custom-renderers/ score: 61 commentCount: 5 parentId: null childIds: - 12098270 - 12096617 - 12097279 dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=12094882 - id: 12089022 type: story author: coloneltcb createdAt: '2016-07-13T19:37:47.000Z' title: On Being a Black Man text: null url: https://blog.devcolor.org/on-being-a-black-man-42ecb7946fe0#.fe75utkuy score: 370 commentCount: 310 parentId: null childIds: - 12089935 - 12089847 - 12090351 - 12089885 - 12089954 - 12090214 - 12089906 - 12090036 - 12090421 - 12090043 - 12090705 - 12090280 - 12089931 - 12090297 - 12089868 - 12090636 - 12091373 - 12090729 - 12090276 - 12089441 - 12090176 - 12090682 - 12090399 - 12090347 - 12090287 - 12090028 - 12091582 - 12090193 - 12090553 - 12091650 - 12090215 - 12090844 - 12090013 - 12093728 - 12089856 - 12090530 - 12091016 - 12090416 - 12090181 - 12090890 - 12089950 - 12089992 - 12090805 - 12090192 - 12089894 - 12090518 - 12090383 - 12090026 - 12090262 dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=12089022 - id: 12030097 type: story author: hiq createdAt: '2016-07-04T11:34:09.000Z' title: African American Vernacular English Is Not Standard English with Mistakes (1999) [pdf] text: null url: https://web.stanford.edu/~zwicky/aave-is-not-se-with-mistakes.pdf score: 156 commentCount: 249 parentId: null childIds: - 12031992 - 12030577 - 12030334 - 12030516 - 12032389 - 12032818 - 12030645 - 12030234 - 12030274 - 12030443 - 12030226 - 12030844 - 12032243 - 12030467 - 12030560 - 12030360 - 12030401 - 12030858 dead: false deleted: false itemUrl: https://news.ycombinator.com/item?id=12030097 page: page: 1 returned: 13 hasMore: false nextPage: null droppedCount: 0 meta: requestId: req_01example_hackernews_favorites creditsCharged: 1 version: v1 private_or_unavailable: value: data: lookupStatus: private_or_unavailable user: null items: [] page: null meta: requestId: req_01example_hackernews_favorites_private creditsCharged: 1 version: v1 '400': description: Invalid request content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - bad_request description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: bad_request message: Example message. requestId: req_01example '401': description: Missing or invalid API key content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - unauthorized description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: unauthorized message: Example message. requestId: req_01example '402': description: Insufficient credits content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - insufficient_credits description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: insufficient_credits message: Example message. requestId: req_01example '500': description: Unexpected or billing error content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - internal_error description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: internal_error message: Example message. requestId: req_01example '502': description: Lookup could not be completed. content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - lookup_failed description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: lookup_failed message: Example message. requestId: req_01example '503': description: Service temporarily unavailable; safe to retry with backoff. headers: Retry-After: description: Seconds to wait before retrying. Present on capacity, deadline, circuit-open, and safe transport outages (bounded 1–120). schema: type: integer minimum: 1 maximum: 120 example: 1 content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - temporarily_unavailable description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: temporarily_unavailable message: Example message. requestId: req_01example operationId: getV1HackernewsUsersByUsernameFavorites x-operation-id-source: derived /v1/hackernews/jobs/who-is-hiring: get: tags: - Hacker News summary: List structured Who is Hiring jobs description: List top-level jobs from the monthly Hacker News Who is Hiring thread (latest thread, or a YYYY-MM month). security: - ApiKeyAuth: [] - {} x-socialfetch-pricing: version: 1 baseCredits: 1 surcharges: [] maxCredits: 1 normalizationFailureCredits: 0 x-socialfetch-credits-pricing: 1 credit per successful request. parameters: - schema: type: string pattern: ^\d{4}-(0[1-9]|1[0-2])$ description: 'Calendar month (YYYY-MM) to pin a Who is Hiring thread. Default: latest thread.' required: false description: 'Calendar month (YYYY-MM) to pin a Who is Hiring thread. Default: latest thread.' name: month in: query - schema: type: - integer - 'null' minimum: 0 maximum: 49 description: Zero-based page index of top-level hiring comments. required: false description: Zero-based page index of top-level hiring comments. name: page in: query - schema: type: integer minimum: 1 maximum: 50 description: 'Job rows per page (1–50). Default: 20. Prefer this over `pageSize`.' required: false description: 'Job rows per page (1–50). Default: 20. Prefer this over `pageSize`.' name: limit in: query responses: '200': description: Structured Who is Hiring page. content: application/json: schema: type: object properties: data: type: object properties: lookupStatus: type: string enum: - found - not_found description: Whether a matching Who is Hiring thread was found. thread: type: - object - 'null' properties: id: type: integer description: Story id of the hiring thread. exclusiveMinimum: 0 title: type: - string - 'null' description: Thread title. createdAt: type: - string - 'null' format: date-time description: Thread creation time. itemUrl: type: string format: uri description: Canonical news.ycombinator.com item URL. required: - id - title - createdAt - itemUrl description: Thread summary when found. items: type: array items: type: object properties: commentId: type: integer description: Hiring comment id. exclusiveMinimum: 0 author: type: - string - 'null' description: Comment author username. createdAt: type: - string - 'null' format: date-time description: Comment creation time. text: type: - string - 'null' description: Full plain-text hiring comment (HTML stripped). company: type: - string - 'null' description: Best-effort company name parse; null when unknown. role: type: - string - 'null' description: Best-effort role/title parse; null when unknown. location: type: - string - 'null' description: Best-effort location parse; null when unknown. remote: type: - boolean - 'null' description: Best-effort remote signal; null when unknown. salary: type: - string - 'null' description: Best-effort salary snippet; null when unknown. visa: type: - boolean - 'null' description: Best-effort visa sponsorship signal; null when unknown. contact: type: - string - 'null' description: Best-effort contact snippet; null when unknown. itemUrl: type: string format: uri description: Canonical news.ycombinator.com item URL. required: - commentId - author - createdAt - text - company - role - location - remote - salary - visa - contact - itemUrl description: Structured hiring row. Structured fields are best-effort; `text` is always the source of truth. description: Top-level hiring comments as structured rows. page: type: - object - 'null' properties: page: type: integer minimum: 0 description: Zero-based page index. pageSize: type: integer description: Requested job rows per page. exclusiveMinimum: 0 returned: type: integer minimum: 0 description: Number of job rows returned in this page. hasMore: type: boolean description: True when another page is available within the accessible window. nextPage: type: - integer - 'null' minimum: 0 description: Next page index when hasMore is true; otherwise null. required: - page - pageSize - returned - hasMore - nextPage description: Pagination metadata when found. required: - lookupStatus - thread - items - page description: Endpoint-specific response payload. meta: type: object properties: requestId: type: string minLength: 1 description: Unique request identifier for tracing this API call. creditsCharged: type: integer minimum: 0 description: Credits charged for this request. version: type: string enum: - v1 description: Public API version that served the response. cached: type: boolean description: True when served from shared response cache. Credits still apply (full endpoint price); Age header may be present. required: - requestId - creditsCharged - version description: Metadata describing the request and billing outcome. required: - data - meta description: Standard success response envelope. example: data: lookupStatus: found thread: id: 48747976 title: 'Ask HN: Who is hiring? (July 2026)' createdAt: '2026-07-01T15:01:21.000Z' itemUrl: https://news.ycombinator.com/item?id=48747976 items: - commentId: 48919859 author: baaaadegg createdAt: '2026-07-15T12:32:31.000Z' text: 'Founding Technologist + Full Stack Developer | REMOTE | Part-or-full-time | $0 + equity Looking for a founding dev for an early wellness and spirituality project. Product focus is on video streaming, audio quality, data privacy, and global payments. A working MVP is live on web, Android, and iOS. Stack includes: Next.js/React Native, Tailwind, TypeScript, Agora RTC, and Firebase. We''re two non-YC entrepreneurs with experience in blockchain, education, hospitality, and service-based businesses. We hope to find someone who shares an interest in developing their wellness and spirituality practice. The aim is to keep the team small and development tight, as the product goals are clearly defined. Please reach out over email if you have the capacity to learn more! -Andrew, -Michal hataginow@gmail.com' company: null role: Founding Technologist + Full Stack Developer location: null remote: true salary: $0 + equity visa: null contact: hataginow@gmail.com itemUrl: https://news.ycombinator.com/item?id=48919859 - commentId: 48915735 author: bnhan2710 createdAt: '2026-07-15T03:02:35.000Z' text: 'Portless | AI Engineer | Remote (North America) | $180k-$230k | Full-time We''re a company doing real operational work in e-commerce/3PL logistics. AI usage internally is still basic — decks, spreadsheets, a few people vibe-coding dashboards. No real agentic workflows in production yet. That''s what this role is for. You''d be the first dedicated AI engineer here. Two things at once: ship agentic workflows that replace real manual work, and build the underlying platform (APIs, MCP tools, docs) so other teams can build their own instead of asking you for everything forever. First project: an agent that reads an inbound invoice question, pulls the correct (often complex) invoice, and drafts a context-aware reply a teammate can review and send. Currently ~1 hour of manual work, target is ~30 seconds. What we need: 3+ years SWE, 1-2+ of which building production AI systems (not prototypes) 10+ agentic/LLM workflows shipped end-to-end — not toy demos Evidence you''ve built infra/tools for other people to use, not just yourself Strong Python and/or TypeScript Some background in e-commerce, 3PL, logistics, or comparable B2B ops Nice to have: RAG, vector DBs, multi-step orchestration, eval frameworks, heavy Cursor/Claude Code/Copilot usage. Fully remote, direct access to leadership, real scope to define how AI gets built here rather than inheriting someone else''s stack. Full JD + Apply: https://uctalent.io/referral/Huynh_Nhu_Bao_Nhan221138/DNwhgw...' company: Portless role: AI Engineer location: Remote (North America) remote: true salary: $180k-$230k visa: null contact: null itemUrl: https://news.ycombinator.com/item?id=48915735 - commentId: 48915341 author: bao0721 createdAt: '2026-07-15T01:56:12.000Z' text: 'Engineering Manager | Remote (North America) | $180k-$230k Team grew fast and organically — lots of talented engineers, no shared process yet. This role turns that into a scalable, high-throughput org. Reports to VP of Eng (who owns architecture/vision); you own execution, delivery, and people for ~10 distributed engineers (US/Canada/EU/UK/China). ~90% people management, not player-coach. You''ll own sprint commitments and release cycles, run 1:1s and coaching, remove cross-team roadblocks, own incident response and on-call, and track/improve DORA metrics. Also expected to hold a high bar — direct conversations on underperformance, PIP-first, exit if needed — while keeping the culture kind and caring. Need: 2+ yrs directly managing ~10-person eng teams, distributed/async experience, strong enough technically to run code reviews and push back on estimates (not coding day-to-day), track record raising delivery throughput at a high-growth company. Nice to have: big-company process background (Google/Meta/Salesforce-style) mixed with startup speed, and logistics/supply chain/e-commerce domain exposure. Must overlap ~6 hrs with US Eastern (9am-4pm ET). Full JD + Apply: https://uctalent.io/referral/Huynh_Nhu_Bao_Nhan221138/vEYXJQ...' company: null role: Engineering Manager location: Remote (North America) remote: true salary: $180k-$230k visa: null contact: null itemUrl: https://news.ycombinator.com/item?id=48915341 page: page: 0 pageSize: 3 returned: 3 hasMore: true nextPage: 1 meta: requestId: req_01example_hackernews_whoishiring creditsCharged: 1 version: v1 '400': description: Invalid request content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - bad_request description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: bad_request message: Example message. requestId: req_01example '401': description: Missing or invalid API key content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - unauthorized description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: unauthorized message: Example message. requestId: req_01example '402': description: Insufficient credits content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - insufficient_credits description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: insufficient_credits message: Example message. requestId: req_01example '500': description: Unexpected or billing error content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - internal_error description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: internal_error message: Example message. requestId: req_01example '502': description: Lookup could not be completed. content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - lookup_failed description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: lookup_failed message: Example message. requestId: req_01example '503': description: Service temporarily unavailable; safe to retry with backoff. headers: Retry-After: description: Seconds to wait before retrying. Present on capacity, deadline, circuit-open, and safe transport outages (bounded 1–120). schema: type: integer minimum: 1 maximum: 120 example: 1 content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - temporarily_unavailable description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: temporarily_unavailable message: Example message. requestId: req_01example operationId: getV1HackernewsJobsWhoIsHiring x-operation-id-source: derived /v1/hackernews/updates: get: tags: - Hacker News summary: Get recently changed Hacker News items and users description: Get recently changed Hacker News item ids and usernames. security: - ApiKeyAuth: [] - {} x-socialfetch-pricing: version: 1 baseCredits: 1 surcharges: [] maxCredits: 1 normalizationFailureCredits: 0 x-socialfetch-credits-pricing: 1 credit per successful request. responses: '200': description: Changed item ids and usernames. content: application/json: schema: type: object properties: data: type: object properties: changedItemIds: type: array items: type: integer exclusiveMinimum: 0 description: Recently changed item ids. changedUsernames: type: array items: type: string minLength: 1 description: Recently changed profile usernames. fetchedAt: type: string format: date-time description: ISO-8601 timestamp when this snapshot was fetched. required: - changedItemIds - changedUsernames - fetchedAt description: Endpoint-specific response payload. meta: type: object properties: requestId: type: string minLength: 1 description: Unique request identifier for tracing this API call. creditsCharged: type: integer minimum: 0 description: Credits charged for this request. version: type: string enum: - v1 description: Public API version that served the response. cached: type: boolean description: True when served from shared response cache. Credits still apply (full endpoint price); Age header may be present. required: - requestId - creditsCharged - version description: Metadata describing the request and billing outcome. required: - data - meta description: Standard success response envelope. example: data: changedItemIds: - 49044616 - 49036706 - 49044375 - 49044648 - 49044631 - 49028101 - 49041878 - 49040323 - 49036809 - 49033527 - 49043798 - 49044602 - 49044636 - 49044652 - 49033719 - 49044547 - 49040913 - 49040154 - 49038409 - 49022035 - 49039395 - 49033099 - 49044074 - 49043724 - 49040296 - 49022284 - 49026933 - 49026482 - 49033240 - 49020751 - 49035314 - 49033004 - 49036433 - 49035303 - 49034217 - 49033110 - 49044027 - 49036765 - 49017265 - 49021006 changedUsernames: - qntmfred - frameset - tastyfreeze - spaceman_2020 - free_bip - tedggh fetchedAt: '2026-07-25T04:56:38.946Z' meta: requestId: req_01example_hackernews_updates creditsCharged: 1 version: v1 '400': description: Invalid request content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - bad_request description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: bad_request message: Example message. requestId: req_01example '401': description: Missing or invalid API key content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - unauthorized description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: unauthorized message: Example message. requestId: req_01example '402': description: Insufficient credits content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - insufficient_credits description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: insufficient_credits message: Example message. requestId: req_01example '500': description: Unexpected or billing error content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - internal_error description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: internal_error message: Example message. requestId: req_01example '502': description: Lookup could not be completed. content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - lookup_failed description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: lookup_failed message: Example message. requestId: req_01example '503': description: Service temporarily unavailable; safe to retry with backoff. headers: Retry-After: description: Seconds to wait before retrying. Present on capacity, deadline, circuit-open, and safe transport outages (bounded 1–120). schema: type: integer minimum: 1 maximum: 120 example: 1 content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - temporarily_unavailable description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: temporarily_unavailable message: Example message. requestId: req_01example operationId: getV1HackernewsUpdates x-operation-id-source: derived /v1/hackernews/maxitem: get: tags: - Hacker News summary: Get the current max Hacker News item id description: Get the current largest Hacker News item id. security: - ApiKeyAuth: [] - {} x-socialfetch-pricing: version: 1 baseCredits: 1 surcharges: [] maxCredits: 1 normalizationFailureCredits: 0 x-socialfetch-credits-pricing: 1 credit per successful request. responses: '200': description: Current max item id. content: application/json: schema: type: object properties: data: type: object properties: maxItemId: type: integer description: Current largest Hacker News item id. exclusiveMinimum: 0 fetchedAt: type: string format: date-time description: ISO-8601 timestamp when this value was fetched. required: - maxItemId - fetchedAt description: Endpoint-specific response payload. meta: type: object properties: requestId: type: string minLength: 1 description: Unique request identifier for tracing this API call. creditsCharged: type: integer minimum: 0 description: Credits charged for this request. version: type: string enum: - v1 description: Public API version that served the response. cached: type: boolean description: True when served from shared response cache. Credits still apply (full endpoint price); Age header may be present. required: - requestId - creditsCharged - version description: Metadata describing the request and billing outcome. required: - data - meta description: Standard success response envelope. example: data: maxItemId: 49044652 fetchedAt: '2026-07-25T04:56:38.406Z' meta: requestId: req_01example_hackernews_maxitem creditsCharged: 1 version: v1 '400': description: Invalid request content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - bad_request description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: bad_request message: Example message. requestId: req_01example '401': description: Missing or invalid API key content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - unauthorized description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: unauthorized message: Example message. requestId: req_01example '402': description: Insufficient credits content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - insufficient_credits description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: insufficient_credits message: Example message. requestId: req_01example '500': description: Unexpected or billing error content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - internal_error description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: internal_error message: Example message. requestId: req_01example '502': description: Lookup could not be completed. content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - lookup_failed description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: lookup_failed message: Example message. requestId: req_01example '503': description: Service temporarily unavailable; safe to retry with backoff. headers: Retry-After: description: Seconds to wait before retrying. Present on capacity, deadline, circuit-open, and safe transport outages (bounded 1–120). schema: type: integer minimum: 1 maximum: 120 example: 1 content: application/json: schema: type: object properties: error: type: object properties: code: type: string enum: - temporarily_unavailable description: Machine-readable error code for the failed request. message: type: string description: Human-readable error message. May change over time; do not parse it. Use `error.code` and the HTTP status for programmatic handling. requestId: type: string description: Unique request identifier for tracing the failed API call. checkoutUrl: type: string format: uri description: Optional one-click checkout URL when credits are exhausted and a conversion offer is available. required: - code - message - requestId description: Error details for the failed request. required: - error description: Standard error response envelope. example: error: code: temporarily_unavailable message: Example message. requestId: req_01example operationId: getV1HackernewsMaxitem x-operation-id-source: derived components: securitySchemes: ApiKeyAuth: type: apiKey in: header name: x-api-key description: API key (`sfk_...`)