npm Packages Search Scraper avatar

npm Packages Search Scraper

Pricing

from $0.07 / 1,000 package results

Go to Apify Store
npm Packages Search Scraper

npm Packages Search Scraper

Search npm packages and export registry metadata, popularity scores, maintainers, repository links, and download counts.

Pricing

from $0.07 / 1,000 package results

Rating

0.0

(0)

Developer

Fetch Cat

Fetch Cat

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

11 days ago

Last modified

Security

Limited permissions

Share

Search npm packages and export public registry metadata, maintainer usernames, repository links, popularity scores and download counts. Use a keyword to discover packages, or provide exact package names to collect a repeatable snapshot. Export the dataset as CSV or JSON, or call the Actor through the API and AI tools.

Quick start

  1. Open Input and enter a search in query, or add exact names to packageNames.
  2. Set maxItems to a small limit and start the run.
  3. Open Dataset to inspect and export your package rows.

For a small npm package search:

{
"query": "eslint plugin",
"maxItems": 10,
"includeDownloads": true,
"downloadPeriod": "last-month"
}

For a known package, replace query with "packageNames": ["@types/node"]. Direct names are processed first. If you also provide query, search fills the remaining row allowance. Set maxItems explicitly in API calls: the Console defaults to 10, while the runtime fallback for an omitted value is 50.

Prefer a video guide? This short Apify walkthrough shows you how to set up and run an Actor. It uses a different Actor, but the setup steps are the same.

What you get

Package metadata or direct-lookup status rows with package names, reported versions and source outcomes. Available repository links, public usernames, search scores and optional dated downloads support further research. Search and direct modes expose different fields, and a successful metadata row can lack download enrichment.

Who is it for?

  • JavaScript ecosystem researchers inspecting package discovery samples.
  • Developer-relations teams reviewing source-linked package and repository metadata.
  • Tooling analysts comparing dated observations for known package lists.
  • Data developers passing current registry snapshots into their own research tools.

How you can use the data

  • Build an ESLint-plugin research shortlist. Use the existing eslint plugin search with ten rows and last-month downloads enabled. Keep packageName, npmUrl and available repository links before manual review. Search scores and download totals do not verify security or reliability.
  • Refresh exact known package metadata. Use the existing react and @types/node recipe with a two-row cap and downloads off. Keep reported versions and row status, without expecting direct lookups to expose search scores or updatedAt.
  • Compare dated download observations yourself. Retain the requested window, start and end dates with weekly or monthly counts in your own destination. Last-day records request status and dates but no daily count field, and counts do not identify unique users or adopting companies.
  • Separate lookup outcomes from paid package rows. Direct not-found/status rows consume the cap but are not paid successful metadata results. Check errorMessage before declaring a package absent or private. Save dated exports for your own historical comparisons rather than expecting dependency or vulnerability alerts.

Input settings

SettingJSON keyWhat it controls
Search textquerynpm registry keyword search. Leave empty for direct names only.
Exact namespackageNamesPublic package names, including scoped names such as @types/node.
Row limitmaxItemsAt most 1,000 saved rows across both modes, including status rows.
Download countsincludeDownloadsOptional enrichment, enabled by default.
Download windowdownloadPeriodlast-day, last-week or last-month (default).
Maintainer usernamesincludeMaintainersInclude public usernames when available. Enabled by default.
DeduplicationdedupeSave overlapping package names once. Enabled by default.

You must supply a non-empty query or at least one valid packageNames entry. Search results follow the registry's returned order. There is no sort setting. This Actor searches current public package metadata without npm login. It does not list every historical release, inspect package source, or assess security vulnerabilities.

Example inputs

For repeatable named-package research without optional download requests:

{
"packageNames": ["react", "@types/node"],
"maxItems": 2,
"includeDownloads": false
}

For discovery, use the keyword recipe in Quick start. Saved examples are private. These recipes can be pasted into the Actor's Input tab.

Output data

Each dataset row represents a package or a reported lookup failure. Optional source fields can be null, and search and direct lookup do not expose identical score fields.

FieldsMeaning
packageName, scope, versionPackage identity and current reported version.
description, keywords, licensePublic registry metadata when available.
publisherUsername, maintainerUsernamesPublic npm usernames, not verified contact details.
repositoryUrl, homepageUrl, bugsUrl, npmUrlSource links for further investigation.
scoreFinal, scorePopularity, scoreQuality, scoreMaintenance, searchScoreScores when returned by npm search. Not security or reliability guarantees. Direct lookups leave these empty.
weeklyDownloads, monthlyDownloads, downloadsLastMonthAvailable weekly/monthly metrics. downloadsLastMonth is populated only for last-month enrichment.
downloadsWindowStart, downloadsWindowEndDates reported for the requested download window.
dependentsDependent count when included in search results.
downloadCountStatusWhether enrichment succeeded, was unavailable or was not requested.
status, errorMessage, sourceRow outcome and search/direct origin.
updatedAt, fetchedAtSource update time when available and collection timestamp.

