Developer tools · Coming soon

npm Package Metadata and Release Monitor

List up to 100 npm packages and get one row for each. You see the latest version, release dates, license and weekly downloads. It also shows new releases since a date.

Built and tested. Prices will be shown after release.

Coming soon to the Apify StoreFollow us on Apify

What you get, for example

packageNameexpress
npmUrlhttps://www.npmjs.com/package/express
registryUrlhttps://registry.npmjs.org/express

How it will work: 3 steps

  1. Follow us on ApifyThe tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
  2. Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example: react in npm packages. Each start is one run.
  3. Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.

What it does

Check up to 100 npm packages in one run and get one row per package: the latest dist-tag, the highest stable semver version, release dates, declared license, repository, maintainers count, deprecation and weekly downloads. The data comes from the public npm registry and the npm downloads API, with no login or API key.

  • latestVersion is the version the latest dist-tag points to. This is what npm install <name> installs.
  • highestStableVersion is the highest non-prerelease version by semver order.

Good for

  • Watch your project's dependencies and see which ones had new releases since last week.
  • Build a table of packages with license, repository, maintainers count and deprecation.
  • Compare weekly downloads and release activity of several packages.

Not a good fit

  • It is not a security scanner. It does not check vulnerabilities, malware or code. latestHasProvenance only says that npm has a build attestation for the latest version.
  • It does not verify licenses. license is what the package author declared.
  • It reads only the public npm registry. Private registries, GitHub Packages and other registries are not supported.
  • It does not resolve dependency trees and does not read your package.json or lock file. You list the package names.

Who uses it

Development teams

See which dependencies had new releases since your last upgrade.

Tech leads

Build a package table with license, repository and deprecation.

Open source watchers

Compare weekly downloads and release activity of several packages.

Price

Prices will be shown after release.

Questions

Does it tell me if a package is safe?

No. It is not a security scanner. Use our OSV vulnerability scanner for that.

Can it read my package.json?

No. You type the package names yourself.

Does it work with private registries?

No. It reads only the public npm registry.

Why is latest lower than highest stable?

The latest tag is set by the author. It can point to an older line on purpose.

Do I need an npm account or token?

No. The Actor reads only public data from the npm registry and the npm downloads API.

Why is latestVersion lower than highestStableVersion?

The latest dist-tag is set by the package authors. Sometimes they publish a new version for an old line, or they move latest back. latestVersion is what npm install gives you; highestStableVersion is the highest stable number.

How fresh is the data?

Each row is read from the registry during the run. fetchedAt shows when, and sourceUpdatedAt shows when the registry document last changed.

Details

Step by step on Apify
  1. Open the Input tab.
  2. In npm packages (packages), keep the prefilled names (react, express, lodash, @types/node, typescript) or add your own.
  3. Keep the other settings as they are.
  4. Click Start.
  5. Open the Output tab and check the Packages view: latestVersion, highestStableVersion, license and weeklyDownloads.
Use cases
TaskInputKey fieldsNext step
Weekly dependency release checkpackages, monitorKey, onlyNewReleasesnewReleases, latestVersion, deprecatedSend the Dataset to Slack or email with an Apify integration
"What changed since our last upgrade?"packages, sinceDatenewReleases, latestIsHighestStablePlan upgrades
Package inventorypackageslicense, repositoryUrl, maintainersCount, deprecatedExport to CSV or Excel
Compare packagespackagesweeklyDownloads, daysSinceLastRelease, versionsCountSort in a spreadsheet
Tips for better results
  • Run it every week and send the results to Slack or email.
  • Look at both latest and highest stable version. They can be different.
  • Check the deprecation field. It shows packages you should replace.
