CYBERSECURITYTRACKER
TRACKING6,506 stories in this site build1,309 vulnerability news stories in this site build
Developers

JSON API

The site is built from static JSON shards, and those shards are the API. They are read-only, published at documented paths that may change, and served with Cross-Origin Resource Sharing (CORS) enabled so you can fetch them from anywhere. See the changelog for migrations.

Live sample and corpus counters

First record from the latest published day shard, 2026-09-12:

{
  "title": "Cylake Gets $245M to Build Cloud-Free Cybersecurity Platform",
  "url": "https://healthcareinfosecurity.com/cylake-gets-245m-to-build-cloud-free-cybersecurity-platform-a-32807",
  "category": "industry",
  "published_at": null,
  "first_seen_at": "2026-09-12T19:05:38Z",
  "source_count": 1
}

Evidence and timing vocabulary

Source reported means the named source asserted the fact. Corroborating observation marks an independent external observation. Tracker computed and Tracker inference are Cybersecurity Tracker outputs, not statements by the named source.

Source last published is when the source published the material. Source last updated is when the source last changed the material. Tracker last fetched is when Cybersecurity Tracker retrieved it. Tracker last fetched never substitutes for Source last published or Source last updated.

In /data/meta.json, last_updated is Tracker data as of. A per-artifact generated_at is This dataset exported at, which is when that dataset was written and is not the same measurement as the site wide Tracker data as of. Afetched_at value is Tracker last fetched. A field is Source last published only where its endpoint contract identifies the value as source-supplied.

Endpoints

