Package Vulnerability Check API: CVEs, CISA KEV, safe upgrade
Coming soon to the StoreIs this package version vulnerable, is any of it exploited in the wild, and which version is safe to upgrade to? One call answers it for npm, PyPI, Maven, Go, crates.io, NuGet, RubyGems and Packagist packages, or for one CVE/GHSA id, from OSV.dev and the CISA KEV catalog (a CVE lookup also shows NVD's record). Built for coding agents and for developers who want a sourced answer instead of a scanner setup.
Pricing (pay per event): $0.005 per answer (package-check, $5 per 1,000). A clean "no known vulnerabilities" is a real answer and is charged once the package is confirmed to exist; bad input, a misspelled or unreleased package, an unknown id or a dead source fails in seconds and costs nothing.
Questions agents ask
- “Before I bump lodash in package.json: is 4.17.15 vulnerable, is anything exploited, and what is the lowest safe version? Cite the advisories.”
Example
Input
{ "ecosystem": "PyPI", "name": "requests", "version": "2.32.5" }Output
{
"schema_version": "1",
"query_type": "package",
"ecosystem": "npm",
"name": "lodash",
"version": "4.17.15",
"vulnerability_id": null,
"summary": "npm lodash 4.17.15: 5 known vulnerabilities (max severity HIGH), none in CISA KEV; safe version: 4.18.1.",
"vulnerability_count": 5,
"known_exploited": false,
"max_severity": "HIGH",
"safe_version": "4.18.1",
"safe_version_note": "4.18.1 is the lowest version above 4.17.15 among the advisories' fixed versions with no known vulnerability in OSV.dev (checked with OSV, not a release-list scan).",
"epss": null,
"nvd": null,
"vulnerabilities": [
{
"id": "GHSA-r5fr-rjxr-66jc",
"aliases": ["CVE-2026-4800"],
"summary": "lodash vulnerable to Code Injection via `_.template` imports key names",
"severity": "HIGH",
"cvss_score": 8.1,
"cvss_vector": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H",
"published": "2026-04-01T23:51:12Z",
"modified": "2026-10-17T02:56:15.633068434Z",
"fixed_versions": ["4.18.0"],
"affected_ranges": [
{ "ecosystem": "npm", "name": "lodash", "introduced": "4.0.0", "fixed": "4.18.0", "last_affected": null }
],
"known_exploited": false,
"kev": null,
"source_db": "GitHub Advisory Database",
"license": "CC BY 4.0",
"source_url": "https://osv.dev/vulnerability/GHSA-r5fr-rjxr-66jc"
},
{
"id": "GHSA-p6mc-m468-83gw",
"aliases": ["CVE-2020-8203"],
"summary": "Prototype Pollution in lodash",
"severity": "HIGH",
"cvss_score": 7.4,
"cvss_vector": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:H",
"published": "2020-07-15T19:15:48Z",
"modified": "2025-08-12T21:56:17.174859Z",
"fixed_versions": ["4.17.19"],
"affected_ranges": [
{ "ecosystem": "npm", "name": "lodash", "introduced": "3.7.0", "fixed": "4.17.19", "last_affected": null }
],
"known_exploited": false,
"kev": null,
"source_db": "GitHub Advisory Database",
"license": "CC BY 4.0",
"source_url": "https://osv.dev/vulnerability/GHSA-p6mc-m468-83gw"
}
],
"source_url": "https://osv.dev/list?ecosystem=npm&q=lodash",
"provided_by": "Bosco Labs (boscolabs.dev)",
"attribution": "Advisories via OSV.dev from: GitHub Advisory Database (CC BY 4.0). Reformatted by Bosco Labs; cvss_score is computed by Bosco Labs from the advisory's CVSS v3 vector. Known-exploited status: CISA Known Exploited Vulnerabilities catalog (CC0 1.0); no endorsement by CISA or DHS.",
"warnings": [],
"checked_at": "2026-11-06T08:59:29+00:00",
"duration_seconds": 1.2
}What you get
| Field | Type | Meaning |
|---|---|---|
schema_version | string | Output schema version. |
query_type | string | "package" (ecosystem + name [+ version]) or "vulnerability" (one CVE/GHSA id). |
ecosystem | string | null | Ecosystem as OSV names it (npm, PyPI, Maven, Go, crates.io, NuGet, RubyGems, Packagist); null in vulnerability mode. |
name | string | null | Package name as given; null in vulnerability mode. |
version | string | null | Version checked; null = all versions (or vulnerability mode). |
vulnerability_id | string | null | The CVE/GHSA id asked for, normalised (e.g. CVE-2021-44228); null in package mode. |
summary | string | One sentence an agent can pass on: count, max severity, CISA KEV status and the safe version (package), or severity, KEV and affected packages (id). |
vulnerability_count | integer | null | Package mode: number of distinct known vulnerabilities (duplicates across databases merged), even when vulnerabilities lists only the 40 most severe; 0 = none known (the package was found in its registry, or see warnings). Null in vulnerability mode. |
known_exploited | boolean | null | True when any listed vulnerability is in the CISA Known Exploited Vulnerabilities catalog; false when none is; null when the catalog could not be loaded (see warnings). |
max_severity | string | null | Highest severity among the vulnerabilities: CRITICAL, HIGH, MODERATE or LOW (GitHub's label, else from the CVSS v3 score); null when unknown or none. |
safe_version | string | null | Package mode with a version: the lowest fixed version above it that OSV reports as having no known vulnerability (the version itself if it is clean). Null without a version, when none was found, or in vulnerability mode. |
safe_version_note | string | null | How safe_version was found, or why there is none (e.g. no fix published). |
epss | object | null | Vulnerability mode: FIRST EPSS {cve, score (0-1 probability of exploitation activity in the next 30 days), percentile, date, source_url}; null otherwise or when unavailable. |
nvd | object | null | Vulnerability mode: NVD record {cve, cvss_score, cvss_severity, cvss_vector, cvss_version, cwe_ids, published, last_modified, vuln_status, description, source_url}; descriptions over 1,000 characters are shortened and marked as shortened by Bosco Labs; null otherwise or when NVD did not answer. |
vulnerabilities | array | Known vulnerabilities, most severe first (known exploited, then severity, then CVSS), at most 40; vulnerability mode: one item. |
source_url | string | OSV.dev page for the package or the vulnerability id. |
provided_by | string | Who compiled this row; cite together with source_url. |
attribution | string | Licence and source notices for the data in this row (GitHub Advisory Database CC BY 4.0, CISA KEV, FIRST EPSS, NVD notice, MITRE CVE terms, deps.dev). Keep it when you republish. |
warnings | array | Optional sources that failed (KEV, EPSS, NVD, registry existence check), advisories omitted for licence reasons, or a capped list, in plain words. |
checked_at | string | When the check ran (ISO 8601, UTC). |
duration_seconds | number | Time the check took. |
Use with AI agents (MCP)
Add this URL to your MCP client (Claude, Cursor, VS Code, ...) to load the Actor as a tool through the Apify hosted MCP server. It signs you in with OAuth or accepts Authorization: Bearer <APIFY_TOKEN>. It works once the Actor is live on the Apify Store.
https://mcp.apify.com?tools=bosco_labs/package-vulns
For “Before I bump lodash in package.json: is 4.17.15 vulnerable, is anything exploited, and what is the lowest safe version? Cite the advisories.” the agent passes:
{ "ecosystem": "npm", "name": "lodash", "version": "4.17.15" }
one JSON item (2-15 KB), stable snake_case fields, ISO dates, null for unknown, a one-sentence summary, an OSV link per advisory. Bad input fails at once with a valid example. A package check takes about 1 second; each source has a 15-second limit with two retries.
Or call the Apify API: POST https://api.apify.com/v2/acts/bosco_labs~package-vulns/run-sync-get-dataset-items with the input as JSON body. Cost: $0.005 per answer.
HTTP API
Also on the Bosco Labs HTTP API (beta, test mode): same input and same rows as the Actor, $0.005 per package version or CVE answered from prepaid credits (max 1 check per call). Get a key with a $0.50 free trial; see prices and limits.
curl https://api.boscolabs.dev/v1/package-vulns \
-H "Authorization: Bearer $BOSCO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"ecosystem": "npm", "name": "lodash", "version": "4.17.15"}'
Input fields
| Field | Type | Meaning |
|---|---|---|
ecosystem | string | Package registry of name, e.g. "npm". One of npm, PyPI, Maven, Go, crates.io, NuGet, RubyGems, Packagist (also accepted: pip, cargo, rust, golang, composer, gem; any case). Needed with name; ignored when vulnerabilityId is set. No default. |
name | string | Package name exactly as in its registry, e.g. "lodash", "requests", "org.apache.logging.log4j:log4j-core" (Maven = group:artifact) or "github.com/gin-gonic/gin" (Go module path). When OSV has no advisory, the name (and version) is checked in the registry index; an unknown package fails free of charge. Ignored when vulnerabilityId is set. |
version | string | Exact version to check, e.g. "4.17.15" (Go: "v1.9.0"). OSV.dev decides whether it falls in an affected range. With a version you also get safe_version: the lowest fixed version above it with no known vulnerability. Empty = every advisory for the package at any version (the 40 most severe are listed, no safe_version). |
vulnerabilityId | string | One vulnerability id instead of a package, e.g. "CVE-2021-44228" or "GHSA-jfh8-c2jp-5v3q" (PYSEC-, GO-, RUSTSEC-, MAL- and OSV- ids work too). Returns the affected packages and version ranges, CISA KEV status, the FIRST EPSS score and NVD's CVSS. When set, the package fields are ignored. Empty = package mode. |
Sources, licence and limits
Where does the data come from? OSV.dev, Google's open vulnerability database, which collects the GitHub Advisory Database, the PyPA, Go and RustSec databases, OpenSSF malicious-package reports and more. OSV decides whether your exact version is in an affected range (we never re-implement version rules). Exploit status comes from the CISA KEV catalog (downloaded fresh every run); for a CVE/GHSA id we add FIRST's EPSS score and NVD's record.
Is a clean answer charged? Yes, once we know the package is real. "No known vulnerabilities in OSV.dev" is the answer you asked for and costs $0.005 like any other. Nothing is charged when the input is invalid, the package or version does not exist, the id is unknown or OSV.dev does not answer.
Does it check that the package or version exists? Yes, whenever OSV.dev has no advisory for it: the name (and version) is looked up in the registry index (deps.dev for npm, PyPI, Maven, Go, crates.io, NuGet and RubyGems; Packagist for PHP). Not found = the run fails with "check the spelling" and costs nothing. Releases from the last few hours may not be indexed yet. If the index itself is down, you get the answer with the warning "Existence not verified". When OSV does have advisories, the package is reported even if it was removed from its registry (for example a malicious package).
How fresh is it? Live: OSV.dev, KEV, EPSS and NVD are queried on every run. OSV imports new GitHub advisories within minutes to hours; brand-new CVEs can take a day to appear.
How is safe_version chosen, and what are its limits? We take the fixed versions from the advisories, keep those above your version, and ask OSV which of them have no known vulnerability. If all are hit by other advisories, we follow those advisories' fixed versions (three rounds). It is not a scan of every release: a clean version that no advisory names as "fixed" is not proposed, and it ignores semver majors (check breaking changes yourself). Versions are ordered numerically; pre-release tags are not ranked precisely. Without a version there is no safe_version: the newest fixed version could be older than what you run.
Why is cvss_score sometimes null? OSV records carry CVSS vectors, not scores. We compute the CVSS v3 base score from the vector (FIRST's formula); v4-only advisories keep the vector and a null score. In CVE mode, nvd.cvss_score is NVD's own score.
What is not included? Operating-system packages (Debian, Ubuntu, Alpine, Red Hat), container images and transitive dependencies: pass each package you care about. Advisories from sources whose licence forbids commercial reuse (Chainguard/Wolfi, CC BY-NC-ND) are omitted, with a warning naming them.
Can I republish the results? Keep the attribution text. Licences, checked first-hand on 6 Nov 2026: - OSV.dev lists a licence per source (osv.dev data sources). We use only: GitHub Advisory Database, PyPA, Go and OSS-Fuzz data (CC BY 4.0, which requires credit and noting changes: each item names its source_db and license), RustSec (CC0 1.0), OpenSSF Malicious Packages (Apache 2.0) and NVD-converted CVE records (NVD is a US government work in the public domain; CVE content is used under MITRE's CVE Terms of Use, whose copyright line is in attribution). - CISA KEV: "The KEV database is distributed under the Creative Commons 0 1.0 License" (license.txt); no CISA endorsement is implied. - FIRST EPSS: "Attribution is requested when EPSS data is used in publications or products" (EPSS FAQ); FIRST's Services Terms license distribution for vulnerability disclosure, incident response or preventative cybersecurity uses. - NVD: This product uses the NVD API but is not endorsed or certified by the NVD (NVD terms of use). NVD descriptions over 1,000 characters are shortened and marked as shortened by Bosco Labs. - deps.dev (existence check only): its data is "available under a CC-BY 4.0 license" and the API is used under the Google API Terms of Service (deps.dev); only a yes/no is used.
Personal data? None. Advisories describe software, not people.