BlackTreeIndependent security intelligence← Back to the CVE catalogue
Authenticated integration surface

BlackTree CVE API

A versioned, read-only JSON interface for approved machine clients. The human CVE website remains public and does not require an account.

Quick start

Request the newest 2026 records

Request access from BlackTree, store the issued key in a secret manager, and send it only in the HTTPS Authorization header. A key is displayed once and can be rotated or revoked independently.

curl -H "Authorization: Bearer $BLACKTREE_API_KEY" "https://cve.blacktree.nl/api/v1/cves?year=2026&sort=newest&limit=10"
Version 1

Endpoint reference

All integration endpoints require an Authorization bearer key. Read routes accept GET and HEAD. Bounded matching and enrichment operations accept POST and retain neither input nor results. The aggregate health route remains public.

GET/api/v1/healthNo store

Aggregate service health

Confirms that the catalogue contains current-year records. It exposes aggregate counts and core-source state, never credentials, source errors or infrastructure details.

No parameters.

Successful response
{ status, records, years, lastRefresh, sourcesHealthy }
Error responses
503 when the current-year catalogue is empty; common 405, 429 and 500 error objects.
GET/api/v1/statsNo store

Catalogue statistics

Returns aggregate severity, exploitation, remediation, ENISA EUVD, national-guidance and material-change counts.

Parameters for /api/v1/stats
ParameterAccepted values and limitsMeaning
year2015–2026 or all; default 2026CVE publication-year scope.
Successful response
{ year, supportedYears, yearCounts, total, wild, lab, patched, patchNow, severity, patch, national, coverage, cvssSources, recentChanges, computedAt?, sources, lastRefresh, healthy }
Error responses
401 for an invalid key; 403 for a missing entitlement; common 405, 429 and 500 error objects.
GET/api/v1/cvesPrivate for 60 seconds

Search and filter CVEs

Returns active public CVE records. Rejected identifiers are excluded. Full-text matching uses at most 120 characters and eight terms, and reports when its 500-record search ceiling was reached.

Parameters for /api/v1/cves
ParameterAccepted values and limitsMeaning
year2015–2026 or all; default 2026CVE publication-year scope.
qText, CVE ID or EUVD ID; maximum 120 charactersSearch identifiers, vendor, product, title, description and CWE text.
severityCritical, High, Medium, Low, None, UnknownRepeat or comma-separate values.
patchPatch available, Mitigation available, Awaiting fixRepeat or comma-separate remediation states.
urgencyPatch now, Within 72 hours, Within 7 days, Needs assessment, Scheduled, MonitorRepeat or comma-separate urgency labels.
cvssVersion4.0, 3.1, 3.0, 2.0Repeat or comma-separate scoring versions.
epssMin0 through 1Minimum FIRST EPSS probability; missing scores are excluded.
epssPercentileMin0 through 1Minimum FIRST EPSS percentile; missing scores are excluded.
wildtrueRequire CISA KEV confirmation.
labtrueRequire a recorded public exploit or proof-of-concept reference.
euvdtrueRequire an active official ENISA EUVD mapping.
euKevtrueRequire a current known-exploited record in the ENISA EUVD dataset.
vexStateknown_affected, first_affected, last_affected, under_investigation, fixed, first_fixed, known_not_affected, recommended or noneRepeat or comma-separate vendor product states. none is distinct from known_not_affected.
languagede, es, fr, hu, it, nl, plRepeat or comma-separate national-authority guidance languages.
sortnewest, priority, cvss, epss; default newestResult ordering.
pageInteger 1 or higher; default 1One-based page.
limit10 through 50; default 30Records per page; out-of-range values are clamped.
Successful response
{ items: CveSummary[], total, page, limit, pages, query, year, totalCapped, searchResultLimit }
Error responses
401 for an invalid key; 403 for a missing entitlement; 503 when the bounded search worker is busy; common 405, 429 and 500 error objects.
POST/api/v1/sbom/matchNo store

Transient SBOM and VEX applicability matching

Accepts normalized component identities from a CycloneDX or SPDX SBOM and optional VEX statements. It matches explicit PURL and CPE identifiers first, preserves ambiguous and unmatched components, and does not store the input or result.

Parameters for /api/v1/sbom/match
ParameterAccepted values and limitsMeaning
components1 through 2,000 normalized componentsEach component needs a name, PURL, CPE or explicit CVE ID.
vexStatementsOptional, up to 5,000 statementsApplies affected, under investigation, fixed or known not affected to this response.
Successful response
{ generatedAt, privacy, supported, summary, results: [{ component, status, matches, truncated }] }
Error responses
400 for unsupported input; 401 for an invalid key; 403 for a missing entitlement; 413 above 2 MB; common 429 and 500 error objects.
POST/api/v1/integrations/wazuh/enrichNo store

Wazuh CVE enrichment

Accepts only CVE identifiers from Wazuh and returns separate severity, exploitation, EPSS, remediation, vendor, authority and recent-change evidence. It rejects asset and agent context, stores neither input nor results, and never produces a composite BlackTree score.

Parameters for /api/v1/integrations/wazuh/enrich
ParameterAccepted values and limitsMeaning
cveIds1 through 250 CVE identifiersUnique vulnerability identifiers from active Wazuh findings. Hostnames, IP addresses, agent IDs, inventories and logs are not accepted.
Successful response
{ generatedAt, privacy, summary, unmatched, results: [{ id, severity, exploitation, epss, remediation, vendorEvidence, authorityGuidance, recentChanges, reportUrl }] }
Error responses
400 for invalid or additional input; 401 for an invalid key; 403 without the integrations entitlement; 413 above 32 KB; 503 when the isolated query lane is busy; common 429 and 500 error objects.
GET/api/v1/cves/{id}Private for 60 seconds

