Skip to content

About CVEminer

CVEminer turns a CVE or GHSA ID into one readable record, built from the public sources security teams already rely on, with the source of every value shown next to it.

Why CVEminer exists

A CVE isn't one advisory

The CVE ID names the vulnerability. The package-level detail you act on (which packages, which versions, which fix) mostly lives in GitHub Security Advisories. The two don't map one to one: a CVE can have several GHSAs, a GHSA can exist without a CVE, and unreviewed GHSAs appear on GitHub but not in OSV. Looking up a CVE in one place often gets you part of the picture.

Sources disagree

The CNA, GitHub and CISA can publish different CVSS vectors for the same CVE. OSV and GitHub can list different affected ranges. The commit an OSV range calls “fixed” is sometimes a release commit rather than the patch. A tool that quietly picks one value hides the disagreement from the person deciding what to do.

Provenance matters

When you're deciding whether to patch tonight, it matters whether a value came from the vendor, from GitHub's reviewers, from CISA, or was computed. Every CVEminer record names the source of each section and links the upstream API, so you can check the raw data yourself.

How a lookup works

The first time anyone looks up an ID, CVEminer runs five steps and shows each one in the search box as it happens. After that, the stored record loads immediately.

  1. Step 1: Resolve aliases

    For a CVE, CVEminer asks three places at once: OSV's record for the CVE, the GitHub Advisory Database filtered by that CVE, and CVE.org. The GitHub advisories (GHSAs) it finds are ranked: the ones OSV lists as aliases first, then GitHub-reviewed, unreviewed and malware advisories, with withdrawn ones last. The first becomes the headline advisory, and the others stay attached so you can switch between them. For a GHSA, the same happens in reverse: the advisory is loaded first and its CVE, if it has one, is resolved from it.

    The ranking matters because the sources don't cover the same ground. CVE-2024-26581, a Linux kernel netfilter bug, has one GitHub advisory, GHSA-92f7-c7hw-58cr, and it's unreviewed. OSV only carries reviewed GHSAs, so asking OSV alone finds no advisory at all. CVEminer falls back to GitHub's API, finds it, and still uses OSV's record for the CVE itself.

    OSV also lists related advisories, which by its definition are different vulnerabilities. CVE-2023-44487 (HTTP/2 Rapid Reset) has related GHSAs for other projects hit by the same attack. CVEminer links them from the record but never merges them into it.

  2. Step 2: Fetch the advisory

    With the headline GHSA chosen, CVEminer loads its OSV record and its GitHub advisory in parallel. OSV supplies the affected packages, version ranges, enumerated versions and PURLs. GitHub supplies CVSS 3.x and 4.0 scores, CWE names, EPSS, first patched versions, vulnerable functions, credits and whether GitHub has reviewed the advisory.

  3. Step 3: Enrich

    Then it adds what the advisory databases don't carry:

    • CVE.org CVE Services: the CNA's own record, plus CISA's ADP enrichment: the SSVC decision points (exploitation, automatable, technical impact) and a CVSS score where CISA added one.
    • CISA KEV catalog: whether the CVE is known to be exploited, the date it was added, the remediation due date, the required action and known ransomware use.
    • FIRST EPSS: the probability of exploitation in the next 30 days, fetched directly when GitHub's advisory doesn't include it.
    • Fix commits: for up to three patch commits on GitHub, the commit message, lines added and removed, and the files changed.
    • NVD: only when no other source has a CVSS score, which happens mostly with older CVEs.
  4. Step 4: Check and normalise

    Upstream data is kept as published, but checked before it's shown:

    • Scores are computed from vectors. OSV publishes CVSS vectors without numbers, so CVEminer calculates the base score for CVSS 2.0, 3.0, 3.1 and 4.0 itself. Every vector is kept with its source, and the newest CVSS version is the headline, as on GitHub.
    • PURLs are validated against the purl-spec. When OSV has no PURL for a package, CVEminer builds one from the ecosystem and package name and labels it Derived.
    • Junk git tags are dropped. OSV records converted from CVE data can enumerate raw repository tags, such as second_try_with_osgi_giveup, as affected versions. Only tags that look like releases are kept.
    • Patch commits are separated from release commits. For CVE-2026-85058 in moquette-broker, the OSV range's fixed commit e8ce833 is “Version bump 0.18.1”; the change that fixes the bug is e23df01. A commit derived from a version number is listed as a release commit, and the patch is listed first.
  5. Step 5: Store and serve

    The finished record is stored in MongoDB and served from there. When someone views a record more than 24 hours after it was fetched, CVEminer refreshes it from upstream in the background. Analysts can correct any section and publish intelligence. Corrections are stored separately from upstream data, so a refresh never overwrites them, and CVEminer flags an edited section when the upstream value changes afterwards.

Data sources

CVEminer only uses public sources. Each record's data sources panel shows which of these answered for that ID, and links to the raw upstream response.

