Hacker News Scraper: npm & PyPI Developer Signals avatar

Hacker News Scraper: npm & PyPI Developer Signals

Pricing

Pay per event

Go to Apify Store
Hacker News Scraper: npm & PyPI Developer Signals

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

Detroit Web Agent - Open Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 hours ago

Last modified

Share

Hacker News, npm & PyPI Developer Signals: launches, mentions and package adoption in one dataset

Hacker News Scraper: features, price and a real output row

Run it free on Apify

Price per 1,000 signalsFree planStarterScaleBusiness
This Actor$1.00$1.00$1.00$1.00

Hacker News Scraper sample output table from a real run

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.

Developer Signals output preview: real run results as a table

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

  1. Open the prefilled run (free Apify account; it creates a saved task with a working input).
  2. Press Start. The input is small on purpose, so the first run is quick and costs a few cents at most.
  3. 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.

ModeInput it usesWhat you get
hnSearchhnKeywords, hnDomains, hnIncludeComments, hnMinPoints, sinceDate, hnSortHacker News stories (and optionally comments) that match each keyword, plus stories that link to each domain
showHnshowHnKind, optional hnKeywords as a filter, sinceDate, hnMinPointsShow HN and Launch HN posts, either all recent ones or those matching your keywords
npmPackagesnpmPackagesLatest version, description, license, homepage, repository, keywords, author, plus day, week and month downloads
pypiPackagespypiPackagesLatest 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 downloadsLastWeek and latestReleaseAt.
  • OSS adoption tracking. Run the same package list weekly and compare downloadsLastWeek between 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

  1. Open the actor and choose the modes you want.
  2. Add keywords (one per row), optional domains, and package names.
  3. Set sinceDate (for example 30 days) and maxItemsPerQuery.
  4. 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

FieldTypeDefaultMeaning
modesarrayhnSearch, npmPackagesAny of hnSearch, showHn, npmPackages, pypiPackages
hnKeywordsarray of textnoneOne Algolia search per row. Quote a phrase inside the keyword to search an exact phrase. In showHn mode these filter the launches
hnDomainsarray of textnoneStories linking to a domain or a domain plus path prefix, for example github.com/yourorg
hnIncludeCommentsbooleanfalseAlso return comments that match each keyword (each comment is one billed item)
hnSortdate or relevancedateNewest first, or Algolia's relevance ranking
hnMinPointsinteger0Skip stories below this score
showHnKindboth, showHn, launchHnbothWhich launch posts showHn mode returns
sinceDatetext90 daysISO date such as 2026-09-01, or a span such as 30 days, 12 weeks, 6 months, 1 year. Empty means no limit
maxItemsPerQueryinteger50Cap per keyword, per domain, per launch type. This is your cost ceiling for Hacker News
npmPackagesarray of textnonePackage names, including scoped names such as @scope/name. A full npmjs.com URL is accepted
pypiPackagesarray of textnonePackage names. A full pypi.org project URL is accepted
timeBudgetSecsinteger300Soft 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.

FieldApplies toMeaning
sourceallhackernews, npm or pypi
recordTypeallstory, comment or package
idallHacker News item id, or npm:<name> / pypi:<normalised-name>
titleallStory title (comment rows: the title of the story the comment is on), or the package name
urlallThe submitted link (Hacker News), or the npmjs.com or pypi.org project page
domainHacker NewsHost of the submitted link, without www.
authorallHN username, or the package author name when the registry lists one
createdAtHacker NewsPost time (ISO 8601, UTC)
points, numCommentsHN storiesScore and comment count at the time of the run
commentCountHN storiesSame as numComments
authorKarmaHN stories and commentsPublic karma of the author at the time of the run (null if the lookup fails or Add author karma is off)
hnUrlHacker NewsLink to the discussion on news.ycombinator.com
kindHacker NewsshowHn, launchHn, askHn, story or comment
textSnippetHacker NewsFirst 300 characters of the post text or comment text, HTML removed
query, queryType, matchedQueriesHacker NewsThe keyword or domain that found it, keyword, domain or launch, and every query that matched it
packageNamepackagesPackage name as requested
latestVersionpackagesLatest published version
descriptionpackagesnpm description or PyPI summary
licensepackagesSPDX expression or license name when published
homepage, repositoryUrlpackagesProject links, with repository URLs cleaned to https://host/owner/repo where the registry lists a GitHub, GitLab or Bitbucket repository
keywordspackagesUp to 20 keywords
requiresPythonPyPIThe requires_python specifier
latestReleaseAtPyPIUpload 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, downloadsLastMonthpackagesDownload counts from api.npmjs.org or pypistats.org; null when that service was unavailable
foundallfalse for a package that does not exist (shown for transparency, not charged)
warningsallPlain-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 OUTPUT record in the key-value store with run statistics: rows per source, packages not found, charged counts, HTTP requests and warnings.

Pricing

Pay per event.

EventPriceWhen it is charged
Actor start$0.00005Once per run (platform standard)
Hacker News item$0.001Once per story or comment row delivered. Rows matching several queries are merged and charged once
Package record$0.002Once 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:

ScenarioBilled eventsCost
Quick start input above: 5 HN rows, 1 npm, 1 PyPI5 items + 2 packages$0.00905
Weekly competitor watch: 5 keywords, 50 items each, 90 daysup to 250 itemsup to $0.25
Daily Show HN and Launch HN scan, 30 rows eachup to 60 itemsup to $0.06
100 npm packages and 100 PyPI packages, adoption snapshot200 packages$0.40
10 domains, 20 stories eachup to 200 itemsup 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 ApifyClient
client = 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 os
from apify_client import ApifyClient
client = 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: showHn with showHnKind: both and sinceDate: 7 days, scheduled daily.
  • Competitor mentions: hnSearch with 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 a repositoryUrl and recent latestReleaseAt.
  • OSS adoption: the same package list every week, stored, then compared on downloadsLastWeek.
  • Content performance: hnDomains with 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.

More tools from the same publisher that fit this workflow:

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.

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. points and numComments are 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.

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

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:

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>" }
}
}
}