Illustrative output shape, with most fields omitted and no invented popularity counts:

{
"packageName": "@types/node",
"scope": "@types",
"version": "<version returned by npm>",
"status": "ok",
"source": "direct"
}

Use repository links to investigate dependencies, compare dated download snapshots for ecosystem research, or build a package shortlist before manual review. Download counts describe activity, not unique users or adoption by a particular company.

Download your results

Open your run's dataset, choose Export and select JSON, CSV or Excel. JSON keeps nested fields together. CSV and Excel are useful when you want to review the records in a spreadsheet.

See Apify's download and export guide for the available formats and field options.

Pricing

The start event is charged once after validation. The item event applies to each saved successful package metadata row, including a row whose optional download enrichment is unavailable. Direct not-found and status rows use the saved-row cap but are not charged as successful packages.

Use a small explicit cap and disable downloads when unnecessary to avoid optional requests. See the Pricing tab for current rates and plan discounts. A later retry is a new run and overlapping successful results can be charged again.

Tips for best results

  • Use explicit exact names for repeatable snapshots. Direct lookups run before a supplied search fills remaining space.
  • Set the cap explicitly. The Console and runtime omission values differ, and status rows use allowance too.
  • Choose weekly or monthly windows for numeric downloads. The accepted daily option does not save a daily count field.
  • Keep outcome and enrichment status with each row. Missing metrics do not make metadata unusable or prove zero downloads.
  • Open source links for further investigation. Scores and usernames are not security assessments or verified contacts.

Limits and caveats

Only current public npm metadata is supported without registry login. Private packages and authenticated access are outside scope. This Actor does not list every historical release, inspect package source or assess vulnerabilities, reliability or company adoption.

Supply a nonempty query or valid exact names. Direct names are processed first and search fills the remaining allowance. The row cap includes status rows, with a one-thousand effective maximum. Console defaults and omitted runtime values differ as described in Quick start. Registry order is retained with no sort input. Optional deduplication controls overlapping names.

Search and direct records differ. Search leaves license empty, direct lookup leaves search scores and updatedAt empty, and source fields can be null. Public maintainer usernames are not verified contact details. Downloads can fail or omit a window while metadata remains useful and chargeable. Search metrics and selected enrichment can cover different periods.

Last-week updates weeklyDownloads, while last-month updates monthlyDownloads and downloadsLastMonth. Last-day records request status and window dates rather than a daily number. Download counts describe activity, not unique users. Check downloadCountStatus rather than converting absent values to zero.

A search without saved rows currently fails. Already saved rows can remain after interruption, and available RUN_SUMMARY reports outcome, saved count and next search offset. Inspect status and the dataset before retrying. A not-found row can also reflect unavailable public requests rather than confirmed nonexistence or privacy. New runs can repeat paid successful rows. Historical joins, change comparisons and alerts require your own workflow.

Automation and integrations

Save your settings for next time

Once you have an input that works for you, save it as an Apify task. This keeps your settings together so you can use them again without filling in the form from scratch.

Run on a schedule

Need fresh results regularly? You can schedule the Actor or a saved task to run at a time that suits you.

Each scheduled run collects the data again. If you want to compare results or highlight changes, add that step in your own workflow.

Send results to your other tools

Use n8n, Make or Zapier to connect this scraper to the rest of your workflow. For example, you could pass its results to an AI assistant or add records to a spreadsheet. Follow the Apify integration guides for your chosen tool.

For a custom connection, an Apify webhook can notify your app when a run finishes or fails. Your app can then fetch the results or handle the failure.

API usage

Want to collect this data from your own app or automation? The examples below send input to the scraper and show how to collect its results.

The Node.js and Python examples wait for the run to finish before reading its results. The cURL example starts the run and returns its details. Wait for that run to finish, then use its defaultDatasetId to fetch the results.

For setup instructions, see Apify's JavaScript client guide, Python client guide and Actor runs API reference.

cURL

curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~npm-packages-search-scraper/runs' \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H 'Content-Type: application/json' \
--data @- <<'JSON'
{
"query": "eslint plugin",
"maxItems": 10,
"includeDownloads": true,
"downloadPeriod": "last-month"
}
JSON

Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/npm-packages-search-scraper').call({
"query": "eslint plugin",
"maxItems": 10,
"includeDownloads": true,
"downloadPeriod": "last-month"
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('fetch_cat/npm-packages-search-scraper').call(run_input={'query': 'eslint plugin', 'maxItems': 10, 'includeDownloads': True, 'downloadPeriod': 'last-month'})
print(client.dataset(run['defaultDatasetId']).list_items().items)

MCP and AI agents

You can ask your AI assistant to collect data with npm Packages Search Scraper and help you work with the results. The scraper returns the data, and your assistant can then summarize it, compare records or prepare notes.