Complete CVE report

Returns one source-attributed report, including ENISA EUVD context, national guidance, vendor CSAF/VEX, references, reciprocal BlackTree articles, EPSS history and material-change history when available.

Parameters for /api/v1/cves/{id}
ParameterAccepted values and limitsMeaning
idCVE-YYYY-NNNN or longer; path parameterCase-insensitive CVE identifier. The response uses uppercase.
Successful response
CveSummary fields plus euvd[], references[], nationalGuidance[], vendorAdvisories[], blacktreeArticles[], epssHistory[] and changeHistory[]. Optional evidence remains null or an empty array rather than being inferred.
Error responses
401 for an invalid key; 403 for a missing entitlement; 404 when the ID is absent or outside the supported publication scope; common 405, 429 and 500 error objects.
GET/api/v1/changesNo store

Recent material changes

Returns CVEs grouped by meaningful, source-attributed changes. Identical refreshes and cosmetic edits are excluded.

Parameters for /api/v1/changes
ParameterAccepted values and limitsMeaning
year2015–2026 or all; default 2026CVE publication-year scope.
window24h or 7d; default 24hPreset look-back when since is absent.
sinceISO 8601 date-timeExplicit start time, bounded to the most recent 90 days.
categoryrecord, cvss, severity, exploitation, remediation, affected, guidance, coverageRepeat or comma-separate change categories.
pageInteger 1 or higher; default 1One-based page.
limit10 through 50; default 30CVEs per page; out-of-range values are clamped.
Successful response
{ items: [{ cve, latestChangedAt, changeCount, importance, changes[] }], total, page, limit, pages, since, window }
Error responses
401 for an invalid key; 403 for a missing entitlement; common 405, 429 and 500 error objects.
GET/api/v1/sitemapPrivate for 900 seconds

Bounded sitemap data

Supplies the public XML sitemap routes. Integrators should use the catalogue endpoint instead of treating this route as a bulk export.

Parameters for /api/v1/sitemap
ParameterAccepted values and limitsMeaning
yearRequired integer 2015–2026One publication year; all is not supported.
pageInteger 1 or higher; default 1One-based shard page.
limit1,000 through 10,000; default 10,000Rows per shard; out-of-range values are clamped.
Successful response
{ year, page, limit, total, items: [{ id, modified }] }
Error responses
400 for an unsupported year; 401 for an invalid key; 403 for a missing entitlement; common 405, 429 and 500 error objects.
Stable expectations

Responses, errors and versioning

Successful responses

Responses use application/json; charset=utf-8. Dates are ISO 8601 in machine fields. Human-formatted companion fields may also be present. Missing evidence is represented explicitly and must not be interpreted as low risk.

Error shape

{ "error": "Human-readable message", "code": "machine_readable_code" }

Error responses use the same JSON content type and are not cached. Authentication failures do not reveal whether a key was expired, revoked or unknown.

Version policy

Compatible fields may be added inside /api/v1. Existing fields will not silently change meaning. Breaking changes require a new major path. Consumers should ignore unknown fields.

HTTP status codes
StatusMeaning
200Request succeeded.
400A route-specific required value is unsupported.
401The bearer API key is missing, malformed, expired, revoked or inactive.
403The API key plan does not include the required endpoint entitlement.
404Endpoint or CVE not found.
405Only GET and HEAD are accepted.
429The source, per-key minute limit or monthly account quota was exceeded.
500Unexpected server error.
503Catalogue or bounded search temporarily unavailable.
Inventory privacy

Transient by design

The public matching workspace parses original SBOM and VEX files inside the visitor’s browser. Nothing is transmitted until the visitor selects Match inventory.

What is sent

Only normalized component references, names, versions, suppliers, PURLs, CPEs, explicit CVE identifiers and optional VEX statements are sent for the matching request. The original files are not uploaded.

What is retained

The service processes the normalized request in memory and does not write the input or result to the catalogue database. Responses use Cache-Control: no-store. Application logs do not record request bodies.

User control

Parsed input remains in the current browser page until it is cleared, replaced or the page is closed. Export is initiated locally by the visitor. Any future saved-inventory feature will require separate opt-in consent and retention controls.

Wazuh boundary

The Wazuh operation accepts only batches of CVE identifiers. Asset names, agent identifiers, addresses, inventories and logs remain inside Wazuh. Returned signals stay separate and are not combined into a BlackTree score.

Responsible integration

Rate limits, caching, attribution and licence

01

Limits and quotas

Each API key has a plan-specific per-minute limit and monthly quota. Responses include remaining-limit headers. A limit breach returns 429. Do not distribute requests or keys to bypass controls.

02

Cache deliberately

Honour Cache-Control. Catalogue and report responses can be reused for 60 seconds. Sitemap data can be reused for 15 minutes. Health, statistics and material changes are marked no-store.

03

Attribute the evidence

When republishing results, identify “BlackTree CVE Intelligence” and link to the corresponding BlackTree report. Preserve the upstream source names and links carried in each response.

04

Licence boundaries

No blanket redistribution licence is granted by this documentation. Upstream CVE, CISA, ENISA, FIRST, NIST, authority and vendor content remains governed by its publisher’s terms. Contact BlackTree before bulk republication of BlackTree-authored analysis.

05

Acceptable use

Use bounded pagination, specific searches and ordinary caching. Do not stress-test production, scrape around published limits, evade controls, interfere with other users or imply that missing evidence is a safety assessment.

Responsible disclosure

Report a security issue

Use BlackTree’s public contact form and clearly identify the report as a security disclosure. Include the affected URL or API route, the observed impact and concise reproduction steps. Do not include credentials, private keys, personal data or unnecessary live-system data in the initial message.

Open the disclosure contact ↗View canonical security.txt ↗