Hacker News Scraper: npm & PyPI Developer Signals
Pricing
Pay per event
Hacker News Scraper: npm & PyPI Developer Signals
Track Hacker News mentions, Show HN and Launch HN posts, plus npm and PyPI package versions, repo links and download counts, in one dataset. Keyless public APIs. From $0.001 per item.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Detroit Web Agent - Open Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 hours ago
Last modified
Categories
Share
Hacker News, npm & PyPI Developer Signals: launches, mentions and package adoption in one dataset

| Price per 1,000 signals | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| This Actor | $1.00 | $1.00 | $1.00 | $1.00 |

Point it at keywords, domains and package names. It searches Hacker News through the public Algolia HN Search API, reads npm package metadata and download counts from the npm registry, and reads PyPI metadata plus recent download counts from the PyPI JSON API and pypistats.org. Everything comes back in one unified schema with a source field (hackernews, npm, pypi), so a single table, spreadsheet or webhook handles all three.

Typical questions it answers: Who is talking about our product or a competitor on Hacker News this month? Which Show HN and Launch HN posts appeared in our category? Is this open-source library actually growing? Which developer tools have a real repository, a recent release and real download volume?
- Keyless public APIs only. No login, no proxy, no browser, no scraping of HTML pages.
- Every row says where it came from and links back to the source (
hnUrl, npm and PyPI project pages, repository URL). - Pay per event: $0.001 per Hacker News item, $0.002 per package record, plus the platform's tiny per-run start fee. Packages that do not exist are shown but never charged.
- A failing source never fails the run. If pypistats is rate limiting, you still get the PyPI metadata, with the download fields empty and a plain warning in the row.
Run in 30 seconds
- Open the prefilled run (free Apify account; it creates a saved task with a working input).
- Press Start. The input is small on purpose, so the first run is quick and costs a few cents at most.
- Open the Output tab, switch to Table view, download as CSV, Excel or JSON.
Prefilled input:
{"modes": ["hnSearch","npmPackages"],"hnKeywords": ["apify"],"npmPackages": ["crawlee"],"sinceDate": "30 days","maxItemsPerQuery": 3}
Ready-made presets by use case (each opens as a saved task you can edit):
What does it do
The actor has four modes. Pick any combination in one run.
| Mode | Input it uses | What you get |
|---|---|---|
hnSearch | hnKeywords, hnDomains, hnIncludeComments, hnMinPoints, sinceDate, hnSort | Hacker News stories (and optionally comments) that match each keyword, plus stories that link to each domain |
showHn | showHnKind, optional hnKeywords as a filter, sinceDate, hnMinPoints | Show HN and Launch HN posts, either all recent ones or those matching your keywords |
npmPackages | npmPackages | Latest version, description, license, homepage, repository, keywords, author, plus day, week and month downloads |
pypiPackages | pypiPackages | Latest version, summary, license, Python requirement, repository, homepage, keywords, latest upload time, plus day, week and month downloads |
Rows from keyword queries that overlap are merged: a story that matches two of your keywords appears once, with both listed in matchedQueries, and is billed once.
Why use it
- Launch tracking. Watch Show HN and Launch HN every day for your category and see points and comment counts while a launch is still on the front page.
- Competitor mentions. Search a competitor's name or the domain they link to, filter by minimum points, and export the thread URLs for your product or sales team.
- Developer-tool lead signals. A library with a growing weekly download count, a fresh release and a public repository is a company or maintainer worth talking to. Rank packages by
downloadsLastWeekandlatestReleaseAt. - OSS adoption tracking. Run the same package list weekly and compare
downloadsLastWeekbetween runs to see which projects are gaining or losing ground. - Content and DevRel research. Find which of your blog posts or docs pages were submitted to Hacker News (domain search), and what the community said (comments).
How to use
- Open the actor and choose the modes you want.
- Add keywords (one per row), optional domains, and package names.
- Set
sinceDate(for example30 days) andmaxItemsPerQuery. - Run it, then open the Overview, Hacker News or Packages table, or download JSON, CSV or Excel.
Quick start input
{"modes": ["hnSearch", "showHn", "npmPackages", "pypiPackages"],"hnKeywords": ["apify"],"sinceDate": "90 days","maxItemsPerQuery": 5,"npmPackages": ["crawlee"],"pypiPackages": ["apify-client"]}
This is the prefilled example. It makes about 9 HTTP requests, returns 7 rows and costs about one cent (see Pricing for the measured run).
All inputs
| Field | Type | Default | Meaning |
|---|---|---|---|
modes | array | hnSearch, npmPackages | Any of hnSearch, showHn, npmPackages, pypiPackages |
hnKeywords | array of text | none | One Algolia search per row. Quote a phrase inside the keyword to search an exact phrase. In showHn mode these filter the launches |
hnDomains | array of text | none | Stories linking to a domain or a domain plus path prefix, for example github.com/yourorg |
hnIncludeComments | boolean | false | Also return comments that match each keyword (each comment is one billed item) |
hnSort | date or relevance | date | Newest first, or Algolia's relevance ranking |
hnMinPoints | integer | 0 | Skip stories below this score |
showHnKind | both, showHn, launchHn | both | Which launch posts showHn mode returns |
sinceDate | text | 90 days | ISO date such as 2026-09-01, or a span such as 30 days, 12 weeks, 6 months, 1 year. Empty means no limit |
maxItemsPerQuery | integer | 50 | Cap per keyword, per domain, per launch type. This is your cost ceiling for Hacker News |
npmPackages | array of text | none | Package names, including scoped names such as @scope/name. A full npmjs.com URL is accepted |
pypiPackages | array of text | none | Package names. A full pypi.org project URL is accepted |
timeBudgetSecs | integer | 300 | Soft time limit for the whole run |
The unified output schema
Every row has the same fields. Fields that do not apply to a row are null, so CSV and spreadsheet exports keep stable columns.
| Field | Applies to | Meaning |
|---|---|---|
source | all | hackernews, npm or pypi |
recordType | all | story, comment or package |
id | all | Hacker News item id, or npm:<name> / pypi:<normalised-name> |
title | all | Story title (comment rows: the title of the story the comment is on), or the package name |
url | all | The submitted link (Hacker News), or the npmjs.com or pypi.org project page |
domain | Hacker News | Host of the submitted link, without www. |
author | all | HN username, or the package author name when the registry lists one |
createdAt | Hacker News | Post time (ISO 8601, UTC) |
points, numComments | HN stories | Score and comment count at the time of the run |
commentCount | HN stories | Same as numComments |
authorKarma | HN stories and comments | Public karma of the author at the time of the run (null if the lookup fails or Add author karma is off) |
hnUrl | Hacker News | Link to the discussion on news.ycombinator.com |
kind | Hacker News | showHn, launchHn, askHn, story or comment |
textSnippet | Hacker News | First 300 characters of the post text or comment text, HTML removed |
query, queryType, matchedQueries | Hacker News | The keyword or domain that found it, keyword, domain or launch, and every query that matched it |
packageName | packages | Package name as requested |
latestVersion | packages | Latest published version |
description | packages | npm description or PyPI summary |
license | packages | SPDX expression or license name when published |
homepage, repositoryUrl | packages | Project links, with repository URLs cleaned to https://host/owner/repo where the registry lists a GitHub, GitLab or Bitbucket repository |
keywords | packages | Up to 20 keywords |
requiresPython | PyPI | The requires_python specifier |
latestReleaseAt | PyPI | Upload time of the latest release files (npm does not return this in the cheap endpoint the actor uses, so it is null for npm) |
downloadsLastDay, downloadsLastWeek, downloadsLastMonth | packages | Download counts from api.npmjs.org or pypistats.org; null when that service was unavailable |
found | all | false for a package that does not exist (shown for transparency, not charged) |
warnings | all | Plain-English notes such as pypistats downloads unavailable: HTTP 429 |
Sample output
A Hacker News story from the real run (shortened):
{"source": "hackernews","recordType": "story","id": "49563084","title": "Show HN: MCP Security Auditor - Zero-execution static scanner for MCP servers","url": "https://apify.com/neon_innovation_lab/mcp-security-auditor","domain": "apify.com","author": "mohiuddinansari","createdAt": "2026-09-04T11:19:48Z","points": 2,"numComments": 0,"hnUrl": "https://news.ycombinator.com/item?id=49563084","kind": "showHn","query": "apify","queryType": "keyword","matchedQueries": ["apify"],"found": true,"warnings": []}
An npm package record from the same run:
{"source": "npm","recordType": "package","id": "npm:crawlee","title": "crawlee","url": "https://www.npmjs.com/package/crawlee","packageName": "crawlee","latestVersion": "3.18.2","license": "Apache-2.0","homepage": "https://crawlee.dev","repositoryUrl": "https://github.com/apify/crawlee","downloadsLastDay": 33886,"downloadsLastWeek": 163179,"downloadsLastMonth": 671361,"found": true,"warnings": []}
A PyPI record from the same run had latestVersion 3.3.0, requiresPython >=3.11, downloadsLastWeek 588,566 and a latestReleaseAt of 2026-10-08.
What you get
- Overview table: all rows from all sources side by side.
- Hacker News table: title, link, points, comments, author, date and the discussion URL.
- Packages table: version, description, downloads, license, repository and warnings.
- A
OUTPUTrecord in the key-value store with run statistics: rows per source, packages not found, charged counts, HTTP requests and warnings.
Pricing
Pay per event.
| Event | Price | When it is charged |
|---|---|---|
| Actor start | $0.00005 | Once per run (platform standard) |
| Hacker News item | $0.001 | Once per story or comment row delivered. Rows matching several queries are merged and charged once |
| Package record | $0.002 | Once per npm or PyPI package that exists and was delivered |
What is not charged: packages that do not exist (the row says found: false), invalid package names, queries that return nothing, and any row that could not be delivered because you hit the maximum charge per run.
Worked examples:
| Scenario | Billed events | Cost |
|---|---|---|
| Quick start input above: 5 HN rows, 1 npm, 1 PyPI | 5 items + 2 packages | $0.00905 |
| Weekly competitor watch: 5 keywords, 50 items each, 90 days | up to 250 items | up to $0.25 |
| Daily Show HN and Launch HN scan, 30 rows each | up to 60 items | up to $0.06 |
| 100 npm packages and 100 PyPI packages, adoption snapshot | 200 packages | $0.40 |
| 10 domains, 20 stories each | up to 200 items | up to $0.20 |
The measured run of the quick start input finished in about 3 seconds. Platform compute for it was about two hundredths of a cent. Cost control is direct: maxItemsPerQuery caps Hacker News rows per query, and you can also set the platform's maximum charge per run. When that limit is reached the actor stops cleanly and returns what it already has.
Integrations: API, n8n, Make, Zapier
Run it from the API (JavaScript):
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('transparent_meteorite/developer-signals').call({modes: ['showHn'],showHnKind: 'both',hnKeywords: ['scraping'],sinceDate: '14 days',hnMinPoints: 5,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.map((r) => `${r.points} ${r.title} ${r.hnUrl}`));
Python:
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("transparent_meteorite/developer-signals").call(run_input={"modes": ["npmPackages", "pypiPackages"],"npmPackages": ["crawlee", "playwright"],"pypiPackages": ["requests", "httpx"],})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row["source"], row["packageName"], row["downloadsLastWeek"])
Schedules and alerts. Use an Apify schedule (daily or weekly) with a webhook, or the n8n, Make and Zapier Apify integrations. A common setup: run daily with showHn and a keyword list, and post new rows to Slack. Because every row has a stable id, de-duplicate against the previous run on id.
Use with AI agents and MCP
The output is flat JSON with predictable keys, which makes it a good tool result for an agent. Through the Apify MCP server an agent can call this actor with a prompt such as "What did Hacker News say about
Use it from code
Small real input: it returns only a couple of rows, so a test run costs very little (see Pricing). Set the APIFY_TOKEN environment variable to your token from Apify Console > Settings > API & Integrations.
Python (pip install apify-client)
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run_input = {'modes': ['hnSearch', 'npmPackages'], 'hnKeywords': ['apify'], 'npmPackages': ['crawlee'], 'sinceDate': '30 days', 'maxItemsPerQuery': 2}run = client.actor("transparent_meteorite/developer-signals").call(run_input=run_input)for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
JavaScript / Node.js (npm install apify-client)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const input = {"modes": ["hnSearch","npmPackages"],"hnKeywords": ["apify"],"npmPackages": ["crawlee"],"sinceDate": "30 days","maxItemsPerQuery": 2};const run = await client.actor('transparent_meteorite/developer-signals').call(input);const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
curl (runs the actor and returns the dataset items in one call)
curl -X POST "https://api.apify.com/v2/acts/transparent_meteorite~developer-signals/run-sync-get-dataset-items" \-H "Authorization: Bearer $APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"modes": ["hnSearch", "npmPackages"], "hnKeywords": ["apify"], "npmPackages": ["crawlee"], "sinceDate": "30 days", "maxItemsPerQuery": 2}'
Send results to Google Sheets, Zapier, Make or n8n
- Google Sheets: every run's dataset has a CSV export link:
https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=csv&clean=true(the dataset ID is on the run's Storage tab). In Sheets,=IMPORTDATA("<that link>")loads it. Anyone with the link can read that dataset, so share it carefully. To export to Google Drive automatically, use the Google Drive integration on the actor's Integrations tab. - Zapier: in the Apify app, use the trigger Finished Actor run (or Run Actor as an action) with
transparent_meteorite/developer-signals, then Fetch dataset items and pass the rows to Google Sheets, a CRM or Slack. - Make: the Apify app has Watch Actor Runs, Run an Actor and Get Dataset Items modules; connect them to any Make app.
- n8n: install the Apify node (
@apify/n8n-nodes-apify) and use Run an Actor and get dataset, or the On new Apify event trigger. - Schedule and webhooks: create a Task with your input, add a Schedule in Apify Console, and add a webhook if you want a call when a run finishes.
See the Apify integrations docs for setup steps.
Use cases
- Launch tracking:
showHnwithshowHnKind: bothandsinceDate: 7 days, scheduled daily. - Competitor mentions:
hnSearchwith the competitor's name and domain,hnMinPoints: 10, comments on. - Developer-tool lead signals: a list of packages in a niche, sorted by
downloadsLastWeek, filtered to those with arepositoryUrland recentlatestReleaseAt. - OSS adoption: the same package list every week, stored, then compared on
downloadsLastWeek. - Content performance:
hnDomainswith your blog domain to see which posts reached Hacker News and how they scored.
New to Apify? Create a free account and run this Actor in under a minute. Some links are affiliate links.
Related actors
More tools from the same publisher that fit this workflow:
- Company News Monitor: brand and keyword news alerts
- iOS App Store Reviews Scraper: iOS App Store reviews from 150+ countries
- Company Enrichment by Domain: enrich a domain with socials, emails and tech stack
- Website Email Extractor: pull emails, phones and socials from each business website
- Website Tech Stack Detector: detect the CMS, frameworks and hosting behind any site
- Local Business Leads: find local businesses with no website from OpenStreetMap, a cheap complement to Maps data
Use from AI agents: every actor here is callable through the Apify MCP server (mcp.apify.com) and our open-data-actors MCP endpoint.
Frequently asked questions
Where does the data come from?
Hacker News results come from the public Algolia HN Search API at hn.algolia.com. npm data comes from registry.npmjs.org and api.npmjs.org. PyPI data comes from pypi.org's JSON API, and PyPI download counts from pypistats.org. None of them need an API key.
Why does a keyword return posts that do not contain the exact word?
Algolia search is typo tolerant and matches word prefixes. In our own test a search for apify also returned a post about "APIFlow". Use hnDomains for exact link matching, and check the title and url columns. The actor does not hide these matches because the same tolerance finds real misspellings of brand names.
How do I search an exact phrase?
Put the phrase in double quotes inside the keyword, for example "web scraping". Algolia then matches the phrase.
Can I find posts that link to my site?
Yes. Add the domain to hnDomains. The actor asks Algolia to search the URL field and then keeps only stories whose link really is on that domain (or starts with the domain plus path you gave).
Why are downloadsLastWeek values empty for a PyPI package?
pypistats.org rate limits clients. The actor spaces its calls and retries, but if the service still refuses, the metadata from PyPI is delivered and the download fields stay null with a warning in warnings. Run again later or with fewer packages. The package record is still charged because the PyPI metadata was delivered.
Why is latestReleaseAt empty for npm?
The lightweight npm endpoint the actor uses returns the latest version's metadata, not the publish timestamp. Rather than download each package's entire history to get one date, the field is left null for npm and filled for PyPI, where the JSON API includes upload times.
Are download numbers exact?
They are the numbers published by npm and pypistats.org. Both include mirrors, CI installs and bots, so use them for trends and ranking rather than as a count of unique users.
Does it return personal data?
Hacker News usernames and package author names are published by the sources themselves. The actor does not look people up, enrich them or guess email addresses. If you use the output for outreach, follow the rules that apply to you, including each platform's terms.
What is the Hacker News limit per query?
Algolia exposes at most 1,000 hits per query (10 pages of 100). maxItemsPerQuery goes up to 1,000. For longer histories, split by sinceDate windows across runs.
Does it respect rate limits?
Yes. The actor spaces requests per host (about 1.5 seconds for pypistats.org, a fraction of a second for the others), identifies itself with a descriptive User-Agent, and backs off on 429 and 5xx responses.
More questions
How do I track Hacker News mentions of my product or a competitor?
Add the name to hnKeywords (and your domain to hnDomains for exact link matches), keep hnSearch in modes, and schedule the actor. Use hnMinPoints to skip low-score posts.
How can I see Show HN and Launch HN posts in my category?
Select the showHn mode and use showHnKind to pick Show HN, Launch HN or both. Keywords filter the launches.
How do I get npm download counts for a list of packages?
Select npmPackages and list the package names. Each package becomes one row with its metadata and last-week downloads, read from the npm registry.
Can I get PyPI download numbers too?
Yes, in the pypiPackages mode. Download counts come from pypistats.org, which can rate limit; when it does you still get the PyPI metadata with the download fields empty and a plain warning in the row.
Do I need an API key for Hacker News, npm or PyPI? No. The actor uses only keyless public APIs: Algolia HN Search, the npm registry, PyPI JSON and pypistats.
How much does it cost?
$0.001 per Hacker News item and $0.002 per package record, plus the platform start fee. Packages that do not exist are shown but not charged. maxItemsPerQuery caps the Hacker News cost.
How this compares
Hacker News, npm and PyPI each have free public APIs you can call yourself. This actor puts them into one schema, adds date windows, domain matching and Show HN and Launch HN filters, and handles pacing and rate limits. Paid social-listening tools watch many more sources; this one covers only Hacker News, npm and PyPI.
Limitations
- Hacker News only, via Algolia. Other communities (Product Hunt, Reddit, Lobsters) are not included.
- Search quality is Algolia's. Ranking, typo tolerance and the 1,000-hit ceiling come from the API.
- Scores change.
pointsandnumCommentsare a snapshot from the moment of the run. - npm release dates are not returned. See the FAQ above.
- Downloads are approximate and lag. npm and pypistats.org publish daily aggregates, so "last day" can be a day or two behind.
- PyPI repository link is best effort. It is taken from the project URLs a maintainer listed. Some projects list none.
- No private registries. Public npm and PyPI only.
- No historical download series. You get last day, week and month. Store runs to build a trend.
Related actors
- website-tech-stack-detector: detect the technologies a website uses from its public HTML and headers.
- company-news-monitor: news mentions for a list of companies from public RSS sources.
- sitemap-link-inventory: every URL in a site's sitemaps with optional broken-link checks.
Support and feedback
Open an issue on the actor's Issues tab with the input you used and the run id. If a source changes its response shape, the report becomes a regression test.
Reliability
Last 30 days, measured from Apify run records (all runs, including our own daily health checks): 15 of 15 finished runs succeeded (100.0%), median run time 2.9 s (90th percentile 3.4 s). Aborted runs (0) are not counted.
Updated 2026-10-11 automatically every week from the run history. Report any failure on the Issues tab with the run URL.
More resources
- Guide & examples: mamoo85.github.io/open-data-actors/developer-signals.html
- Sample output and example input on GitHub (masked sample CSV): github.com/Mamoo85/apify-actor-samples/developer-signals
Changelog
- 2026-10-09: First release.
- 2026-10-09: Input sections with a tiny prefill, run status messages, friendly input errors, examples, API snippets, integrations how-tos, FAQ.
- 2026-10-09: Branding: maintained by Detroit Web Agent - Open Data.
- 2026-10-11: Closing log line points to the Issues tab; Reliability section added to this README.
- 2026-10-13: Added a Run in 30 seconds section with a one-click prefilled run link, saved use-case presets and Store title and search description reworded around how buyers search.
- 2026-10-13: New inputs: dateFrom/dateTo, minPoints, minComments, author, includeAuthorKarma. New fields: commentCount, authorKarma. Prices unchanged.
Works well with
Other actors from Detroit Web Agent - Open Data that pair with this one:
- Company News Monitor: follow press coverage of the same companies and products you track on Hacker News.
- Career Site Jobs API: see whether the company behind a fast-growing package is hiring.
- Website Tech Stack Detector: check which technologies a company that mentions your product actually runs.
- Company Enrichment by Domain: add company details from the website behind a Hacker News link.
What the free plan gets you
Free plan: about 5,000 Hacker News items from your $5 monthly Apify credit (at $0.001 each, today's price); default settings return about 3 to 4 rows. npm package records are $0.002 each. Need more? Upgrade your Apify plan or set a higher result limit in the input.
Need more than the data?
This actor is built by Detroit Web Agent, a small Detroit studio that builds websites, lead pages and simple data tools for small businesses. If you want these results turned into a working website, a landing page or a CRM import, or you need a field this actor does not cover yet, open an issue on the Issues tab or visit detroitwebagent.com.
Built and maintained by Detroit Web Agent - Open Data (Detroit, Michigan). Questions, bugs or a field you need: open an issue on this Actor's Issues tab and we will reply there.
Use it from AI assistants (MCP)
Developer Signals works as a tool for AI assistants through the official Apify MCP server. Add this server URL to any MCP client (Claude Desktop, Claude Code, Cursor, ChatGPT connectors, VS Code):
https://mcp.apify.com/?actors=transparent_meteorite/developer-signals
{"mcpServers": {"apify": {"url": "https://mcp.apify.com/?actors=transparent_meteorite/developer-signals","headers": { "Authorization": "Bearer <YOUR_APIFY_TOKEN>" }}}}
