npm Package Monitor: Versions, License & Downloads avatar

npm Package Monitor: Versions, License & Downloads

Pricing

from $0.56 / 1,000 package records

Go to Apify Store
npm Package Monitor: Versions, License & Downloads

npm Package Monitor: Versions, License & Downloads

Check up to 100 npm packages per run: latest dist-tag and highest stable semver, release dates, license, repository, maintainers count, deprecation, weekly downloads, and new releases since a date or since the last run.

Pricing

from $0.56 / 1,000 package records

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Security

Limited permissions

Share

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.

Use it to watch your dependencies for new releases (since a date or since your last run) or to build a package metadata table. A run with the five prefilled packages takes a few seconds and costs about $0.0055.

npm Package Release Monitor: list your npm packages, get one row per package with latest dist-tag, highest stable version, license, downloads, and the new releases since a date or since your last run

Table of contents

What it does

You give a list of npm package names. For each name, the Actor reads the package document from the npm registry and, if you want, the last-week download count from the npm downloads API. It writes one Dataset row per package.

The Actor keeps two version answers apart:

  • 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.

They are often the same, but not always. For example, a project can publish a fix for an old major line after the new major. latestIsHighestStable tells you if they match.

The Actor can also report new releases: versions published since a date (sinceDate) or since the previous run with the same monitorKey.

Good fit

  • 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 fit / limits

  • 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.

What data you get

GroupFields
VersionslatestVersion, highestStableVersion, highestVersion, latestIsHighestStable, distTags, versionsCount, prereleaseVersionsCount, deprecatedVersionsCount
DatescreatedAt, latestPublishedAt, lastReleaseAt, lastStableReleaseAt, daysSinceLastRelease, recentReleases
Package factsdescription, license, repositoryUrl, homepage, bugsUrl, maintainersCount, deprecated, deprecationMessage, latestHasProvenance, latestDependenciesCount, latestUnpackedSize, nodeEngine
PopularityweeklyDownloads, downloadsPeriod
MonitoringnewReleases, newReleasesCount, baselineKind, baselineAt
Provenance of datastatus, provider, fetchedAt, sourceUpdatedAt, error

Maintainer names and email addresses are never output. You get only maintainersCount.

Quick start

  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.

Expected result: one row with status complete for each package, in a few seconds.

Input

FieldPlain nameTypeRequiredDefaultAllowed valuesWhat it changesRecommendation
packagesnpm packagesarray of stringsyesprefill: react, express, lodash, @types/node, typescript1–100 unique namesWhich packages to checkUse exact names. Scoped names like @types/node work.
includePrereleasesInclude prereleasesbooleannofalsetrue, falseAdds prereleases (canary, beta, rc…) to recentReleases, newReleases and daysSinceLastReleaseKeep false if you only care about stable releases.
sinceDateNew releases since datestringnoemptyYYYY-MM-DD (UTC) or ISO date-time, not in the futureFills newReleases with versions published on or after this dateUse for a one-time "what changed since…" check.
monitorKeyMonitor keystringnoempty1–63 letters, digits, -, _Remembers what the run saw; the next run with the same key reports only newer versionsUse one key per package list, for example my-app-deps.
onlyNewReleasesOnly output packages with new releasesbooleannofalsetrue, falseWrites only packages with new releases; others are checked but not writtenNeeds sinceDate or monitorKey. Good for scheduled monitoring.
includeDownloadsInclude weekly downloadsbooleannotruetrue, falseAdds weeklyDownloads from the npm downloads APITurn off if you do not need popularity data. The price is the same.
maxRecentReleasesRecent releases per packageintegerno100–100How many newest versions go into recentReleasesUse 0 for smaller rows.