Upstream data sources, what CVEminer takes from each, and their licences
SourceWhat CVEminer usesLicence or terms
OSVAdvisory records, affected packages and version ranges, enumerated versions, PURLs, related advisoriesCC BY 4.0
GitHub Advisory DatabaseCVSS 3.x and 4.0 scores, CWE names, EPSS, patched versions, vulnerable functions, unreviewed advisoriesCC BY 4.0
CVE.org CVE ServicesThe CNA's record; CISA ADP enrichment: SSVC decision points, KEV reference, CVSSCVE Terms of Use
CISA KEV catalogExploitation evidence, date added, due date, required action, known ransomware usePublic domain (U.S. government work)
FIRST EPSSProbability of exploitation in the next 30 days, and its percentilePublished free by FIRST; attributed here
NVDFallback CVSS score, only when no other source has onePublic domain (U.S. government work)

This product uses data from the NVD API but is not endorsed or certified by the NVD.

JSON API

Every record is available as JSON at the same ID it has on the site. The API is read-only, needs no key, and allows requests from any origin (CORS), so you can call it from a browser.

GET /api/vulnerabilities/{id}

{id} is a CVE ID or a GHSA ID, in any letter case.

curl -s https://cveminer.com/api/vulnerabilities/CVE-2021-44228

Response fields

id
The canonical record ID: the GHSA when one exists, otherwise the CVE.
ghsaId, cveId
Both identifiers, or null when one doesn't exist.
record
The normalised record: title, description, severity (every CVSS entry with its source, plus the headline), CWEs, affected packages with PURLs and ranges, fix (versions and commits), references by type, SSVC, KEV, EPSS, other and related GHSAs, and provenance for each section.
intel
Published analyst intelligence: root cause, vulnerable functions, remediation and detection. An empty object when there is none.
fetchedAt
When CVEminer last fetched the record from upstream sources (ISO 8601).

Status codes

200
The record, from CVEminer's store or fetched live.
400
The ID isn't a valid CVE or GHSA ID.
404
No source has a record for this ID. Unknown CVEs are rechecked after an hour.
429
Too many new lookups from your network. The Retry-After header says how many seconds to wait.
502
The upstream sources couldn't be reached, so a new record couldn't be built. Retry later.
500
Something failed on CVEminer's side. Retry later, and tell us if it persists.

Limits and caching

  • New IDs: 20 lookups per 10 minutes per network. A new ID makes CVEminer call up to eight upstream APIs, so these are limited.
  • Cached records: unlimited within fair use.
  • Successful responses may be cached for up to a minute (a few minutes while the cache revalidates). fetchedAt tells you how old the underlying data is.
  • Errors return JSON with an error message that explains what went wrong.

If you need bulk or regular access, tell us what you're building.

FAQ

Where does the data come from?
From public sources: OSV, the GitHub Advisory Database, CVE.org (including CISA's enrichment of CVE records), the CISA Known Exploited Vulnerabilities catalog and FIRST EPSS. NVD is used only when no other source has a CVSS score. Every record names the source of each section. The data sources table lists what each one supplies and its licence.
How fresh is it?
Any CVE or GHSA ID is fetched live the first time anyone looks it up, and new GitHub-reviewed advisories and CISA known-exploited CVEs are added in batches. After that a record is served from CVEminer's store and re-fetched from its sources once it's more than 24 hours old, so upstream changes show up within a day. The list of newly published advisories on the home page is refreshed every hour.
Why do some PURLs say “Derived”?
OSV publishes a Package URL for most packages, but not all. When it doesn't, CVEminer builds one from the ecosystem and package name following the purl-spec rules and labels it Derived. Treat a derived PURL as a well-formed guess and check it against your package manager before you rely on it. A PURL an analyst has checked is labelled Verified.
What does a locked intelligence block mean?
Root cause analysis, remediation guidance and detection rules are written by CVEminer analysts, not pulled from a feed. Vulnerable functions come from GitHub when it lists them, otherwise from an analyst. A locked block means nobody has written that part for this vulnerability yet. Selecting it opens a request with the ID filled in; requests are prioritised by severity and demand.
Is there an API?
Yes. GET /api/vulnerabilities/{id} returns the same record as JSON for any CVE or GHSA ID, with CORS enabled. IDs that aren't in CVEminer yet count towards a limit of 20 new lookups per 10 minutes per network. The API reference has the fields, status codes and an example.
How do I report a mistake?
Use the contact form with the topic “Report a data error”. Include the ID, the field that's wrong and a link to a source that shows the right value. An analyst makes the correction, and the record shows that it was edited.
Why does a CVE URL sometimes show a different GHSA than I expected?
A CVE page shows its headline advisory, chosen by the ranking in step 1. If a CVE has several GHSAs, the record lists the others and you can open any of them by its own ID, for example /vulnerabilities/GHSA-jfh8-c2jp-5v3q.
Can I use the data in my own product?
The underlying data carries its sources' licences (see the table above), and those apply to what you take from CVEminer. For regular or high-volume access, write to us through the partnership form rather than scraping.

What CVEminer isn't

  • It isn't a scanner. CVEminer doesn't see your code, dependencies or infrastructure, and can't tell you whether you're affected. It tells you what's known about a vulnerability so you can check that yourself.
  • It isn't a complete mirror of every CVE. The database holds records someone has looked up, plus batches of new GitHub-reviewed advisories and CISA known-exploited CVEs. Any valid CVE or GHSA ID can still be fetched on demand.
  • It isn't the authority. The CNA, GitHub, OSV and CISA are. CVEminer shows what they publish and where it differs, and marks anything its analysts changed. Verify before acting.

Something wrong, or missing?

Tell us about a data error, ask for an analysis, or write to info@cveminer.com.