PathReturns
/data/index.jsonAvailable day and month shard keys plus generated_at, bucket_basis, bucket_timezone, day_pages, and day_counts. day_pages gives the number of ordered files for each day; day_counts gives the complete item count.
/data/days/YYYY-MM-DD.jsonThe first byte-bounded slice of items first tracked on one UTC calendar day (hot window, last 90 days), falling back to publisher time only when first-tracked time is unusable. A day with more than one slice continues at /data/days/YYYY-MM-DD/2.json through the day_pages count. Concatenate items in page order for the complete day. The publisher date remains as Source last published when supplied; first_seen_at is tracker ingestion time, not Source last published. generated_at, bucket_basis, and bucket_timezone define membership.
/data/months/YYYY-MM.jsonArchived items bucketed by first-tracked time in UTC, falling back to publisher time only when needed; generated_at, bucket_basis, and bucket_timezone travel with every shard.
/data/rollups/YYYY-MM.jsonMonthly rollup: top clusters, CISA KEV additions, and leaderboard, with an explicit period state and census timezone. Incomplete current months carry comparison_period: null and omit prior_stats and every delta. Completed months compare only complete calendar months; comparison_period defines both populations alongside each emitted delta. Ransomware activity uses disclosed_at in the named census timezone; undated claims are counted separately and excluded from dated series.
/data/rollups/index.jsonAvailable rollup months.
/data/vulns_index/manifest.jsonCount and shards for the lean CVE table index below. The former single-file index reached the deploy-size cap, so the bounded shards keep any one file from growing without limit.
/data/vulns_index/{n}.jsonLean table-index shards: every CVE retained in the currently published tracker export, sorted by priority tier (tier-major, then within-tier score) and split across shards in that order. Each row carries only the table columns: id, vendor, product, CVSS, EPSS (including the seven day EPSS delta epss_delta_7d and the measured age of its comparison point, epss_delta_7d_days), Source reported exploitation-catalog flags including CISA catalog membership (cisa_kev), Tracker computed status (tracker_exploitation_status), mentions, priority tier and score, exposure, and dates. Detail fields (so_what, the priority breakdown, evidence, SSVC, references, ATT&CK techniques, and so on) live in the per-CVE shards below. Concatenate shards 0 to shards-1 from the manifest, in order, for the complete index.
/data/vulns/{n}.jsonPer-CVE detail shards (250 CVEs each): the full stored record for every CVE in the lean index above, including optional source-specific version_evidence (NVD applicability trees; source-quoted CVE Program CNA/ADP configuration, platform, and module qualifiers; canonical CVE Record Format 5.1.1+ CPE-applicability JSON; GitHub package ranges; vendor fixed versions; and Canonical standard Ubuntu/Ubuntu Pro release and source-package fixed versions joined by the exact upstream CVE; specialized FIPS, BlueField, and appliance ecosystems are outside this source's scope). A condition date is its container update date when available, otherwise the CVE record update or publication date. Missing version evidence means unknown, never unaffected; a missing conditions member makes no unrestricted-applicability claim. Locate a CVE's shard with /data/vulns/shardmap.json (cve_id -> shard number); /data/vulns/manifest.json gives the shard count and size for bulk reassembly. A single-file bulk export of the same indexed CVEs with all fields is moving to an R2 public bucket; until then, reassemble from the shards.
/data/exploits/manifest.jsonExploit-DB catalog descriptor: attribution, total (the full catalog size), shown (the rows the shards carry), verified_total (entries Exploit-DB has marked verified, counted over the whole catalog), shard_size, and shards. Nothing is capped, so total and shown are always equal. The producer counts both from the same catalog, so they can never disagree, and neither one detects a missing shard. Use shown as the count YOUR reassembly must reach: concatenate the shards below in order and compare your own row count against it.
/data/exploits/{n}.jsonExploit-DB entry shards (records array), metadata and Exploit-DB links only, each entry with its referenced CVEs. Ordered newest first by Source last published date across the whole set, so shard 0 holds the most recent entries; concatenating shards 0 to shards-1 from the manifest gives the complete catalog in that order. This replaced the single capped exploits.json, which shipped only the most recent entries.
/data/ics_advisories.jsonCISA ICS (OT) advisories from CISA's CSAF documents: Source reported CVSS, CWE, affected vendors and products, critical infrastructure sectors, mitigations, and the CVEs each advisory names. max_cvss is null (never 0) when unscored.
/data/cloud_vulns.jsonOpen Cloud Vulnerability Database (OCVDB) cloud vulnerabilities, a distinct entity keyed on slug and tracked separately from the CVE table: affected platforms and services, a Tracker inference remediation posture, severity, and any CVEs each entry names (usually none). The posture is a Cybersecurity Tracker judgment based on OCVDB's remediation guidance, not an OCVDB assertion. Severity and absent fields are null (never 0). CC BY 4.0.
/data/vendor_patches/manifest.jsonCross-vendor Patch Day descriptor: generation and attribution metadata, independent per-vendor totals and coverage, the complete row count, fixed row boundary, and shard count. Fetch every numbered shard below in ascending order and verify your assembled row count equals count.
/data/vendor_patches/{n}.jsonComplete Android, Cisco, and Red Hat patch rows in fixed 3,000-row shards. A calendar month may continue in the next shard; concatenate adjacent fragments with the same month. This replaces the retired /data/vendor_patches.json URL without cutting any row or field.
/data/malicious_packages_index.jsonOpenSSF Malicious Packages (open-source supply-chain compromises) in Open Source Vulnerabilities (OSV) format, keyed on the malicious-package identifier and tracked separately from the Common Vulnerabilities and Exposures (CVE) table (a malicious package has no CVE identity); the lean index carries the identifier, ecosystem, package name, dates, a joined-story flag, a reference count, and the detail shard number. The recent-window population is applied again at export and defined by window_days, window_start, window_end, and date_rule (newest valid publisher or modification date; undated records retained). A notable row has a named finder, a tracked story, or a non-boilerplate origin. The index reports the complete and notable ecosystem counts, story total, and bulk total. Metadata and links only; package payloads are never mirrored. Apache-2.0.
/data/malicious_packages/{n}.jsonPer-record malicious-package detail shards (records array): the full record for every notable package, including malicious versions, summary, Common Weakness Enumeration (CWE) identifiers, finder credit, package URL (purl), references, and a joined story link where present. Each index row carries its shard number; /data/malicious_packages/manifest.json gives the shard count and size. Metadata and links only.
/data/malicious_packages.csvThe full recent-window malicious-package population as id, name, and ecosystem columns for software composition analysis (SCA) tools. Its data-row count equals total in malicious_packages_index.json, including records not listed as notable.
/data/lifecycle.jsonendoflife.date product lifecycle for crosswalk-mapped products only (an unmapped product is absent, so it carries no lifecycle claim): per release cycle the release date, End of Support (support ends, patches usually continue) and End of Life (patches stop) dates kept distinct, extended support, and a Tracker computed per-cycle status. That status is a Cybersecurity Tracker judgment calculated from the source dates, not a status asserted by endoflife.date. A boolean or absent date is null and yields an "unknown" status, never a guess. Includes a vendor coverage ratio over the vulnerability corpus and the honest coverage limitation. MIT, endoflife.date.
/data/breaches_index.jsonConfirmed-breach facts are Source reported, and leak-site entries are Unverified claim records. The compact index carries kind, org, source, sector, country, claiming group, dates, individuals_affected, and the complete stored description and summary, plus the honest source-composition headline and the government-source reconciliation note. individuals_affected represents a Source reported count only; when the index-level index_carries_affected flag is true, an absent value on a row means the source supplied no count, never zero. A RansomLook claim may carry delisted_at, the date it was confirmed no longer listed on the leak site. That is a Corroborating observation only, never a confirmation of payment, negotiation, or resolution, and it is present only on claims that have been delisted. The government metadata grid, cross-source reconciliation, filing history, and affected-site context remain in the row's shard.
/data/breaches/{n}.jsonPer-breach detail shards (records array): the FULL entry for every breach (description or one-line SEC filing summary, the government metadata grid, cross-source reconciliation, the SEC filing history, and HIBP's optional organization_homepage_url). The organization homepage is affected-site context only and never substitutes for the row's source URL. Each index row carries its shard number; /data/breaches/manifest.json gives the shard count and size.
/data/stats.jsonMonthly ransomware claim counts by group and sector, item volume, and CISA KEV additions. generated_at plus periods.as_of state the as-of instant; periods.months marks each month complete or month_to_date; periods.item_window gives exact inclusive item-window endpoints; methodology states each series population and event-date rule. Ransomware months use disclosed_at in census_timezone; claims_without_disclosure_date is the separately labeled undated remainder.
/data/calendar.jsonCompliance calendar entries (includes upcoming CISA directive deadlines).
/data/directives.jsonCurated CISA Binding Operational and Emergency Directives, with status, compliance deadlines, and named CVEs.
/data/attack_navigator_layer_v4_5.jsonATT&CK Navigator layer (layer format 4.5): per-technique heat scored by the count of distinct CVEs with an exploitation mapping in the MITRE Engenuity Center for Threat-Informed Defense (CTID) Known Exploited Vulnerabilities (KEV) mappings snapshot. Import it into the ATT&CK Navigator. The scores are a floor (most known-exploited CVEs carry no technique mapping); the sample basis travels in the layer's own metadata. Absent (404) until the CTID mappings are ingested; the filename carries the layer format version, so a future format bump is a new path.
/data/sigma_pack.jsonDownloadable Sigma detection rule pack: the rules referenced by the tracker's ATT&CK technique index (the techniques the tracked CVE corpus maps to, not the full SigmaHQ corpus), each with its verbatim rule YAML, author attribution, and back-link, under the embedded Detection Rule License 1.1 notice. The attribution, the link, and the licence notice must travel with the rules if you redistribute them. Absent (404) until Sigma rules are ingested.
/data/misp/manifest.jsonStatic MISP feed (manifest plus one event JSON per month plus hashes.csv, the layout a MISP instance consumes directly: point a feed at this manifest URL with source format MISP). One event per month of CISA Known Exploited Vulnerabilities catalog additions, carrying the CVE id, the date CISA added it, the CISA KEV known-ransomware-campaign-use flag, and the Tracker computed priority tier in the attribute comment. Source reported United States government public-domain facts and the separately labeled Cybersecurity Tracker judgment only; commercially licensed corroborator-only rows are excluded. Absent (404) until CISA KEV rows are ingested.
/data/meta.jsonTaxonomy, personas, vendor feed list, and Tracker data as of (last_updated).
/rss/vendor/{slug}.xmlPer-vendor RSS feed, top 200 vendors. Slugs come from meta.json.
/rss/exploits.xmlExploit-DB entries feed: recent public exploit and PoC metadata, linking out to Exploit-DB.
/rss/custom?cats=…&vendors=…Merged RSS built from any mix of categories and vendor slugs.
POST /mcpA Model Context Protocol (MCP) server (protocol revision 2025-06-18) over this same public data, so an artificial intelligence assistant can query it directly. It is a stateless, read-only JSON-RPC (JavaScript Object Notation Remote Procedure Call) endpoint: send a POST with an Accept of application/json. Tools are search_vulnerabilities, get_vulnerability, list_recent_breaches, and get_corpus_insights. It reads only these public shards, never any operator page. See the Model Context Protocol section below.

Examples

Every data endpoint below is a plain HTTPS GET. The examples cover curl, Python with requests, and PowerShell. The one exception is the Model Context Protocol server, which is a POST; it has its own section below.

A day of stories

index.json lists the available day keys, complete item counts, and page counts. Fetch the root and every numbered continuation in order for a complete day. published_at is Source last published when the feed supplied it; first_seen_at is tracker ingestion time, not Source last published.

curl
day=2026-09-12; pages=$(curl -s https://cybersecuritytracker.ai/data/index.json | jq -r --arg day "$day" '.day_pages[$day] // 1'); for page in $(seq 1 "$pages"); do if [ "$page" = 1 ]; then path="$day.json"; else path="$day/$page.json"; fi; curl -s "https://cybersecuritytracker.ai/data/days/$path"; done | jq -s '[.[].items[]] | .[:5] | map({title, url, category})'
Python
import requests

base = "https://cybersecuritytracker.ai"
day = "2026-09-12"
index = requests.get(f"{base}/data/index.json", timeout=30).json()
items = []
for page in range(1, index.get("day_pages", {}).get(day, 1) + 1):
    path = f"{day}.json" if page == 1 else f"{day}/{page}.json"
    items.extend(requests.get(f"{base}/data/days/{path}", timeout=30).json()["items"])
for item in items[:5]:
    print(item["title"], "->", item["url"])
PowerShell
$base = "https://cybersecuritytracker.ai"
$day = "2026-09-12"
$index = Invoke-RestMethod "$base/data/index.json"
$pages = if ($index.day_pages.$day) { $index.day_pages.$day } else { 1 }
$items = 1..$pages | ForEach-Object {
  $path = if ($_ -eq 1) { "$day.json" } else { "$day/$_.json" }
  (Invoke-RestMethod "$base/data/days/$path").items
}
$items | Select-Object -First 5 title, url

Tracked vulnerabilities

The lean index ships as vulns_index/manifest.json (count, shards) plus vulns_index/{n}.json shards, in priority order. Sharding keeps any single file from growing without bound. Each row carries the table columns (cvss_score, cvss_version, epss_score, epss_delta_7d, epss_delta_7d_days, cisa_kev, tracker_exploitation_status, mover_reasons, priority_tier, priority_score, ...). cisa_kev is Source reported CISA catalog membership; tracker_exploitation_status is Tracker computed through the Cybersecurity Tracker's single exploitation ladder. epss_delta_7d is a raw score delta (a fraction, for example 0.03), never a percent, and epss_delta_7d_days is the actual age in days of the prior reading it compares against: normally exactly seven, and genuinely older when ingest was interrupted, because the fourteen day floor is an outage tolerance rather than a cadence. Both are absent, never 0, for a CVE with no retained prior reading. Detail fields (so_what, the priority breakdown, evidence, SSVC) are in the per-CVE shards under /data/vulns/; fetch a CVE's shard via /data/vulns/shardmap.json.

curl
for i in $(seq 0 $(($(curl -s https://cybersecuritytracker.ai/data/vulns_index/manifest.json | jq '.shards')-1))); do curl -s https://cybersecuritytracker.ai/data/vulns_index/$i.json; done | jq -s '[.[].vulns[] | select(.cisa_kev)] | length'
Python
import requests

manifest = requests.get("https://cybersecuritytracker.ai/data/vulns_index/manifest.json", timeout=30).json()
vulns = []
for i in range(manifest["shards"]):
    vulns += requests.get(f"https://cybersecuritytracker.ai/data/vulns_index/{i}.json", timeout=30).json()["vulns"]
movers = [v for v in vulns if v.get("mover_reasons")]
for v in movers[:5]:
    print(v["cve_id"], v["cvss_score"], v["mover_reasons"])
PowerShell
$manifest = Invoke-RestMethod "https://cybersecuritytracker.ai/data/vulns_index/manifest.json"
$vulns = 0..($manifest.shards - 1) | ForEach-Object { (Invoke-RestMethod "https://cybersecuritytracker.ai/data/vulns_index/$_.json").vulns }
$vulns | Where-Object { $_.cisa_kev } | Select-Object -First 5 cve_id, vendor, cvss_score

Breaches and claims

breaches_index.json is the compact index (kind, org, source, sector, dates, individuals_affected, and complete stored description and summary); the government metadata grid, cross-source reconciliation, SEC filing history, and affected-site context remain in each row's shard under /data/breaches/. individuals_affected represents a Source reported count only; when the index-level index_carries_affected flag is true, an absent value on a row means the source supplied no count, never zero. Confirmed-breach facts are Source reported. Leak-site entries are Unverified claim records labeled Claimed by [group]. Unverified, and their descriptions are neutralized summaries, never gang copy.

curl
curl -s https://cybersecuritytracker.ai/data/breaches_index.json | jq '.breaches[] | select(.kind == "confirmed") | .org_name' | head
Python
import requests

breaches = requests.get("https://cybersecuritytracker.ai/data/breaches_index.json", timeout=30).json()["breaches"]
claims = [b for b in breaches if b["kind"] == "claim"]
print(len(claims), "unverified claims")
PowerShell
$b = (Invoke-RestMethod "https://cybersecuritytracker.ai/data/breaches_index.json").breaches
$b | Group-Object kind | Select-Object Name, Count

Cross-vendor patches

The manifest declares every numbered shard and the complete row count. Fetch shards 0 through shards-1 in order; a month can span a shard boundary, so merge adjacent month fragments and refuse the result if its row count differs from manifest.count. /data/vendor_patches.json is retired.

curl
base=https://cybersecuritytracker.ai/data/vendor_patches
shards=$(curl -s "$base/manifest.json" | jq -r .shards)
for n in $(seq 0 $((shards-1))); do curl -s "$base/$n.json"; done
Python
import requests

base = "https://cybersecuritytracker.ai/data/vendor_patches"
manifest = requests.get(f"{base}/manifest.json", timeout=30).json()
months = []
for shard in range(manifest["shards"]):
    payload = requests.get(f"{base}/{shard}.json", timeout=30).json()
    for fragment in payload["months"]:
        if months and months[-1]["month"] == fragment["month"]:
            months[-1]["patches"].extend(fragment["patches"])
        else:
            months.append({"month": fragment["month"], "patches": list(fragment["patches"])})
rows = sum(len(month["patches"]) for month in months)
if rows != manifest["count"]:
    raise RuntimeError(f"incomplete vendor patches: {rows}/{manifest['count']}")
data = {key: manifest[key] for key in
        ("generated_at", "attribution", "vendor_totals", "coverage")}
data["months"] = months
print(rows, "vendor patches across", len(data["months"]), "months")
PowerShell
$base = "https://cybersecuritytracker.ai/data/vendor_patches"
$manifest = Invoke-RestMethod "$base/manifest.json"
$rows = for ($n = 0; $n -lt $manifest.shards; $n++) {
  (Invoke-RestMethod "$base/$n.json").months.patches
}
if ($rows.Count -ne $manifest.count) { throw "Incomplete vendor patches" }
$rows | Select-Object -First 5 vendor, advisory_id, cve_id

Ransomware statistics

Monthly ransomware claim counts by group and sector, exact-window item volume, and CISA KEV additions by month. Read periods and methodology with the arrays: they carry the as-of instant, month completeness, exact item-window endpoints, and each count's population/event-date rule.

curl
curl -s https://cybersecuritytracker.ai/data/stats.json | jq '.ransomware_by_group[:5]'
Python
import requests

stats = requests.get("https://cybersecuritytracker.ai/data/stats.json", timeout=30).json()
for row in stats["ransomware_by_group"][:5]:
    print(row["month"], row["group_name"], row["n"])
PowerShell
(Invoke-RestMethod "https://cybersecuritytracker.ai/data/stats.json").ransomware_by_group |
  Select-Object -First 5 month, group_name, n

Metadata and taxonomy

Categories, personas, the vendor feed list, and Tracker data as of in last_updated. Use vendor_feeds to discover valid vendor slugs.

curl
curl -s https://cybersecuritytracker.ai/data/meta.json | jq '.vendor_feeds[:5]'
Python
import requests

meta = requests.get("https://cybersecuritytracker.ai/data/meta.json", timeout=30).json()
slugs = [v["slug"] for v in meta["vendor_feeds"]]
print(len(slugs), "vendor feeds, e.g.", slugs[:3])
PowerShell
$meta = Invoke-RestMethod "https://cybersecuritytracker.ai/data/meta.json"
$meta.vendor_feeds | Select-Object -First 5 slug, name

Vendor feeds

Static per-vendor RSS for the top 200 vendors, plus a dynamic merged feed. The vendors parameter accepts any number of slugs from meta.json; unknown slugs are rejected, and URLs over 4096 characters return 414.

curl
curl -s https://cybersecuritytracker.ai/rss/vendor/fortinet.xml | head -20
curl -s "https://cybersecuritytracker.ai/rss/custom?cats=vulnerabilities&vendors=microsoft,cisco"
Python
import feedparser  # pip install feedparser

feed = feedparser.parse("https://cybersecuritytracker.ai/rss/custom?vendors=microsoft,cisco")
for entry in feed.entries[:5]:
    print(entry.title)
PowerShell
$rss = [xml](Invoke-WebRequest "https://cybersecuritytracker.ai/rss/vendor/fortinet.xml").Content
$rss.rss.channel.item | Select-Object -First 5 title

Custom RSS

One dynamic endpoint builds a merged feed from any combination of category and vendor slugs:

GET /rss/custom?cats=vulnerabilities,ransomware&vendors=microsoft,cisco

Both parameters are optional but at least one is required. Unknown slugs are rejected with 400, request URLs over 4096 characters return 414, and the feed carries a 15-minute cache header. Build one interactively on the feeds page, which also exports your vendor selection as an Outline Processor Markup Language (OPML) file.

Model Context Protocol (MCP) server

The same public data is available through a Model Context Protocol server so an artificial intelligence assistant can query it directly. It is a stateless, read-only endpoint at /mcp speaking JSON-RPC 2.0 (protocol revision 2025-06-18): POST a JSON-RPC message with an Accept of application/json. It holds no session and no private data, and every tool reads only the public shards documented above, never an operator page.

Four tools are exposed: search_vulnerabilities (filter the priority-ranked corpus by text, CISA KEV membership, the Cybersecurity Tracker's exploitation status, and tier),get_vulnerability (one CVE's full record),list_recent_breaches, andget_corpus_insights. Results are truncated to a limit and report total_matched, so a capped list is never mistaken for a complete one.

curl
# 1. Initialize the session
curl -s -X POST https://cybersecuritytracker.ai/mcp \
  -H 'content-type: application/json' -H 'accept: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl","version":"1"}}}'

# 2. List the tools
curl -s -X POST https://cybersecuritytracker.ai/mcp \
  -H 'content-type: application/json' -H 'accept: application/json' \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'

# 3. Call a tool: the top 5 CISA KEV CVEs by tracker priority
curl -s -X POST https://cybersecuritytracker.ai/mcp \
  -H 'content-type: application/json' -H 'accept: application/json' \
  -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"search_vulnerabilities","arguments":{"cisa_kev_only":true,"limit":5}}}'

Fair use

There are no keys and no hard rate limits on the data shards. Be a good neighbor: honor the cache headers, keep sustained polling at or under one request per second, and poll no faster than the thing you are polling is cached. The data shards cache for5 minutes, the ready-made feeds for5 minutes, and a feed you build yourself for 15 minutes. The pipeline publishes on a schedule, so faster polling only re-reads identical bytes. If you need bulk history, fetch the monthly shards once rather than iterating the day shards.

Attribution

Known downstream consumer: evulnable.com uses Cybersecurity Tracker data for fixed versions and vendor actions.

Ransomware leak-site data is an Unverified claim sourced fromRansomLook and is licensed CC BY 4.0: if you re-expose breach or actor data from this API, keep that attribution. Source reported vulnerability facts come from CISA Known Exploited Vulnerabilities (KEV), the National Vulnerability Database (NVD), the Exploit Prediction Scoring System (EPSS) by FIRST, and vendor advisories. This product uses data from the NVD API but is not endorsed or certified by the NVD.

Per-CVE scanner_detections entries cover only factual Greenbone OpenVAS Community Feed VT mappings and ProjectDiscovery Nuclei template mappings. They are Tracker computed mappings and are preserved across failed source refreshes. Their presence supplies neither Tracker last fetched nor Source last published and does not prove current upstream presence. They are not scan results or detection guarantees. Greenbone data is ODbL 1.0; Nuclei templates are MIT. Keep the complete notices published on theattributions page when re-exposing them.

Adversary technique, group, and mitigation data comes from MITRE ATT&CK. © 2026 The MITRE Corporation. This work is reproduced and distributed with the permission of The MITRE Corporation. The KEV-to-ATT&CK technique mappings and the ATT&CK-to-NIST 800-53 control mappings come from the MITRE Engenuity Center for Threat-Informed Defense (CTID), used under Apache 2.0; keep both attributions if you re-expose that data.

The complete public attribution register for every source whose data is re-exposed by these API artifacts is available at/attributions. The same source and licence and obligation set is embedded in /data/meta.json; downstream consumers must preserve the applicable credit, source link, licence link, non-commercial/share-alike condition, notice, or disclaimer recorded in each entry's obligation field.

Changelog

  • 2026-08-26Attribution obligations are now machine-readable.Every /data/meta.json attribution entry additively carries the exact obligation text from the public attribution register alongside its existing source and licence fields.
  • 2026-08-20Breaking change: retired /data/vendor_patches.json. The complete, unchanged corpus now ships as/data/vendor_patches/manifest.json plus ordered numbered shards under /data/vendor_patches/. Fetch shards0 through shards - 1, merge adjacent fragments of the same month, and verify the assembled row count equals manifest.count. Integrators with the old URL hardcoded must migrate to the manifest and shard paths.
  • 2026-08-19Retired the monolithic vulns_index.json: the lean CVE table index now ships as /data/vulns_index/manifest.json(count, shards) plus its numbered shards under/data/vulns_index/, in the same priority order as before. The single file was heading for the same deploy-size cap the original vulns.json split (below) was written to dodge; sharding removes the ceiling rather than raising it, so index growth no longer risks a blocked deploy. Every field and every row is unchanged. The older /data/vulns_index.json path is gone; use the manifest and its shards.
  • 2026-08-16/data/vulns_index.json gained two fields:epss_delta_7d, the change in a CVE's EPSS score against its retained prior reading, and epss_delta_7d_days, the measured age in days of that prior reading. The delta is a raw score fraction (for example 0.03), never a percent. The age is normally exactly seven and is genuinely older when ingest was interrupted, so read the movement against the age rather than against the field name. Both are absent, never 0, for a CVE with no retained prior reading. epss_delta_7d was previously documented here as a detail field found only in the per-CVE shards; it is now an index field, and that sentence has been corrected.
  • 2026-07-30Retired the capped exploits.json: the Exploit-DB catalog now ships in full as /data/exploits/manifest.json plus entry shards under /data/exploits/. The old file carried only the most recent 20,000 of 46,636 entries; nothing is capped now, so the manifest's total and shown are equal, and it adds verified_total counted over the whole catalog. The /data/exploits.json path is gone, and the MCP search_exploits tool now searches every entry. The 2026-07-08 entry below predates this change and describes the now-retired file.
  • 2026-07-17Added a Model Context Protocol (MCP) server at /mcp: a stateless, read-only JSON-RPC endpoint (protocol revision 2025-06-18) over this same public data, with tools for searching the priority-ranked vulnerability corpus, fetching one CVE's full record, listing recent breaches, and reading the corpus insights. It reads only the public shards and holds no session or private data. See the Model Context Protocol section above.
  • 2026-07-17Added sigma_pack.json (a downloadable Sigma rule pack scoped to the tracker's technique index, with per-rule author attribution, back-links, and the embedded Detection Rule License 1.1 notice) and a static MISP feed under /data/misp/(manifest, one event per month of CISA Known Exploited Vulnerabilities additions, and hashes.csv; point a MISP instance's feed at the manifest URL). The MISP feed carries United States government public-domain facts plus the tracker's own priority tier only.
  • 2026-07-17Added attack_navigator_layer_v4_5.json: a downloadable ATT&CK Navigator layer (format 4.5) whose technique heat counts distinct CVEs with an exploitation mapping in the CTID Known Exploited Vulnerabilities mappings snapshot. The file is absent until those mappings are ingested, and the sample basis ships in the layer's own metadata.
  • 2026-07-16Retired the monolithic malicious_packages.json andbreaches.json: both now ship as a lean<name>_index.json plus per-record detail shards under /data/malicious_packages/ and/data/breaches/, fetched on demand, matching the vulnerabilities layout. The malicious-package bulk count (bulk_total) and the breach composition and reconciliation notes are unchanged. The older malicious_packages.json andbreaches.json paths are gone; use the indexes and their shards.
  • 2026-07-13Retired the monolithic vulns.json: the corpus now ships as a lean vulns_index.json plus per-CVE detail shards under /data/vulns/, fetched on demand, so no single file approaches Cloudflare's 25 MiB per-file cap. The oldervulns.json path is gone; use the index and its shards. The two entries below predate this change and describe the now-retired file.
  • 2026-07-08Added the Exploit-DB browse file /data/exploits.json and the /rss/exploits.xml feed (metadata and Exploit-DB links only). vulns.json gained anexploits array per CVE, and breaches.jsongained url_is_onion.
  • 2026-07-06Added per-vendor RSS feeds, the vendors parameter on/rss/custom, and monthly rollups under/data/rollups/. vulns.json gainedcvss_version, epss_delta_7d,mentions_48h, mover_reasons, andmover_score. meta.json gainedvendor_feeds.
  • 2026-07-06Removed the five-category cap on /rss/custom. Added per-persona feeds and why_it_matters on stories.
  • 2026-07-01Initial public API: day and month shards, vulnerabilities, breaches, stats, calendar, and metadata.

Glossary