Connect your assistant through the Apify MCP server. MCP gives your assistant a way to find this scraper, run it and read the results. Follow the official setup and sign-in guide for your app.

Easier setup with an Apify plugin

If you use a supported coding assistant, the official Apify plugin can set up the connection for you. It connects your assistant to Apify and includes instructions for common tasks. Follow the guide for your particular app.

Use Apify AI in Console

Prefer to keep everything in Apify? Open Apify AI in Console and ask it to find Fetch Cat's npm Packages Search Scraper. You can describe the data you want and ask questions about the results.

Apify AI is currently in beta. It asks for confirmation before starting an Actor, and normal run charges apply.

Choose your assistant

Connect just this scraper

To keep your setup focused on this scraper, add this server configuration to a compatible MCP client:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=fetch_cat/npm-packages-search-scraper"
}
}
}

Sign in to Apify when your client asks. If your client uses a Bearer token instead, follow its setup guide and keep the token in its secure configuration. Configuration formats vary by app, so use the linked guide if your client needs a different format.

Use Apify's general server

Already connected to the general Apify MCP server at https://mcp.apify.com? You can use it to find this scraper without adding another server. Ask your assistant to use npm Packages Search Scraper by Fetch Cat, or give it the identifier fetch_cat/npm-packages-search-scraper.

Your assistant can check the available settings and retrieve the results from the returned run. If the run is still working, it should follow that run rather than start it again. Both connection options use Apify's hosted service.

Example requests

  • “Use Fetch Cat’s npm Packages Search Scraper to collect up to 5 eslint plugin package rows with last-month download enrichment. Keep package and repository links with available counts, without treating scores as a security assessment.”
  • “Retrieve react and @types/node with a two-row cap, query cleared and downloads off. Keep reported versions and lookup outcomes without expecting search scores or marking a failed request as confirmed package deletion.”
  • “Collect react and @types/node with a two-row cap, query cleared and last-week downloads enabled. Retain window dates and download status for comparison with my own dated export, without reporting unique users or a daily count.”

Normal Apify charges apply. Check the live Pricing tab before asking your assistant to run a larger batch.

Pay with x402

If your AI agent has a funded wallet, it can pay for Apify usage through x402. This experimental option lets an agent use Apify without a conventional account.

Apify AGI provides a prepaid API token with a spending cap after payment. Your agent can use that token to run this scraper through the Apify API or an authenticated MCP connection.

Some MCP setups also support paying for each request directly. That is a different payment option, so check the official guide for its availability.

Follow the official guide for wallet setup, supported payment options and current terms. Apify handles the payments. Keep wallet keys and payment tokens in your agent's secure configuration.

Other ways for agents to pay

Apify also supports MPP for prepaid access through AGI and Skyfire for eligible Actors. If your agent already uses one of these, see the agentic payment guide to choose the right setup.

FAQ

Why is a package row marked not_found?

The name may be missing, private, or unavailable after repeated public-request failures. Check errorMessage before treating the row as proof that a package does not exist. Private packages and authenticated registry access are unsupported.

Why are download counts empty?

The downloads service can omit a window or temporarily fail. Check downloadCountStatus. Available package metadata remains useful even if enrichment is unavailable. Search metrics and the selected enrichment window may cover different periods. last-week updates weeklyDownloads. last-month updates monthlyDownloads and downloadsLastMonth. The accepted last-day option records window dates and request status but does not save a daily count field. Use a weekly or monthly window when you need a numeric count. Search rows leave license empty. Direct lookups can include it. Direct lookups leave updatedAt empty.

What happens when a run is interrupted?

Already saved rows remain in the dataset. When available, the RUN_SUMMARY key-value record reports the outcome, number saved and next search offset. Inspect the run status and dataset before retrying. A retry is another run, and overlapping successful results can be charged again.

Can I export npm package search results to CSV or use them from an API?

Yes. Export the dataset from Apify, or retrieve its rows through the dataset API. Scores and download counts are optional observations, not a vulnerability assessment or unique-user count.

Can I compare packages over time?

Run with explicit packageNames and save dated exports for your own comparison. Each run is a snapshot. The Actor does not maintain a historical comparison or dependency alert service itself.

Support and feedback

For custom additions or integrations, email hello@fetchcat.dev.

Found an error or have a feature request? Open an issue with the run URL, a non-sensitive input example and what you expected.

Need help sharing it? See Apify’s guide to sharing a run when reporting an issue. Sharing a run can give the developer access to its input, logs and results, so use a run that contains no sensitive data. Please leave out API tokens, passwords, cookies, private documents and personal data. Use a public sample URL or a redacted example instead.

Tried this scraper? We'd love to hear how it worked for you. Leave a review to help others choose the right tool and help us improve it. Your feedback means a lot to us.

Made with care for curious people, AI agents and the possibilities in data. ♥