Limits and good to know
  • Up to 100 unique packages per run. For more, start several runs
  • The Actor stops its own work at about 4 minutes of a 5-minute default timeout. In tests, 100 large packages (React, TypeScript, AWS SDK and others) took 53 seconds
  • A safety limit of 120 MB applies to each registry document; a bigger document gives a row with status error and code SOURCE_TOO_LARGE. The largest documents we tested (about 31 MB, packages like next and aws-sdk) took a few seconds each
  • If the npm downloads API fails, package rows are still written with weeklyDownloads: null and status partial
  • If the npm registry fails or does not answer, the Actor retries a few times and then stops asking. The rest of the packages are listed as skipped, and the run summary status is PARTIAL or ERROR. These rows are not charged
  • Download counts are npm's own numbers and can change after the week ends

For developers

Sample result

One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.

one result · JSON
{
  "input": "express",
  "packageName": "express",
  "status": "complete",
  "npmUrl": "https://www.npmjs.com/package/express",
  "registryUrl": "https://registry.npmjs.org/express",
  "description": "Fast, unopinionated, minimalist web framework",
  "latestVersion": "5.3.0",
  "distTags": { "latest": "5.3.0", "latest-4": "4.22.3" },
  "highestStableVersion": "5.3.0",
  "highestVersion": "5.3.0",
  "latestIsHighestStable": true,
  "versionsCount": 290,
  "prereleaseVersionsCount": 43,
  "deprecatedVersionsCount": 173,
  "createdAt": "2010-12-29T19:38:25.450Z",
  "modifiedAt": "2026-10-09T12:56:55.078Z",
  "latestPublishedAt": "2026-10-09T12:56:54.505Z",
  "lastReleaseAt": "2026-10-09T12:56:54.505Z",
  "lastStableReleaseAt": "2026-10-09T12:56:54.505Z",
  "daysSinceLastRelease": 3,
  "license": "MIT",
  "repositoryUrl": "https://github.com/expressjs/express",
  "repositoryRaw": "git+https://github.com/expressjs/express.git",
  "repositoryDirectory": null,
  "homepage": "https://expressjs.com/",
  "bugsUrl": "https://github.com/expressjs/express/issues",
  "maintainersCount": 5,
  "deprecated": false,
  "deprecationMessage": null,
  "latestHasProvenance": true,
  "latestDependenciesCount": 28,
  "latestUnpackedSize": 76638,
  "nodeEngine": ">= 18",
  "weeklyDownloads": 144987450,
  "downloadsPeriod": { "start": "2026-10-05", "end": "2026-10-11" },
  "recentReleases": [
    { "version": "5.3.0", "publishedAt": "2026-10-09T12:56:54.505Z", "isPrerelease": false, "deprecated": false },
    { "version": "4.22.3", "publishedAt": "2026-09-14T06:46:38.631Z", "isPrerelease": false, "deprecated": false }
  ],
  "newReleases": null,
  "newReleasesCount": null,
  "baselineKind": "none",
  "baselineAt": null,
  "unpublishedAt": null,
  "provider": "npm public registry (registry.npmjs.org) and npm downloads API (api.npmjs.org)",
  "fetchedAt": "2026-10-12T14:34:04.374Z",
  "sourceUpdatedAt": "2026-10-09T12:56:55.078Z",
  "error": null
}
Data fields (40)
FieldTypeMeaning
inputstringThe entry as you typed it (before normalising links and version suffixes).
packageNamestringExact npm package name that was looked up. null for invalid entries.
statusstringcomplete: all requested data; partial: metadata ok but weekly downloads missing (see error); not_found: npm has no such package (404) — not an error; unpublished: package existed but all versions were removed; invalid: not a valid npm name, no request made; error: lookup failed (see error). Only complete and partial rows are charged.
npmUrlstringPackage page on npmjs.com.
registryUrlstringRegistry document URL the data came from.
descriptionstringPackage description from the registry (up to 2000 characters).
latestVersionstringVersion the latest dist-tag points to — what npm install <name> installs. Not necessarily the highest version; compare with highestStableVersion.
distTagsobjectAll dist-tags (latest, next, beta, canary…) and the versions they point to.
highestStableVersionstringHighest published non-prerelease version by semver precedence. null when only prereleases exist.
highestVersionstringHighest published version by semver precedence, prereleases included.
latestIsHighestStablebooleantrue when latestVersion equals highestStableVersion; false when the latest tag lags behind (or points to a prerelease); null when unknown.
versionsCountintegerNumber of published versions currently in the registry.
prereleaseVersionsCountintegerHow many of those versions are prereleases (or not valid semver).
deprecatedVersionsCountintegerHow many versions carry a deprecation message.
createdAtstringWhen the package was first published (ISO 8601, UTC).
modifiedAtstringWhen the registry document last changed (any version, tag or metadata).
latestPublishedAtstringWhen the latestVersion was published.
lastReleaseAtstringNewest publish time of any version, prereleases included.
lastStableReleaseAtstringNewest publish time of a stable (non-prerelease) version.
daysSinceLastReleaseintegerWhole days since lastStableReleaseAt (since lastReleaseAt when includePrereleases is on). null when unknown.
licensestringLicense of the latest version as declared (usually an SPDX expression, e.g. MIT or (MIT OR Apache-2.0)). Not verified against the code. null when not declared.
repositoryUrlstringSource repository normalised to an https URL (credentials and .git removed). null when not declared or not a web URL.
repositoryRawstringRepository value exactly as declared in package.json.
repositoryDirectorystringSubdirectory inside a monorepo, when declared.
homepagestringHomepage declared by the latest version.
bugsUrlstringIssue tracker URL declared by the latest version.
maintainersCountintegerNumber of npm accounts listed as maintainers. Names and emails are not output.
deprecatedbooleantrue when the latest version is deprecated by its author.
deprecationMessagestringAuthor's deprecation message for the latest version.
latestHasProvenancebooleantrue when the latest version was published with an npm provenance attestation. A signal of build origin, not a security verdict.
latestDependenciesCountintegerNumber of runtime dependencies of the latest version (dependencies only, not dev/peer).
latestUnpackedSizeintegerUnpacked size of the latest version in bytes, when the registry reports it.
nodeEnginestringengines.node range of the latest version, e.g. ">= 18".
weeklyDownloadsintegerDownloads in the last full week from the npm downloads API. 0 means zero downloads; null means unknown (turned off or the downloads API failed).
downloadsPeriodobjectDate range (start, end) the weeklyDownloads count covers.
recentReleasesarrayNewest versions with publish dates, newest first (maxRecentReleases items; prereleases only with includePrereleases).
newReleasesarrayVersions published since the baseline (sinceDate or previous run with the same monitorKey), newest first. [] means none; null means no baseline yet (first monitored run) or no baseline requested.
newReleasesCountintegerNumber of items in newReleases. null when there is no baseline.
baselineKindstringWhat newReleases is compared with: snapshot (previous run with the same monitorKey), sinceDate, initial (first monitored run for this package), none (no monitoring requested).
baselineAtstringBaseline time: the newest publish time seen in the previous run, or sinceDate.
Input settings (7)

The main fields of the input form. With the API you send them as JSON.

SettingName in the APITypeExample value
npm packages requiredpackagesarray["react", "express", "lodash", "@types/node", "typescript"]
Include prereleasesincludePrereleasesbooleanfalse
New releases since datesinceDatestring
Monitor key (compare with previous run)monitorKeystring
Only output packages with new releasesonlyNewReleasesbooleanfalse
Include weekly downloadsincludeDownloadsbooleantrue
Recent releases per packagemaxRecentReleasesinteger10

Start on Apify

Make a free Apify account: you get $5 of free usage every month. Missing a tool? Suggest it. We read every idea, but we do not promise to build it.

Apify links on this page are affiliate links. We may earn a commission. You pay the same price. Affiliate disclosure