How package names are read. Each entry can be a name (react), a scoped name (@babel/core), an npmjs.com link (https://www.npmjs.com/package/@babel/core) or a name with a version (lodash@4.17.21). The version part is ignored, and the run summary shows a warning. Names are case-sensitive: JSONStream and jsonstream are different packages. Exact repeats are removed before the run. A name that npm cannot have gets a free row with status invalid, and no request is made for it. You can also send packages as one comma- or newline-separated string through the API.

Interacting settings

WhenSetting ASetting BWhat happens
Both are setmonitorKeysinceDatePackages already in the snapshot are compared with the previous run. New packages in the list are compared with sinceDate.
First run with a keymonitorKey—This run is the baseline: newReleases is null and baselineKind is initial. The next run reports changes.
Monitoring onlyonlyNewReleasessinceDate or monitorKeyWithout a baseline the run stops with INVALID_INPUT. Packages without new releases are checked and charged at a lower price, but not written.
PrereleasesincludePrereleasessinceDate / monitorKeyWith false, a new canary or beta is not a new release.

Input examples

Check a few packages (the prefill)

{
"packages": ["react", "express", "lodash", "@types/node", "typescript"]
}

Expected behavior: the Actor reads five registry documents and the download counts. Expected output: five complete rows with latestVersion, highestStableVersion, license, weeklyDownloads. Cost: $0.0055 on the Free plan.

Releases since a date

{
"packages": ["react", "express", "lodash", "@types/node", "typescript"],
"sinceDate": "2026-10-01"
}

Expected output: the same rows, plus newReleases with the versions published on or after 1 October 2026, newest first. [] means no new releases.

Weekly monitoring of your dependencies

{
"packages": ["react", "express", "lodash", "@types/node", "typescript"],
"monitorKey": "my-app-deps",
"onlyNewReleases": true
}

Expected behavior: the first run saves a baseline and writes all packages. Each next run writes only packages with versions published since the previous run. If nothing changed, the run ends with status NO_CHANGES and an empty Dataset.

Output example

This is a real row for express from the prefill run (trimmed: recentReleases shows 2 of 10 items).

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

null and 0 are different. null means unknown or not declared. 0 means the real value is zero. For example, weeklyDownloads: 0 means nobody downloaded the package last week, and weeklyDownloads: null means the count was not requested or the downloads API failed.

Output fields

FieldMeaningTypeCan be null?Example
inputThe entry as you typed itstringnolodash@4.17.21
packageNameExact npm name that was looked upstringyes, for invalidlodash
statusRow result, see the table belowstringnocomplete
npmUrlPackage page on npmjs.comstringyes, for invalidhttps://www.npmjs.com/package/express
registryUrlRegistry document the data came fromstringyes, for invalidhttps://registry.npmjs.org/express
descriptionPackage description (up to 2000 characters)stringyesFast, unopinionated…
latestVersionVersion of the latest dist-tagstringyes5.3.0
distTagsAll dist-tags and their versionsobjectyes{"latest":"5.3.0","next":"…"}
highestStableVersionHighest non-prerelease version by semverstringyes, if only prereleases exist5.3.0
highestVersionHighest version by semver, prereleases includedstringyes19.3.0
latestIsHighestStabletrue if latestVersion equals highestStableVersionbooleanyes, if unknowntrue
versionsCountNumber of published versionsintegeryes290
prereleaseVersionsCountHow many versions are prereleases or not valid semverintegeryes43
deprecatedVersionsCountHow many versions are deprecatedintegeryes173
createdAtFirst publish time (ISO 8601, UTC)stringyes2010-12-29T19:38:25.450Z
modifiedAtLast change of the registry documentstringyes2026-10-09T12:56:55.078Z
latestPublishedAtPublish time of latestVersionstringyes2026-10-09T12:56:54.505Z
lastReleaseAtNewest publish time of any versionstringyes2026-10-09T12:56:54.505Z
lastStableReleaseAtNewest publish time of a stable versionstringyes2026-10-09T12:56:54.505Z
daysSinceLastReleaseWhole days since the last stable release (any release with includePrereleases)integeryes3
licenseDeclared license of the latest version, usually an SPDX expressionstringyes, if not declaredMIT
repositoryUrlRepository as an https URL (credentials and .git removed)stringyeshttps://github.com/expressjs/express
repositoryRawRepository value as declaredstringyesgit+https://github.com/expressjs/express.git
repositoryDirectoryFolder inside a monorepostringyespackages/react
homepageDeclared homepagestringyeshttps://expressjs.com/
bugsUrlDeclared issue trackerstringyeshttps://github.com/expressjs/express/issues
maintainersCountNumber of npm maintainer accountsintegeryes5
deprecatedtrue if the latest version is deprecatedbooleanyesfalse
deprecationMessageThe author's deprecation messagestringyesuse String.prototype.padStart()
latestHasProvenancetrue if the latest version has an npm provenance attestationbooleanyestrue
latestDependenciesCountRuntime dependencies of the latest versionintegeryes28
latestUnpackedSizeUnpacked size of the latest version, bytesintegeryes76638
nodeEngineengines.node range of the latest versionstringyes>= 18
weeklyDownloadsDownloads in the last full weekintegeryes, if off or failed144987450
downloadsPeriodDates the count coversobjectyes{"start":"2026-10-05","end":"2026-10-11"}
recentReleasesNewest versions with dates, newest firstarrayno (can be [])[{"version":"5.3.0",…}]
newReleasesVersions published since the baseline, newest firstarrayyes, if no baseline[]
newReleasesCountNumber of items in newReleasesintegeryes, if no baseline0
baselineKindWhat newReleases is compared with: snapshot, sinceDate, initial, nonestringnonone
baselineAtBaseline timestringyes2026-10-01T00:00:00.000Z
unpublishedAtWhen the package was unpublishedstringyesnull
providerData sourcestringnonpm public registry…
fetchedAtWhen the row was fetchedstringno2026-10-12T14:34:04.374Z
sourceUpdatedAtWhen the registry document last changedstringyes2026-10-09T12:56:55.078Z
errorWhy a row is not complete: code and messageobjectyes{"code":"NOT_FOUND","message":"…"}

Each item in recentReleases and newReleases has version, publishedAt, isPrerelease and deprecated.

Row status

statusMeaningCharged?
completeAll requested data is in the rowyes
partialPackage data is there, but weeklyDownloads is missing (see error)yes
not_foundnpm has no package with this name (HTTP 404). This is an answer, not an errorno
unpublishedThe package existed, but all versions were removedno
invalidNot a valid npm name, no request was madeno
errorThe lookup failed (see error.code)no

Output surfaces

SituationWhere to lookWhat you see
Normal runDataset, view PackagesOne row per package
MonitoringDataset, view New releasesnewReleases, baselineKind, baselineAt
Nothing foundDataset rows with not_found / invalid; run summary status NO_RESULTSCheck the names
No new releases with onlyNewReleasesEmpty Dataset; run summary status NO_CHANGESNothing to do
Source problemRows with error; run summary status PARTIAL or ERRORRun again later

Every run also saves RUN_SUMMARY in the default key-value store: status, counts (complete, not found, invalid, errors, skipped), downloads coverage, baseline and source notes.

Pricing

This Actor uses pay-per-event pricing. You pay only for these events:

EventWhenFreeBronzeSilverGold
Actor startOnce per run (per 1 GB of memory; default memory is 1 GB)$0.0015$0.0015$0.0015$0.0015
Package recordEach complete or partial row written to the Dataset$0.0008$0.00075$0.0007$0.00065
Unchanged package checkWith onlyNewReleases: each package that was checked but had no new releases, so no row was written$0.0002$0.0002$0.0002$0.0002

Rows with not_found, unpublished, invalid and error are free. Weekly downloads do not cost extra. A run where every name is not found or invalid costs only the Actor start.

Cost examples (Free plan prices)

ScenarioInputEventsCost
Prefill5 packages1 start + 5 records$0.0055
Small list10 packages1 start + 10 records$0.0095
Full run100 packages1 start + 100 records$0.0815
1,000 packages10 runs of 10010 starts + 1,000 records$0.815
Monitoring, nothing new100 packages, onlyNewReleases1 start + 100 unchanged checks$0.0215
Monitoring, 3 packages changed100 packages, onlyNewReleases1 start + 3 records + 97 unchanged checks$0.0233

You can set a maximum total charge for a run. When the next event would go over it, the Actor stops early, writes what it has and sets status CAPPED in the run summary. The rest of the packages are listed in skippedPackages.

Use cases

JobInputKey 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

Monitoring and scheduling

  1. Add your packages and a monitorKey, for example my-app-deps.
  2. Run once. This saves the baseline in a named key-value store npm-package-metadata-monitor in your Apify account.
  3. Create an Apify schedule for this input, for example every Monday.
  4. Turn on onlyNewReleases if you want only changed packages in the Dataset.

Each run compares with the newest publish time it saw for each package in the previous run with the same key. The snapshot learns only about packages the run really checked, so a stopped or failed run does not hide releases from the next one. Use a different monitorKey for each package list.

API, export and integrations

  • API: start a run with the Apify API and read the Dataset items. Use ?view=overview for the short table or ?view=releases for monitoring fields.
  • Export: download the Dataset as JSON, CSV, Excel, XML or HTML from the Output tab.
  • Scheduling and webhooks: use Apify schedules to run on a timer and webhooks or integrations (Slack, email, Zapier, Make) to act when a run finishes.

Use with AI agents (MCP)

This Actor works with the Apify MCP server. MCP server URL with only this Actor:

https://mcp.apify.com?tools=cliqtomedia/npm-package-metadata-monitor

Smallest useful input:

{ "packages": ["react", "express"] }

Key output fields: latestVersion (what npm install installs), highestStableVersion (highest stable semver), newReleases (versions since the baseline), license (declared license), deprecated. A run with up to 5 packages usually finishes in under 10 seconds and costs $0.0015 plus $0.0008 per package on the Free plan. The limit is 100 packages per run.

Limits and partial results

  • 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.

Troubleshooting

A package shows not_found

Symptom: status is not_found. Likely reason: the name is wrong or has a different case. npm names are case-sensitive. Action: check the name on npmjs.com. A scoped package needs the scope: @types/node, not node.

weeklyDownloads is null

Symptom: status is partial and error.code is RATE_LIMITED or SOURCE_UNAVAILABLE. Likely reason: the npm downloads API did not answer in time. Action: run again later, or set includeDownloads to false if you do not need downloads.

The run status is NO_CHANGES

Likely reason: no package had new releases since sinceDate or since the previous run with this monitorKey. With onlyNewReleases on, the Dataset is empty. Without it, the Dataset still has all rows, each with newReleasesCount 0. Action: nothing to fix. Turn onlyNewReleases off to see all rows.

newReleases is null

Likely reason: this is the first run with this monitorKey (the baseline), or you did not set sinceDate or monitorKey. Action: run again with the same monitorKey, or add a sinceDate.

The run stops with INVALID_INPUT

Likely reason: more than 100 packages, an empty list, a future sinceDate, a bad monitorKey, or onlyNewReleases without sinceDate or monitorKey. Action: read the status message. It names the field to fix.

FAQ

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.

Does this Actor tell me if a package is safe?

No. It reports what the registry declares: versions, dates, license, repository, deprecation and downloads. It does not check vulnerabilities, malware or the code.

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.

Support

Open an issue in the Issues tab of this Actor for a bug, a question or a feature idea. Include the run ID, your input (package names are fine) and the error text. Never send tokens or passwords.

Data from the public npm registry under the npm Open-Source Terms. This Actor is not affiliated with or endorsed by npm, Inc. or GitHub, Inc.