Skip to content

Product 01

CVE Triage

Is this vulnerability being exploited, and how likely is it to be? One lookup merges the CISA Known Exploited Vulnerabilities catalogue, FIRST EPSS scores and NVD into one flat record with a triage priority.

LiveRefreshed nightly

Open in API reference

Endpoints

EndpointCreditsNotes
GET /v1/cve/{id}1Look up one CVE.
POST /v1/cve/batch1 per 10 idsLook up 1 to 100 CVEs in one call.
GET /v1/cve/recently-exploited?days=7&limit=501CVEs added to the KEV catalogue in the window, enriched.

Lookups are cached for 24 hours (a repeat costs 1 credit). Batch calls take 1 to 100 ids, are never cached, and return results keyed by id, with null for an id that is unknown or suppressed. CVE ids are case insensitive and must match CVE-YYYY-NNNN; anything else returns 422.

Look up one CVE

curl https://api.stackbyte.app/v1/cve/CVE-2021-44228 \
  -H "X-API-Key: $STACKBYTE_KEY"

Look up a batch

curl -X POST https://api.stackbyte.app/v1/cve/batch \
  -H "X-API-Key: $STACKBYTE_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ids": ["CVE-2021-44228", "CVE-2023-4966", "CVE-2024-3400"]}'

Recently exploited

CVEs added to the KEV catalogue in the last days (default 7), enriched with EPSS and NVD data, up to limit results (default 50). Useful as a daily feed into a ticket queue.

Recently exploited
curl "https://api.stackbyte.app/v1/cve/recently-exploited?days=7&limit=50" \
  -H "X-API-Key: $STACKBYTE_KEY"

Record fields

Keys follow the Elastic Common Schema vulnerability.* fields where one exists, and everything Stackbyte adds lives under stackbyte.*. The record is flat: each key is a single string containing dots, not a nested object, so it maps straight to a column in Splunk, Sentinel, a data warehouse or a spreadsheet. A field with no value is null, never guessed.

FieldMeaning
vulnerability.idThe CVE id, for example CVE-2021-44228.
vulnerability.enumerationAlways CVE.
vulnerability.descriptionEnglish description from NVD.
vulnerability.classificationScoring system of the score below: CVSS.
vulnerability.score.baseCVSS base score from NVD.
vulnerability.score.versionCVSS version of that score, for example 3.1.
vulnerability.severitySeverity from the CVSS score, lower case: critical, high, medium, low.
vulnerability.cwe[]CWE ids, for example CWE-917.
vulnerability.reference[]Reference URLs from NVD.
stackbyte.kev.listedtrue if the CVE is in the CISA KEV catalogue.
stackbyte.kev.date_addedDate CISA added it to the catalogue.
stackbyte.kev.due_dateRemediation due date CISA set for US federal agencies.
stackbyte.kev.vendor_projectVendor or project named by CISA.
stackbyte.kev.productProduct named by CISA.
stackbyte.kev.nameCISA's name for the vulnerability.
stackbyte.kev.required_actionThe action CISA requires.
stackbyte.kev.known_ransomware_campaign_useKnown or Unknown, as published by CISA.
stackbyte.epss.scoreProbability of exploitation activity in the next 30 days, 0 to 1.
stackbyte.epss.percentileRank of that score among all scored CVEs, 0 to 1.
stackbyte.epss.model_versionEPSS model that produced the score.
stackbyte.epss.score_dateDate of the EPSS score.
stackbyte.nvd.publishedWhen NVD published the CVE.
stackbyte.nvd.last_modifiedWhen NVD last changed the record.
stackbyte.nvd.statusNVD's analysis status, for example Analyzed.
stackbyte.nvd.cvss_vectorThe CVSS vector string.
stackbyte.triage.priorityP1, P2, P3 or P4 (rules below).
stackbyte.triage.reasonWhy the record got that priority, in words.
stackbyte.sources[]Ids of the sources that contributed to this record, for example cisa-kev.

Triage rules

The first rule that matches sets the priority.

