npm Packages Search Scraper
Pricing
from $0.07 / 1,000 package results
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
11 days ago
Last modified
Categories
Security
Limited permissionsShare
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
- Open Input and enter a search in
query, or add exact names topackageNames. - Set
maxItemsto a small limit and start the run. - 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
| Setting | JSON key | What it controls |
|---|---|---|
| Search text | query | npm registry keyword search. Leave empty for direct names only. |
| Exact names | packageNames | Public package names, including scoped names such as @types/node. |
| Row limit | maxItems | At most 1,000 saved rows across both modes, including status rows. |
| Download counts | includeDownloads | Optional enrichment, enabled by default. |
| Download window | downloadPeriod | last-day, last-week or last-month (default). |
| Maintainer usernames | includeMaintainers | Include public usernames when available. Enabled by default. |
| Deduplication | dedupe | Save 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.
| Fields | Meaning |
|---|---|
packageName, scope, version | Package identity and current reported version. |
description, keywords, license | Public registry metadata when available. |
publisherUsername, maintainerUsernames | Public npm usernames, not verified contact details. |
repositoryUrl, homepageUrl, bugsUrl, npmUrl | Source links for further investigation. |
scoreFinal, scorePopularity, scoreQuality, scoreMaintenance, searchScore | Scores when returned by npm search. Not security or reliability guarantees. Direct lookups leave these empty. |
weeklyDownloads, monthlyDownloads, downloadsLastMonth | Available weekly/monthly metrics. downloadsLastMonth is populated only for last-month enrichment. |
downloadsWindowStart, downloadsWindowEnd | Dates reported for the requested download window. |
dependents | Dependent count when included in search results. |
downloadCountStatus | Whether enrichment succeeded, was unavailable or was not requested. |
status, errorMessage, source | Row outcome and search/direct origin. |
updatedAt, fetchedAt | Source 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 osfrom apify_client import ApifyClientclient = 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
- Claude and Claude Code (Anthropic): Apify setup guide.
- ChatGPT and Codex (OpenAI): Apify setup guides.
- Grok Bot (xAI): Apify plugin guide.
- Gemini CLI (Google): MCP server setup guide. Use the server URL below with the HTTP configuration supported by Gemini CLI.
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.
Related Actors
- GitHub Repositories Search — Investigate repositories behind a package shortlist.
- GitHub Trending — Compare package research with repository discovery.
- GitHub Profile Scraper — Explore public developer profiles linked from repositories.
- GitHub Issues & Pull Requests — Review public project activity.
- Hacker News Search — Find public discussions of tools and libraries.
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. ♥