Response Field Reference
Complete reference for every field returned by GET /v1/check. All risk decisions are deterministic. The same product and version always returns the same result given the same underlying data.
{
"product": "log4j",
"version": "2.14.1",
"supported": true,
"risk_state": "critical",
"risk_factors": [
"active_exploitation",
"remote_code_execution",
"no_authentication_required",
"internet_exposed_service",
"patch_available"
],
"actively_exploited": true,
"remote_exploitable": true,
"authentication_required": false,
"patch_available": true,
"fixed_version": "2.17.1",
"confidence": 0.94,
"cve_ids": [
"CVE-2021-44228",
"CVE-2021-45046",
"CVE-2021-45105"
],
"cves": null,
"max_epss": 0.99999,
"supply_chain": null,
"supply_chain_monitored": false,
"typosquat": null,
"last_updated": "2026-02-23T18:21:30Z"
}supportedbooleanWhether attestd has coverage data for this product. If false, CVE risk fields are absent. The response may still include a typosquat object when the requested name fails package name integrity.
supported: false is not a safety signal. It means attestd has no CVE or supply-chain coverage for this product. Not that the product is free of vulnerabilities. Always check typosquat before treating the name as unknown. See outside coverage below for handling guidance.risk_state"critical" | "high" | "elevated" | "low" | "none"Deterministic risk classification for the queried version. Values in severity order from highest to lowest:
critical | actively_exploited = true for any CVE in matching ranges |
high | remote_exploitable = true AND authentication_required = false |
elevated | remote_exploitable = true AND authentication_required = true |
low | local-only or low-impact vulnerability |
none | no known CVEs affect the queried version |
When multiple CVE version ranges match the queried version, the highest severity across all matching ranges is returned. See multi-range aggregation.
risk_factorsstring[]The reasons behind the risk_state classification. An empty array means no relevant risk factors were identified (typical for none).
active_exploitation | actively_exploited = true |
remote_code_execution | remote_exploitable = true |
no_authentication_required | (actively_exploited OR remote_exploitable) AND authentication_required = false |
internet_exposed_service | remote_exploitable = true AND authentication_required = false |
patch_available | patch_available = true |
internet_exposed_service is derived from CVE properties (remote_exploitable and authentication_required = false). It does not indicate Attestd has verified the service is reachable from the internet.
actively_exploitedbooleanWhether any CVE affecting this version is listed in the CISA Known Exploited Vulnerabilities (KEV) catalog. KEV membership means exploitation has been observed in the wild.
When multiple version ranges match: true if any matching range has an actively-exploited CVE.
remote_exploitablebooleanWhether the vulnerability can be exploited over a network without requiring local access to the target host.
When multiple version ranges match: true if any matching range has a remotely-exploitable CVE.
authentication_requiredbooleanWhether exploitation requires valid credentials on the target system. false means at least one CVE has an unauthenticated attack path.
true only if ALL matching ranges require authentication. A single unauthenticated CVE sets this to false for the whole response. This reflects the real-world threat model: one unauthenticated exploit path is sufficient for an attacker.patch_availablebooleanWhether a fixed version is available for this product. true means upgrading to fixed_version resolves all known risks in the queried version.
fixed_versionstring | nullThe earliest version that resolves all CVEs affecting the queried version. null if no patch is available or the product has no known affected CVEs (risk_state: "none").
confidencenumber (0.0–1.0)Signal confidence score reflecting the quality and corroboration of the underlying data.
≥ 0.7 | LLM-extracted facts, high corroboration |
0.5 | DB-derived fallback (LLM unavailable or returned invalid output) |
When multiple version ranges match: the minimum confidence across all matching rows is returned. A low-confidence result on any range lowers the overall confidence score.
For a full explanation of what drives each confidence tier and how the LLM extraction pipeline works, see Why Attestd: confidence score semantics.
cve_idsstring[]The CVE identifiers that contributed to this risk assessment. Empty for risk_state: "none".
When multiple version ranges match, this is the union of all CVE IDs across all matching rows.
max_epssnumber | nullThe highest EPSS probability score across all CVEs affecting this version. CVSS measures severity. KEV records confirmed exploitation. EPSS predicts exploitation probability in the next 30 days.
null when no matching CVE has an EPSS score yet (very new CVEs or product with no CVEs). Aggregation: max across all CVE IDs in the version range.
cvesobject[] | nullPer-CVE detail records. Present only when include=cves is passed on the request. null on the default response. Each entry corresponds to one ID in cve_ids.
Sub-fields:
cve_id | string | CVE identifier (e.g., CVE-2021-44228). |
cvss_score | number | null | NVD CVSS base score v3.1 where published. Null when no score is available. |
actively_exploited | boolean | True if this CVE is listed in the CISA KEV catalog. |
remote_exploitable | boolean | True if the attack vector is network-based for this CVE. |
epss_score | number | null | EPSS probability score (0.0–1.0). Null for CVEs published after the most recent daily FIRST.org snapshot. |
epss_percentile | number | null | EPSS percentile rank (0.0–1.0). Null for CVEs published after the most recent daily FIRST.org snapshot. |
Example response with include=cves:
{
"product": "log4j",
"version": "2.14.1",
"supported": true,
"risk_state": "critical",
"risk_factors": [
"active_exploitation",
"remote_code_execution",
"no_authentication_required",
"internet_exposed_service",
"patch_available"
],
"actively_exploited": true,
"remote_exploitable": true,
"authentication_required": false,
"patch_available": true,
"fixed_version": "2.25.4",
"confidence": 0.5,
"cve_ids": ["CVE-2021-44228", "CVE-2021-45046", "CVE-2021-45105"],
"max_epss": 0.99999,
"cves": [
{
"cve_id": "CVE-2021-44228",
"cvss_score": 10.0,
"actively_exploited": true,
"remote_exploitable": true,
"epss_score": 0.99999,
"epss_percentile": 1.0
},
{
"cve_id": "CVE-2021-45046",
"cvss_score": 9.0,
"actively_exploited": true,
"remote_exploitable": true,
"epss_score": 0.97123,
"epss_percentile": 0.998
}
],
"last_updated": "2026-07-08T10:58:13.230818Z",
"supply_chain": null,
"typosquat": null
}last_updatedISO 8601 datetime stringThe UTC timestamp of the most recent synthesis run that produced this result. Pairs with the X-Attestd-Knowledge-Age response header.
When multiple version ranges match: the most recent timestamp across all matching rows.
supply_chainobject | nullSupply chain integrity data for monitored PyPI and npm packages. null for CVE-only products (nginx, PostgreSQL, etc.). See Supply Chain Integrity for the full monitored package list.
Sub-fields:
compromised | boolean | True if a malicious publish was detected for this version. |
sources | string[] | Which sources flagged the version: "registry", "osv", "pypi_yank". |
malware_type | string | null | Malware classification if available (e.g., trojan, keylogger, cryptominer). |
description | string | null | Human-readable description of the compromise. |
advisory_url | string | null | Link to OSV or registry advisory with details. |
compromised_at | datetime | null | When the malicious version was first detected. |
removed_at | datetime | null | When removed from PyPI (null if still present). |
Example PyPI response with supply chain data:
{
"product": "litellm",
"version": "1.82.7",
"supported": true,
"risk_state": "none",
"risk_factors": [],
"actively_exploited": false,
"remote_exploitable": false,
"authentication_required": false,
"patch_available": false,
"fixed_version": null,
"confidence": 1,
"cve_ids": [],
"cves": null,
"max_epss": null,
"supply_chain": {
"compromised": true,
"sources": [
"osv",
"registry"
],
"malware_type": "backdoor",
"description": "TeamPCP supply chain attack: a malicious version contained a credential stealer in proxy_server.py targeting LLM provider API keys. Published at 10:39 UTC and removed within six hours after community detection.",
"advisory_url": "https://docs.litellm.ai/blog/security-update-march-2026",
"compromised_at": "2026-03-24T10:39:00Z",
"removed_at": "2026-03-24T16:00:00Z"
},
"supply_chain_monitored": true,
"typosquat": null,
"last_updated": "2026-04-27T16:07:47.644177Z"
}typosquatobject | nullPackage name integrity signal. Present when the requested name is a likely typosquat or an AI-hallucinated / conflated package name (slopsquatting). On unsupported products, this is the primary signal returned alongside supported: false. On supported supply-chain packages, it may appear alongside supply_chain when the requested name resembles another monitored package. null when no name-integrity issue is detected.
Sub-fields:
detected | boolean | True when the requested name fails package name integrity. |
kind | "typosquat" | "hallucination" | typosquat = classic misspelling. hallucination = AI-invented or conflated name. |
resembles | string | The canonical package name the requested name most closely matches (e.g., jscodeshift). |
likely_intended | string[] | Additional likely intended names for hallucination matches. Empty for classic typosquats. |
confidence | number | Confidence score (0.0–1.0) for the name-integrity match. |
ecosystem | string | Registry where the canonical package lives: "pypi" or "npm". |
Example unsupported product with an AI-hallucinated package name detected:
{
"supported": false,
"typosquat": {
"detected": true,
"kind": "hallucination",
"resembles": "jscodeshift",
"likely_intended": ["jscodeshift"],
"confidence": 0.9,
"ecosystem": "npm"
}
}X-Attestd-Knowledge-Age
Every response includes this header. It represents the elapsed time since the risk data was last synthesized, in human-readable form.
| Example value | Meaning |
|---|---|
15m | Data refreshed 15 minutes ago. Very fresh |
4h30m | Data refreshed 4.5 hours ago. Within normal 6-hour sync cycle |
1d2h | Data older than 24 hours. Check /health if unexpected |
The NVD feed and CISA KEV catalog are ingested every 6 hours. Responses may be up to cache_ttl_seconds (default 1 hour) stale due to in-memory caching. For time-sensitive decisions, use last_updated to assess data freshness directly.
Multi-range aggregation
A single product version may be covered by multiple CVE version ranges. For example, log4j 2.14.1 is affected by both CVE-2021-44228 (Log4Shell) and CVE-2021-45046. When this happens, attestd merges the results using worst-case semantics:
| Field | Aggregation rule |
|---|---|
risk_state | Highest severity across all matching ranges |
actively_exploited | true if any matching range has actively_exploited = true |
remote_exploitable | true if any matching range has remote_exploitable = true |
authentication_required | true only if ALL matching ranges have authentication_required = true |
patch_available | true if any matching range has patch_available = true |
confidence | Minimum confidence across all matching ranges |
last_updated | Most recent timestamp across all matching ranges |
cve_ids | Union of all CVE IDs across all matching ranges |
Outside coverage
If the requested product is not in attestd's supported set, the response includes supported: false. When the name also fails package name integrity, typosquat is present. Example for an AI-invented package name:
{
"supported": false,
"typosquat": {
"detected": true,
"kind": "hallucination",
"resembles": "jscodeshift",
"likely_intended": ["jscodeshift"],
"confidence": 0.9,
"ecosystem": "npm"
}
}typosquat first. If typosquat.detected is true, block or warn and use resembles / likely_intended to recover the intended package. If typosquat is null, apply an explicit policy decision: block (treat as unknown risk), warn (proceed with operator notification), or skip (exempt with documented justification).In the Python SDK, an unsupported product raises attestd.AttestdUnsupportedProductError. See the SDK reference for handling guidance.