PriorityRule
P1Listed in CISA KEV (exploited in the wild).
P2EPSS 0.5 or higher, or CVSS 9 or higher with EPSS 0.1 or higher.
P3CVSS 7 or higher, or EPSS 0.1 or higher.
P4Everything else.

The rules rank by evidence of exploitation first, then likelihood, then severity. They are a starting order, not a replacement for knowing your own exposure: a flaw in software you do not run can wait whatever its priority.

Splunk

Score the CVEs your scanner reports once a night, write the result to a lookup file, then join it in any search. open_cves.json holds {"ids": [...]} with up to 100 ids per call; loop for more.

# Score the CVEs your scanner found and write a Splunk lookup file.
# Run nightly from cron on a search head, after the scanner import.
curl -s -X POST https://api.stackbyte.app/v1/cve/batch \
  -H "X-API-Key: $STACKBYTE_KEY" -H "Content-Type: application/json" \
  -d @open_cves.json \
| jq -r '["cve","priority","epss","kev","ransomware"],
    (.data | to_entries[] | select(.value != null) | [
      .key,
      .value["stackbyte.triage.priority"],
      .value["stackbyte.epss.score"],
      .value["stackbyte.kev.listed"],
      .value["stackbyte.kev.known_ransomware_campaign_use"]
    ]) | @csv' \
> "$SPLUNK_HOME/etc/apps/search/lookups/stackbyte_cve.csv"

Microsoft Sentinel

KQL externaldata cannot send an API key header, so pull the scores in with a Logic App and query them from a custom table:

  1. Recurrence trigger, once a day after your vulnerability data refreshes.
  2. HTTP action: POST https://api.stackbyte.app/v1/cve/batch with header X-API-Key (from Key Vault) and body {"ids": [...]}.
  3. Send the records to a custom table, for example StackbyteCve_CL, through the Logs Ingestion API with a data collection rule that maps stackbyte.triage.priority to TriagePriority, stackbyte.epss.score to EpssScore and stackbyte.kev.listed to KevListed.
KQL
// StackbyteCve_CL: filled daily by a Logic App (see steps above),
// columns CveId, TriagePriority, EpssScore, KevListed.
let triage = StackbyteCve_CL
    | where TimeGenerated > ago(2d)
    | summarize arg_max(TimeGenerated, *) by CveId;
DeviceTvmSoftwareVulnerabilities
| join kind=inner triage on CveId
| where TriagePriority in ("P1", "P2")
| summarize Devices = dcount(DeviceId) by CveId, TriagePriority, EpssScore, KevListed
| order by TriagePriority asc, EpssScore desc

DeviceTvmSoftwareVulnerabilities comes from Microsoft Defender Vulnerability Management; any table with a CVE id column works the same way.

Sources and licences

SourceLicenceRefreshed
CISA KEVCC0 1.0Nightly
FIRST EPSSFIRST EPSS usage agreement, attribution requestedNightly (daily scores)
NVD API 2.0US government work; NVD API terms of useNightly, incremental
Our NVD copy began with the records NVD changed in the 120 days before our first import and adds every change since. An older CVE whose NVD record has not changed since then can return with its NVD fields as null. KEV and EPSS cover every CVE they list.

Every response carries these attribution sentences, and so does this page:

  • Includes data from the CISA Known Exploited Vulnerabilities Catalog (CC0). Not endorsed by CISA.
  • EPSS scores by FIRST.org (https://www.first.org/epss/), used with attribution as requested by FIRST.
  • This product uses the NVD API but is not endorsed or certified by the NVD. CVE is a registered trademark of The MITRE Corporation.

Data attribution

  • Includes data from the CISA Known Exploited Vulnerabilities Catalog (CC0). Not endorsed by CISA.
  • EPSS scores by FIRST.org (https://www.first.org/epss/), used with attribution as requested by FIRST.
  • This product uses the NVD API but is not endorsed or certified by the NVD. CVE is a registered trademark of The MITRE Corporation.
  • Stackbyte Limited is not affiliated with any government entity or data publisher. Sources and licences are listed on our data sources page.