changedOutput schema / oneOf
Previous value: -[
- {
- "additionalProperties": false,
- "properties": {
- "coverage": {
- "anyOf": [
- {
- "additionalProperties": false,
- "properties": {
- "item_text_cap": {
- "type": [
- "number",
- "null"
- ]
- },
- "items_per_advisory_cap": {
- "type": [
- "number",
- "null"
- ]
- },
- "parsed_vendors": {
- "anyOf": [
- {
- "items": {
- "type": "string"
- },
- "type": "array"
- },
- {
- "type": "null"
- }
- ],
- "description": "The vendors whose remediation EchelonGraph parses."
- },
- "sections_failed": {
- "anyOf": [
- {
- "items": {
- "type": "string"
- },
- "type": "array"
- },
- {
- "type": "null"
- }
- ],
- "description": "The sections the API could not read (its failed_sections); null when the answer does not say."
- },
- "sections_relayed": {
- "items": {
- "type": "string"
- },
- "type": "array"
- },
- "vendor_advisory_limit": {
- "type": [
- "number",
- "null"
- ]
- },
- "vendors_not_parsed": {
- "anyOf": [
- {
- "items": {
- "type": "string"
- },
- "type": "array"
- },
- {
- "type": "null"
- }
- ],
- "description": "The vendors in this answer whose remediation EchelonGraph does not parse."
- }
- },
- "required": [
- "sections_relayed",
- "sections_failed",
- "parsed_vendors",
- "vendors_not_parsed",
- "vendor_advisory_limit",
- "item_text_cap",
- "items_per_advisory_cap"
- ],
- "type": "object"
- },
- {
- "type": "null"
- }
- ],
- "description": "What the answer covers; null where the answer says nothing about it."
- },
- "data": {
- "additionalProperties": {},
- "properties": {
- "cisa": {
- "anyOf": [
- {
- "additionalProperties": {},
- "properties": {
- "due_date": {
- "type": [
- "string",
- "null"
- ]
- },
- "kev_listed": {
- "type": [
- "boolean",
- "null"
- ]
- },
- "notes_urls": {
- "anyOf": [
- {
- "items": {
- "type": "string"
- },
- "type": "array"
- },
- {
- "type": "null"
- }
- ]
- },
- "required_action": {
- "description": "CISA's requiredAction, verbatim. CISA's required_action is directed at US federal civilian agencies (BOD 22-01) and is not EchelonGraph's advice.",
- "type": [
- "string",
- "null"
- ]
- },
- "short_description": {
- "type": [
- "string",
- "null"
- ]
- }
- },
- "type": "object"
- },
- {
- "type": "null"
- }
- ]
- },
- "coverage": {},
- "cve_id": {
- "type": [
- "string",
- "null"
- ]
- },
- "failed_sections": {
- "anyOf": [
- {
- "items": {
- "type": "string"
- },
- "type": "array"
- },
- {
- "type": "null"
- }
- ]
- },
- "fix_references": {
- "anyOf": [
- {
- "items": {
- "additionalProperties": {},
- "properties": {
- "source": {
- "type": [
- "string",
- "null"
- ]
- },
- "tags": {
- "anyOf": [
- {
- "items": {
- "type": "string"
- },
- "type": "array"
- },
- {
- "type": "null"
- }
- ]
- },
- "url": {
- "type": [
- "string",
- "null"
- ]
- }
- },
- "type": "object"
- },
- "type": "array"
- },
- {
- "type": "null"
- }
- ]
- },
- "fixed_branches": {
- "anyOf": [
- {
- "items": {
- "additionalProperties": {},
- "properties": {
- "ecosystem": {
- "type": [
- "string",
- "null"
- ]
- },
- "fixed_branches": {
- "anyOf": [
- {
- "items": {
- "additionalProperties": {},
- "properties": {
- "advisory_id": {
- "type": [
- "string",
- "null"
- ]
- },
- "fixed": {
- "type": [
- "string",
- "null"
- ]
- },
- "introduced": {
- "type": [
- "string",
- "null"
- ]
- },
- "last_affected": {
- "description": "The range's last affected version, where no fix is on record; never a fix.",
- "type": [
- "string",
- "null"
- ]
- },
- "source": {
- "type": [
- "string",
- "null"
- ]
- }
- },
- "type": "object"
- },
- "type": "array"
- },
- {
- "type": "null"
- }
- ]
- },
- "fixed_version": {
- "description": "One range's fix, kept for compatibility; not the fix for every affected range.",
- "type": [
- "string",
- "null"
- ]
- },
- "package_name": {
- "type": [
- "string",
- "null"
- ]
- }
- },
- "type": "object"
- },
- "type": "array"
- },
- {
- "type": "null"
- }
- ]
- },
- "not_assessed_reason": {
- "type": [
- "string",
- "null"
- ]
- },
- "patches": {
- "anyOf": [
- {
- "items": {},
- "type": "array"
- },
- {
- "type": "null"
- }
- ]
- },
- "state": {
- "description": "assessed, or not_assessed for a CVE record rejected by its numbering authority.",
- "type": [
- "string",
- "null"
- ]
- },
- "vendor_remediations": {
- "anyOf": [
- {
- "items": {
- "additionalProperties": {},
- "properties": {
- "items": {
- "anyOf": [
- {
- "items": {
- "additionalProperties": {},
- "properties": {
- "fixed_build": {
- "description": "MSRC's FixedBuild; null elsewhere.",
- "type": [
- "string",
- "null"
- ]
- },
- "kind": {
- "anyOf": [
- {
- "anyOf": [
- {
- "enum": [
- "vendor_fix",
- "workaround",
- "mitigation",
- "no_fix_planned",
- "none_available",
- "other"
- ],
- "type": "string"
- },
- {
- "type": "string"
- }
- ]
- },
- {
- "type": "null"
- }
- ],
- "description": "The vendor's own category: vendor_fix, workaround, mitigation, no_fix_planned, none_available or other."
- },
- "product_count": {
- "type": [
- "number",
- "null"
- ]
- },
- "product_ids": {
- "anyOf": [
- {
- "items": {
- "type": "string"
- },
- "type": "array"
- },
- {
- "type": "null"
- }
- ],
- "description": "The vendor's own product identifiers the item applies to, the first 16."
- },
- "source_category": {
- "description": "The vendor's own name for the category (CSAF vendor_fix, MSRC Vendor Fix, Palo Alto work_around).",
- "type": [
- "string",
- "null"
- ]
- },
- "source_subcategory": {
- "description": "MSRC's SubType, e.g. Security Update; null elsewhere.",
- "type": [
- "string",
- "null"
- ]
- },
- "text": {
- "description": "The vendor's text, verbatim but for HTML markup removed, cut at coverage.item_text_cap characters (text_truncated).",
- "type": [
- "string",
- "null"
- ]
- },
- "text_chars": {
- "description": "The length of the vendor's text in characters.",
- "type": [
- "number",
- "null"
- ]
- },
- "text_truncated": {
- "type": [
- "boolean",
- "null"
- ]
- },
- "url": {
- "type": [
- "string",
- "null"
- ]
- }
- },
- "type": "object"
- },
- "type": "array"
- },
- {
- "type": "null"
- }
- ]
- },
- "items_total": {
- "type": [
- "number",
- "null"
- ]
- },
- "remediation_kinds": {
- "anyOf": [
- {
- "items": {
- "anyOf": [
- {
- "enum": [
- "vendor_fix",
- "workaround",
- "mitigation",
- "no_fix_planned",
- "none_available",
- "other"
- ],
- "type": "string"
- },
- {
- "type": "string"
- }
- ]
- },
- "type": "array"
- },
- {
- "type": "null"
- }
- ]
- },
- "remediation_state": {
- "anyOf": [
- {
- "anyOf": [
- {
- "enum": [
- "parsed",
- "none_in_source",
- "not_parsed",
- "withdrawn"
- ],
- "type": "string"
- },
- {
- "type": "string"
- }
- ]
- },
- {
- "type": "null"
- }
- ],
- "description": "parsed; none_in_source (parsed, and the advisory lists no remediation for this CVE, which is not a finding that no fix exists); not_parsed (EchelonGraph does not read this vendor's remediation, or has not yet read this advisory); withdrawn (the vendor rescinded it)."
- },
- "vendor": {
- "type": [
- "string",
- "null"
- ]
- },
- "vendor_advisory_id": {
- "type": [
- "string",
- "null"
- ]
- },
- "vendor_display_name": {
- "type": [
- "string",
- "null"
- ]
- },
- "vendor_published_at": {
- "type": [
- "string",
- "null"
- ]
- },
- "withdrawn": {
- "type": [
- "boolean",
- "null"
- ]
- }
- },
- "type": "object"
- },
- "type": "array"
- },
- {
- "type": "null"
- }
- ]
- }
- },
- "type": "object"
- },
- "freshness": {
- "description": "The producing radar's last completed check (last_run_at), where the API serves one.",
- "type": "null"
- },
- "measured_at": {
- "anyOf": [
- {
- "description": "An RFC 3339 instant.",
- "type": "string"
- },
- {
- "type": "null"
- }
- ],
- "description": "When the underlying observation was made, as the API states it; null when the answer does not say or holds no observation."
- },
- "method": {
- "description": "How the numbers were produced.",
- "type": "string"
- },
- "notes": {
- "description": "Caveats, one sentence each.",
- "items": {
- "type": "string"
- },
- "type": "array"
- },
- "state": {
- "description": "measured: a measurement of what was asked; an exposure count is measured only with measured_at and method. not_assessed: the answer holds no dated measurement of what was asked, so no count in it is presented as one; it can still relay a count, as what the source holds on record, undated, and its notes (and exposure_state, where the result carries it) say what each count is.",
- "enum": [
- "measured",
- "not_assessed"
- ],
- "type": "string"
- }
- },
- "required": [
- "state",
- "measured_at",
- "method",
- "coverage",
- "freshness",
- "notes",
- "data"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "coverage": {
- "anyOf": [
- {
- "additionalProperties": false,
- "properties": {
- "item_text_cap": {
- "type": [
- "number",
- "null"
- ]
- },
- "items_per_advisory_cap": {
- "type": [
- "number",
- "null"
- ]
- },
- "parsed_vendors": {
- "anyOf": [
- {
- "items": {
- "type": "string"
- },
- "type": "array"
- },
- {
- "type": "null"
- }
- ],
- "description": "The vendors whose remediation EchelonGraph parses."
- },
- "sections_failed": {
- "anyOf": [
- {
- "items": {
- "type": "string"
- },
- "type": "array"
- },
- {
- "type": "null"
- }
- ],
- "description": "The sections the API could not read (its failed_sections); null when the answer does not say."
- },
- "sections_relayed": {
- "items": {
- "type": "string"
- },
- "type": "array"
- },
- "vendor_advisory_limit": {
- "type": [
- "number",
- "null"
- ]
- },
- "vendors_not_parsed": {
- "anyOf": [
- {
- "items": {
- "type": "string"
- },
- "type": "array"
- },
- {
- "type": "null"
- }
- ],
- "description": "The vendors in this answer whose remediation EchelonGraph does not parse."
- }
- },
- "required": [
- "sections_relayed",
- "sections_failed",
- "parsed_vendors",
- "vendors_not_parsed",
- "vendor_advisory_limit",
- "item_text_cap",
- "items_per_advisory_cap"
- ],
- "type": "object"
- },
- {
- "type": "null"
- }
- ]
- },
- "error": {
- "additionalProperties": false,
- "properties": {
- "kind": {
- "description": "What failed: the request (network, timeout), the answer (http, not_json, not_object, unexpected_shape), the input, or this server.",
- "enum": [
- "network",
- "timeout",
- "http",
- "not_json",
- "not_object",
- "invalid_input",
- "internal",
- "unexpected_shape",
- "radars"
- ],
- "type": "string"
- },
- "message": {
- "description": "The cause: the API's own message, or what went wrong.",
- "type": "string"
- },
- "path": {
- "description": "The API path requested, when a request was made.",
- "type": [
- "string",
- "null"
- ]
- },
- "status": {
- "anyOf": [
- {
- "maximum": 9007199254740991,
- "minimum": -9007199254740991,
- "type": "integer"
- },
- {
- "type": "null"
- }
- ],
- "description": "The HTTP status, when the API answered one."
- }
- },
- "required": [
- "kind",
- "path",
- "status",
- "message"
- ],
- "type": "object"
- },
- "freshness": {
- "type": "null"
- },
- "measured_at": {
- "type": "null"
- },
- "method": {
- "type": "null"
- },
- "notes": {
- "description": "Caveats, one sentence each.",
- "items": {
- "type": "string"
- },
- "type": "array"
- },
- "state": {
- "description": "failed: the lookup did not complete. invalid_input: the input was refused, so nothing was looked up. Neither is a finding.",
- "enum": [
- "failed",
- "invalid_input"
- ],
- "type": "string"
- }
- },
- "required": [
- "state",
- "measured_at",
- "method",
- "coverage",
- "freshness",
- "notes",
- "error"
- ],
- "type": "object"
- }
-]New value: +[
+ {
+ "additionalProperties": {},
+ "properties": {
+ "coverage": {
+ "anyOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "installed_asked": {
+ "anyOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "ecosystem": {
+ "type": "string"
+ },
+ "package": {
+ "type": "string"
+ },
+ "version": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "ecosystem",
+ "package",
+ "version"
+ ],
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "The installed version this call sent (in request headers), as given; null when none."
+ },
+ "item_text_cap": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "items_per_advisory_cap": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "parsed_vendors": {
+ "anyOf": [
+ {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "The vendors whose remediation EchelonGraph parses."
+ },
+ "sections_failed": {
+ "anyOf": [
+ {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "The sections the API could not read (its failed_sections); null when the answer does not say."
+ },
+ "sections_relayed": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "vendor_advisory_limit": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "vendors_not_parsed": {
+ "anyOf": [
+ {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "The vendors in this answer whose remediation EchelonGraph does not parse."
+ }
+ },
+ "required": [
+ "sections_relayed",
+ "sections_failed",
+ "parsed_vendors",
+ "vendors_not_parsed",
+ "vendor_advisory_limit",
+ "item_text_cap",
+ "items_per_advisory_cap",
+ "installed_asked"
+ ],
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "What the answer covers; null where the answer says nothing about it."
+ },
+ "data": {
+ "additionalProperties": {},
+ "properties": {
+ "cisa": {
+ "anyOf": [
+ {
+ "additionalProperties": {},
+ "properties": {
+ "due_date": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "kev_listed": {
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "notes_urls": {
+ "anyOf": [
+ {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "required_action": {
+ "description": "CISA's requiredAction, verbatim. CISA's required_action is directed at US federal civilian agencies (under BOD 26-04, which replaced BOD 22-01 on 10 June 2026) and is not EchelonGraph's advice.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "short_description": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ },
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "coverage": {},
+ "cve_id": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "failed_sections": {
+ "anyOf": [
+ {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "fix_references": {
+ "anyOf": [
+ {
+ "items": {
+ "additionalProperties": {},
+ "properties": {
+ "source": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "tags": {
+ "anyOf": [
+ {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "url": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "fix_status": {
+ "anyOf": [
+ {
+ "additionalProperties": {},
+ "properties": {
+ "basis": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "described_by": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "listed_in_patch_table": {
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "solution_by": {
+ "anyOf": [
+ {
+ "additionalProperties": {},
+ "properties": {
+ "cna": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "section": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "statement": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ },
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "state": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "enum": [
+ "available",
+ "fix_referenced",
+ "fix_merged",
+ "none_confirmed",
+ "unknown"
+ ],
+ "type": "string"
+ },
+ {
+ "type": "string"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "stated_in_record": {
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "unread_inputs": {
+ "anyOf": [
+ {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "vendor_released": {
+ "anyOf": [
+ {
+ "additionalProperties": {},
+ "properties": {
+ "statement": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ },
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "The API's fix-status rule for the CVE, the one CVE Pulse pages show: state is available (a fix is on record), fix_referenced (a reference tagged Patch, often a source commit, and no release confirmed), fix_merged (an upstream fix merged, not yet in a tagged release), none_confirmed (no fix evidence on record, which is not a finding that no fix exists) or unknown (an input could not be read). basis is the step of the rule that decided it; described_by is the CVE description's sentence naming the fix, solution_by the CVE record's solution sentence naming it (statement) and the CNA that wrote it (cna), stated_in_record that patch_evidence counts a fix the CVE record states with no sentence to quote, listed_in_patch_table that a fixed version or patch row is on record; unread_inputs names any input the API could not read. vendor_released (basis vendor_fix_released) is the vendor's own statement that a fix is released where the CVE record names no fixed version: its sentence, verbatim (statement, or null), never a version, so the fixed release is the vendor advisory's to name. solution_by's section is workarounds when the fix sentence is the record's workaround, not its solution."
+ },
+ "fixed_branches": {
+ "anyOf": [
+ {
+ "items": {
+ "additionalProperties": {},
+ "properties": {
+ "ecosystem": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "fixed_branches": {
+ "anyOf": [
+ {
+ "items": {
+ "additionalProperties": {},
+ "properties": {
+ "advisory_id": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "fixed": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "introduced": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "last_affected": {
+ "description": "The range's last affected version, where no fix is on record; never a fix.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "source": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "fixed_branches_truncated": {
+ "additionalProperties": false,
+ "description": "Present only where the structured result's cut (DATA CUT) kept this package's first ranges, not all: total, its ranges in the answer; returned, the ones data keeps. The same call with full: true returns every range.",
+ "properties": {
+ "returned": {
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ "total": {
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "total",
+ "returned"
+ ],
+ "type": "object"
+ },
+ "fixed_version": {
+ "description": "One range's fix, kept for compatibility; not the fix for every affected range.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "package_name": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "fixed_in": {
+ "description": "With an installed version: the first version above it that no affected range on record holds, always above it, as the advisory states it: the fixed bound of the range holding it, moved past any overlapping range that still holds that bound (fixed_in_detail then names it). null when no range on record holds it, no fix is on record past the ranges holding it, or the version was not assessed, with fixed_in_reason saying which. Absent when no installed version was asked.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "fixed_in_detail": {
+ "description": "Set when fixed_in is not the fixed bound of the range holding the installed version: the overlapping ranges of the same record it moved past, which still hold that bound.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "fixed_in_reason": {
+ "description": "Why fixed_in is null; absent when fixed_in is a version.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "installed": {
+ "anyOf": [
+ {
+ "additionalProperties": {},
+ "properties": {
+ "ecosystem": {
+ "description": "The ecosystem asked for, in its canonical OSV spelling.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "ecosystem_recognised": {
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "interval": {
+ "anyOf": [
+ {
+ "additionalProperties": {},
+ "properties": {
+ "fixed": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "introduced": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "last_affected": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ },
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "The affected range holding the version (fixed is exclusive, last_affected inclusive); absent when none holds it."
+ },
+ "package": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "verdict": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "enum": [
+ "affected",
+ "not_affected",
+ "undetermined",
+ "not_assessed"
+ ],
+ "type": "string"
+ },
+ {
+ "type": "string"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "affected (a range on record holds the version), not_affected (no range on record holds it), undetermined (a range could not be decided at it) or not_assessed (the record names no such package for this CVE, or the lookup did not run)."
+ },
+ "version": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "version_evidence": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ },
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "The installed version asked for, as the API read it from the request headers, and its verdict against this CVE; absent when none was asked."
+ },
+ "not_assessed_reason": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "patches": {
+ "anyOf": [
+ {
+ "items": {},
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "state": {
+ "description": "assessed, or not_assessed for a CVE record rejected by its numbering authority.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "vendor_remediations": {
+ "anyOf": [
+ {
+ "items": {
+ "additionalProperties": {},
+ "properties": {
+ "items": {
+ "anyOf": [
+ {
+ "items": {
+ "additionalProperties": {},
+ "properties": {
+ "fixed_build": {
+ "description": "MSRC's FixedBuild; null elsewhere.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "kind": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "enum": [
+ "vendor_fix",
+ "workaround",
+ "mitigation",
+ "no_fix_planned",
+ "none_available",
+ "other"
+ ],
+ "type": "string"
+ },
+ {
+ "type": "string"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "The vendor's own category: vendor_fix, workaround, mitigation, no_fix_planned, none_available or other."
+ },
+ "product_count": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "product_ids": {
+ "anyOf": [
+ {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "The vendor's own product identifiers the item applies to, the first 16."
+ },
+ "source_category": {
+ "description": "The vendor's own name for the category (CSAF vendor_fix, MSRC Vendor Fix, Palo Alto work_around).",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "source_subcategory": {
+ "description": "MSRC's SubType, e.g. Security Update; null elsewhere.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "text": {
+ "description": "The vendor's text, verbatim but for HTML markup removed, cut at coverage.item_text_cap characters (text_truncated).",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "text_chars": {
+ "description": "The length of the vendor's text in characters.",
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "text_truncated": {
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "url": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "items_total": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "remediation_kinds": {
+ "anyOf": [
+ {
+ "items": {
+ "anyOf": [
+ {
+ "enum": [
+ "vendor_fix",
+ "workaround",
+ "mitigation",
+ "no_fix_planned",
+ "none_available",
+ "other"
+ ],
+ "type": "string"
+ },
+ {
+ "type": "string"
+ }
+ ]
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "remediation_state": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "enum": [
+ "parsed",
+ "none_in_source",
+ "not_parsed",
+ "withdrawn"
+ ],
+ "type": "string"
+ },
+ {
+ "type": "string"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "parsed; none_in_source (parsed, and the advisory lists no remediation for this CVE, which is not a finding that no fix exists); not_parsed (EchelonGraph does not read this vendor's remediation, or has not yet read this advisory); withdrawn (the vendor rescinded it)."
+ },
+ "vendor": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "vendor_advisory_id": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "vendor_display_name": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "vendor_published_at": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "withdrawn": {
+ "type": [
+ "boolean",
+ "null"
+ ]
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "type": "object"
+ },
+ "data_truncated": {
+ "description": "false: data is the answer whole. true: the structured result would pass 30,000 characters of JSON with data whole, so data is cut (DATA CUT): the entries of some of its lists keep only some of their fields, or the lists only some of their entries, truncated gives each, and no string is shortened. The same call with full: true returns data whole.",
+ "type": "boolean"
+ },
+ "freshness": {
+ "description": "The producing radar's last completed check (last_run_at), where the API serves one.",
+ "type": "null"
+ },
+ "measured_at": {
+ "anyOf": [
+ {
+ "description": "An RFC 3339 instant.",
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "When the underlying observation was made, as the API states it; null when the answer does not say or holds no observation."
+ },
+ "method": {
+ "description": "How the numbers were produced.",
+ "type": "string"
+ },
+ "notes": {
+ "description": "Caveats, one sentence each.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "state": {
+ "description": "measured: a measurement of what was asked; an exposure count is measured only with measured_at and method. not_assessed: the answer holds no dated measurement of what was asked, so no count in it is presented as one; it can still relay a count, as what the source holds on record, undated, and its notes (and exposure_state, where the result carries it) say what each count is.",
+ "enum": [
+ "measured",
+ "not_assessed"
+ ],
+ "type": "string"
+ },
+ "truncated": {
+ "additionalProperties": {
+ "additionalProperties": false,
+ "properties": {
+ "returned": {
+ "maximum": 9007199254740991,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "thinned": {
+ "const": true,
+ "type": "boolean"
+ },
+ "total": {
+ "maximum": 9007199254740991,
+ "minimum": 0,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "total",
+ "returned"
+ ],
+ "type": "object"
+ },
+ "description": "Present when data_truncated is true: each list of data that was cut, by its path in data (a dot between the names of an object and a list inside it), with total, its entries in the answer, returned, the entries data holds, and thinned, true when each of them keeps only some of its fields.",
+ "propertyNames": {
+ "type": "string"
+ },
+ "type": "object"
+ }
+ },
+ "required": [
+ "state",
+ "measured_at",
+ "method",
+ "coverage",
+ "freshness",
+ "notes",
+ "data_truncated",
+ "data"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "coverage": {
+ "anyOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "installed_asked": {
+ "anyOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "ecosystem": {
+ "type": "string"
+ },
+ "package": {
+ "type": "string"
+ },
+ "version": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "ecosystem",
+ "package",
+ "version"
+ ],
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "The installed version this call sent (in request headers), as given; null when none."
+ },
+ "item_text_cap": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "items_per_advisory_cap": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "parsed_vendors": {
+ "anyOf": [
+ {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "The vendors whose remediation EchelonGraph parses."
+ },
+ "sections_failed": {
+ "anyOf": [
+ {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "The sections the API could not read (its failed_sections); null when the answer does not say."
+ },
+ "sections_relayed": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "vendor_advisory_limit": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "vendors_not_parsed": {
+ "anyOf": [
+ {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "The vendors in this answer whose remediation EchelonGraph does not parse."
+ }
+ },
+ "required": [
+ "sections_relayed",
+ "sections_failed",
+ "parsed_vendors",
+ "vendors_not_parsed",
+ "vendor_advisory_limit",
+ "item_text_cap",
+ "items_per_advisory_cap",
+ "installed_asked"
+ ],
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "error": {
+ "additionalProperties": false,
+ "properties": {
+ "kind": {
+ "description": "What failed: the request (network, timeout), the answer (http, not_json, not_object, unexpected_shape), the input, or this server.",
+ "enum": [
+ "network",
+ "timeout",
+ "http",
+ "not_json",
+ "not_object",
+ "invalid_input",
+ "internal",
+ "unexpected_shape",
+ "radars"
+ ],
+ "type": "string"
+ },
+ "message": {
+ "description": "The cause: the API's own message, or what went wrong.",
+ "type": "string"
+ },
+ "path": {
+ "description": "The API path requested, when a request was made.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "status": {
+ "anyOf": [
+ {
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "The HTTP status, when the API answered one."
+ }
+ },
+ "required": [
+ "kind",
+ "path",
+ "status",
+ "message"
+ ],
+ "type": "object"
+ },
+ "freshness": {
+ "type": "null"
+ },
+ "measured_at": {
+ "type": "null"
+ },
+ "method": {
+ "type": "null"
+ },
+ "notes": {
+ "description": "Caveats, one sentence each.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "state": {
+ "description": "failed: the lookup did not complete. invalid_input: the input was refused, so nothing was looked up. Neither is a finding.",
+ "enum": [
+ "failed",
+ "invalid_input"
+ ],
+ "type": "string"
+ }
+ },
+ "required": [
+ "state",
+ "measured_at",
+ "method",
+ "coverage",
+ "freshness",
+ "notes",
+ "error"
+ ],
+ "type": "object"
+ }
+]