{"name":"hacker-news-scraper","id":"sfoln/hacker-news-scraper","title":"Hacker News Scraper – Stories & Comments","description":"Search Hacker News by keyword, read the top, new, best, Ask HN, Show HN, job and Who is hiring lists, or fetch items by ID with their comment threads. One clean row per story or comment: title, URL, text, author, points, comment count, date. $0.50 per 1,000 rows, no start fee.","version":"0.1","status":"ready","family":{"id":"social-media-data","name":"Social media data","description":"Profiles, posts, comments, followers and account audits from X, Instagram, TikTok, YouTube, Reddit, Threads, LinkedIn, Facebook, Bluesky, Telegram, Hacker News and Substack.","actors":31},"categories":["NEWS","SOCIAL_MEDIA","DEVELOPER_TOOLS"],"availability":"on_request","seoTitle":"Hacker News Scraper API – Stories, Comments, Jobs","seoDescription":"Scrape Hacker News stories, comment threads, Ask HN, Show HN and Who is hiring posts by keyword, list or ID. Clean JSON rows. $0.50 per 1,000 items.","summary":"Get Hacker News stories and comments as clean JSON: search everything ever posted (keywords, type, author, dates, points), read the ranked top, new, best, Ask HN, Show HN and job lists, pull the job posts of the latest \"Who is hiring?\" thread, or fetch any item by ID with its full comment thread. One row per story or comment with title, link, text, author, points, comment count and date — ready for trend tracking, launch monitoring, recruiting, research datasets and AI agents.","pricing":{"model":"pay-per-event","currency":"USD","billedBy":"Apify","freePlanMaxItemsPerRun":10,"events":[{"name":"item","title":"Hacker News item","description":"Charged once per delivered row: a story, comment, job, poll or Who is hiring post.","priceUsd":0.0005}]},"input":{"description":"Give search queries, story lists and/or item IDs. Every search, list and item is one input; each delivers one row per story or comment plus a free summary record. Accounts on the Apify free plan can process up to 10 inputs per run, with up to 20 rows each.","required":[],"fields":[{"name":"searchQueries","title":"Search queries","type":"array","required":false,"description":"Full-text searches over all of Hacker News (Algolia HN Search), one per line. Use * to match everything and select with the filters below only. Accounts on the Apify free plan can process up to 10 inputs per run.","prefill":["web scraping"],"editor":"stringList"},{"name":"lists","title":"Story lists","type":"array","required":false,"description":"Ranked lists from the official Hacker News API: top (front page), new, best, ask (Ask HN), show (Show HN), job, or whoishiring (the job posts of the latest monthly \"Ask HN: Who is hiring?\" thread).","prefill":["top"],"editor":"select"},{"name":"itemIds","title":"Item IDs or URLs","type":"array","required":false,"description":"Hacker News item IDs or URLs (https://news.ycombinator.com/item?id=8863), one per line: stories, comments, jobs or polls. Turn on Include comments to get the comment thread too.","editor":"stringList"},{"name":"searchTags","title":"Search: item types","type":"array","required":false,"description":"Search only these types (any of them). Empty = all types.","editor":"select"},{"name":"sortBy","title":"Search: sort by","type":"string","required":false,"description":"relevance (Algolia ranking; at most 1,000 results per query) or date (newest first; pages as deep as you ask).","default":"relevance","enum":["relevance","date"],"editor":"select"},{"name":"dateFrom","title":"Search: from date","type":"string","required":false,"description":"Only items created on or after this date: YYYY-MM-DD, an ISO date-time, or a relative period such as \"7 days\".","editor":"textfield"},{"name":"dateTo","title":"Search: to date","type":"string","required":false,"description":"Only items created on or before this date (a YYYY-MM-DD date includes the whole day), an ISO date-time or a relative period.","editor":"textfield"},{"name":"minPoints","title":"Search: minimum points","type":"integer","required":false,"description":"Only stories with at least this many points (comments have no public points, so this filters them out).","minimum":0},{"name":"minComments","title":"Search: minimum comments","type":"integer","required":false,"description":"Only stories with at least this many comments.","minimum":0},{"name":"author","title":"Search: author","type":"string","required":false,"description":"Only items posted by this Hacker News username.","editor":"textfield"},{"name":"maxResultsPerInput","title":"Max results per search or list","type":"integer","required":false,"description":"Stories (or hits) per search query and per list. A relevance search stops at 1,000; the top and new lists hold 500 stories, the others up to 200.","default":30,"prefill":10,"minimum":1,"maximum":5000},{"name":"includeComments","title":"Include comments","type":"boolean","required":false,"description":"For story lists and item IDs, also deliver the comment thread of each story (one row per comment, in thread order). Each comment is a charged row.","default":false},{"name":"maxCommentsPerStory","title":"Max comments per story","type":"integer","required":false,"description":"Comments per story when Include comments is on. The most visible comments come first: all top-level comments in Hacker News order, then their replies.","default":100,"minimum":1,"maximum":5000},{"name":"maxCommentDepth","title":"Max comment depth","type":"integer","required":false,"description":"Reply levels to follow (1 = only direct replies to the story).","default":10,"minimum":1,"maximum":100},{"name":"maxInputs","title":"Max inputs","type":"integer","required":false,"description":"Safety cap on searches + lists + items in this run; inputs beyond it are ignored and counted as inputItemsDropped in the OUTPUT record.","default":100,"minimum":1,"maximum":1000},{"name":"concurrency","title":"Concurrency","type":"integer","required":false,"description":"Inputs processed in parallel.","default":3,"minimum":1,"maximum":10},{"name":"includeRaw","title":"Include raw upstream data","type":"boolean","required":false,"description":"Attach the unmodified Firebase item or Algolia hit to each row (larger output).","default":false}]},"exampleInput":{"searchQueries":["web scraping"],"lists":["top"],"maxResultsPerInput":10},"outputFields":[{"name":"input","type":"string | object","title":"Input","description":"The search, list or item this record belongs to, e.g. {\"type\": \"search\", \"query\": \"rust\"}."},{"name":"recordType","type":"string","title":"Record type","description":"item (a story, comment, job or poll; charged) or summary (one per input; free).","example":"item"},{"name":"position","type":"integer","title":"Position","description":"Row number within its input (1 = first)."},{"name":"status","type":"string","title":"Status","description":"ok | not_found | error | skipped_invalid | skipped_budget | skipped_free_plan | skipped_unmetered","example":"ok"},{"name":"charged","type":"boolean","title":"Charged","description":"Whether this record incurred a pay-per-event charge."},{"name":"chargedEvent","type":"string","title":"Charged event","description":"Pay-per-event event charged for this record (present only when charged)."},{"name":"chargedCount","type":"integer","title":"Events charged","description":"Events actually charged when the charge came back short of the requested count (present only then; a warning explains it)."},{"name":"source","type":"string","title":"Source","description":"Upstream data source."},{"name":"fetchedAt","type":"string","title":"Fetched at","description":"ISO timestamp."},{"name":"error","type":"object","title":"Error","description":"{ code, message, provider?, status? } when status is not ok. Codes set by the runtime: budget_exhausted, free_plan_limit, unmetered, aborted, charge_failed, record_too_large, invalid_record, dataset_push_failed; upstream codes: rate_limit, timeout, network, server, client, invalid_response, not_found; this Actor: invalid_input, deleted."},{"name":"warnings","type":"array","title":"Warnings","description":"Notes about this record, e.g. a cap or the budget that stopped an input early."},{"name":"id","type":"integer","title":"Item ID","description":"Hacker News item id."},{"name":"type","type":"string","title":"Type","description":"story | comment | job | poll | pollopt"},{"name":"title","type":"string | null","title":"Title","description":"Story, job or poll title (null for comments)."},{"name":"url","type":"string | null","title":"URL","description":"External link of a link story or job."},{"name":"domain","type":"string | null","title":"Domain","description":"Host name of the link, without www."},{"name":"text","type":"string | null","title":"Text","description":"Plain text of a comment, Ask/Show HN post or job description (paragraphs as blank lines, links written out)."},{"name":"author","type":"string | null","title":"Author","description":"Hacker News username."},{"name":"points","type":"integer | null","title":"Points","description":"Story points (Hacker News does not publish comment scores)."},{"name":"commentsCount","type":"integer | null","title":"Comments","description":"All comments of a story."},{"name":"replyCount","type":"integer | null","title":"Direct replies","description":"Direct replies to the item, when known."},{"name":"createdAt","type":"string | null","title":"Created at","description":"ISO 8601 UTC."},{"name":"parentId","type":"integer | null","title":"Parent ID","description":"The story or comment a comment replies to."},{"name":"storyId","type":"integer | null","title":"Story ID","description":"The story the item belongs to (a story's own id)."},{"name":"storyTitle","type":"string | null","title":"Story title","description":"Title of that story, when known."},{"name":"category","type":"string | null","title":"Category","description":"ask_hn | show_hn | launch_hn | tell_hn, from the title."},{"name":"depth","type":"integer | null","title":"Depth","description":"Comment threads: reply level (1 = reply to the story or requested item)."},{"name":"rank","type":"integer | null","title":"Rank","description":"Story lists: position in the list (1 = first)."},{"name":"dead","type":"boolean","title":"Dead","description":"Hacker News killed (flagged) the item; only an item requested by id is delivered dead."},{"name":"hnUrl","type":"string","title":"Hacker News URL","description":"https://news.ycombinator.com/item?id=…"},{"name":"raw","type":"object","title":"Raw","description":"The unmodified Firebase item or Algolia hit (only with includeRaw)."},{"name":"resultsDelivered","type":"integer","title":"Rows delivered","description":"Summary records: charged rows this input delivered."},{"name":"stopReason","type":"string","title":"Stop reason","description":"Summary records: limit | free_plan | end | budget | aborted | deadline | empty_pages | max_pages | error."},{"name":"query","type":"string","title":"Query","description":"Summary of a search: the query."},{"name":"sortBy","type":"string","title":"Sort","description":"Summary of a search: relevance or date."},{"name":"totalHits","type":"integer | null","title":"Total hits","description":"Summary of a search: matches Algolia reports (approximate for large numbers)."},{"name":"list","type":"string","title":"List","description":"Summary of a list: top, new, best, ask, show, job or whoishiring."},{"name":"listSize","type":"integer","title":"List size","description":"Summary of a list: stories in the list (job posts in the Who is hiring thread)."},{"name":"threadId","type":"integer","title":"Thread ID","description":"Summary of whoishiring: the thread's item id."},{"name":"threadTitle","type":"string | null","title":"Thread title","description":"Summary of whoishiring: e.g. Ask HN: Who is hiring? (October 2026)."},{"name":"itemType","type":"string","title":"Item type","description":"Summary of an item: its type."}],"outputExample":[{"input":{"type":"list","list":"top"},"recordType":"item","position":1,"id":1001,"type":"story","title":"Show HN: A synthetic test story","url":"https://www.example.com/post?id=1","domain":"example.com","text":null,"author":"synthetic_poster","points":321,"commentsCount":5,"replyCount":3,"createdAt":"2026-10-13T14:00:00.000Z","parentId":null,"storyId":1001,"storyTitle":"Show HN: A synthetic test story","category":"show_hn","depth":null,"rank":1,"dead":false,"hnUrl":"https://news.ycombinator.com/item?id=1001","status":"ok","charged":true,"chargedEvent":"item","source":"hackernews","fetchedAt":"2026-10-14T12:00:00.000Z"},{"input":{"type":"list","list":"top"},"recordType":"item","position":2,"id":1003,"type":"comment","title":null,"url":null,"domain":null,"text":"First top comment, I'd say.\n\nSee https://example.org/a-very-long-path/page","author":"user_alpha","points":null,"commentsCount":null,"replyCount":2,"createdAt":"2026-10-13T14:01:40.000Z","parentId":1001,"storyId":1001,"storyTitle":"Show HN: A synthetic test story","category":null,"depth":1,"rank":null,"dead":false,"hnUrl":"https://news.ycombinator.com/item?id=1003","status":"ok","charged":true,"chargedEvent":"item","source":"hackernews","fetchedAt":"2026-10-14T12:00:00.000Z"},{"input":{"type":"list","list":"top"},"list":"top","listSize":500,"recordType":"summary","resultsDelivered":2,"stopReason":"limit","status":"ok","charged":false,"source":"hackernews","fetchedAt":"2026-10-14T12:00:01.000Z"}],"faq":[{"question":"Which Hacker News data sources does it use?","answer":"The official Hacker News API (Firebase) for items, ranked lists and comment threads, and Algolia's HN Search API for full-text search. Both are public; no login or API key is needed."},{"question":"How are comments ordered?","answer":"In thread order: each comment is followed by its replies, siblings in Hacker News' own ranking order. When maxCommentsPerStory cuts a thread, the most visible comments are kept: all top-level comments first, then their replies."},{"question":"Can I get more than 1,000 search results?","answer":"Yes, with sortBy set to date: newest-first searches page by date as deep as maxResultsPerInput allows (up to 5,000 per query). Relevance searches stop at 1,000 results, an Algolia limit."}],"mcpExamplePrompt":"Use hacker-news-scraper to get today's top 10 Hacker News stories with their top comments, then summarize what people are discussing.","related":["reddit-subreddit-posts","brand-mentions-monitor","google-news-search","substack-scraper","telegram-channel-scraper","url-to-markdown-summary"],"urls":{"site":"https://www.sfoln.com/actors/hacker-news-scraper/","siteJson":"https://www.sfoln.com/actors/hacker-news-scraper.json","siteMarkdown":"https://www.sfoln.com/actors/hacker-news-scraper.md","runSync":"https://api.apify.com/v2/actors/sfoln~hacker-news-scraper/run-sync-get-dataset-items","runAsync":"https://api.apify.com/v2/actors/sfoln~hacker-news-scraper/runs","mcp":"https://mcp.apify.com?tools=sfoln/hacker-news-scraper","requestAccess":"mailto:contact@sfoln.com?subject=Access%20request%3A%20Hacker%20News%20Scraper%20%E2%80%93%20Stories%20%26%20Comments%20(sfoln%2Fhacker-news-scraper)&body=Please%20publish%20hacker-news-scraper.%20What%20we%20plan%20to%20use%20it%20for%3A"},"publisher":{"name":"SFOLN LLC","apifyUsername":"sfoln","url":"https://www.sfoln.com","apifyProfile":"https://apify.com/sfoln","email":"contact@sfoln.com"},"generatedAt":"2026-10-22T04:28:58.477Z"}