changedOutput schema / oneOf
Previous value: -[
- {
- "additionalProperties": {},
- "properties": {
- "coverage": {
- "anyOf": [
- {
- "additionalProperties": {},
- "properties": {
- "assessed": {
- "description": "The answer's assessed, first: null when the answer does not say.",
- "type": [
- "boolean",
- "null"
- ]
- },
- "candidates_capped": {
- "type": [
- "boolean",
- "null"
- ]
- },
- "capped": {
- "type": [
- "boolean",
- "null"
- ]
- },
- "count": {
- "type": [
- "number",
- "null"
- ]
- },
- "degraded": {
- "type": [
- "boolean",
- "null"
- ]
- },
- "excluded_count": {
- "type": [
- "number",
- "null"
- ]
- },
- "lookup": {
- "anyOf": [
- {
- "enum": [
- "cpe",
- "registry"
- ],
- "type": "string"
- },
- {
- "type": "string"
- }
- ],
- "description": "Which lookup path this call asked for."
- },
- "match_layer": {
- "type": [
- "string",
- "null"
- ]
- },
- "not_affected_count": {
- "type": [
- "number",
- "null"
- ]
- },
- "not_assessed_reason": {
- "anyOf": [
- {
- "anyOf": [
- {
- "enum": [
- "product_not_in_cpe_corpus",
- "package_not_cpe_nameable",
- "candidate_load_pending",
- "candidate_window_truncated",
- "package_not_in_advisory_corpus",
- "no_decidable_advisory",
- "advisory_lookup_failed"
- ],
- "type": "string"
- },
- {
- "type": "string"
- }
- ],
- "description": "Why assessed is false; empty or absent when it is true."
- },
- {
- "type": "null"
- }
- ]
- },
- "undetermined_count": {
- "type": [
- "number",
- "null"
- ]
- }
- },
- "required": [
- "assessed",
- "not_assessed_reason",
- "lookup",
- "match_layer",
- "count",
- "capped",
- "candidates_capped",
- "excluded_count",
- "undetermined_count",
- "not_affected_count",
- "degraded"
- ],
- "type": "object"
- },
- {
- "type": "null"
- }
- ],
- "description": "What the answer covers; null where the answer says nothing about it."
- },
- "data": {
- "additionalProperties": {},
- "properties": {
- "advisories_considered": {
- "type": [
- "number",
- "null"
- ]
- },
- "assessed": {
- "description": "count depends on it. true: the lookup evaluated this component. false: it did not, and count 0 says nothing about whether this version is affected.",
- "type": [
- "boolean",
- "null"
- ]
- },
- "candidate_count": {
- "type": [
- "number",
- "null"
- ]
- },
- "candidates_capped": {
- "description": "true: not every candidate CVE was loaded.",
- "type": [
- "boolean",
- "null"
- ]
- },
- "capped": {
- "description": "true: the match list stopped at its cap.",
- "type": [
- "boolean",
- "null"
- ]
- },
- "count": {
- "type": [
- "number",
- "null"
- ]
- },
- "cve_ids": {
- "anyOf": [
- {
- "items": {
- "type": "string"
- },
- "type": "array"
- },
- {
- "type": "null"
- }
- ]
- },
- "degraded": {
- "description": "true: the lookup ran out of time.",
- "type": [
- "boolean",
- "null"
- ]
- },
- "ecosystem": {
- "type": [
- "string",
- "null"
- ]
- },
- "ecosystem_recognised": {
- "type": [
- "boolean",
- "null"
- ]
- },
- "excluded": {},
- "excluded_count": {
- "description": "CPE candidates suppressed by the vendor or platform gate.",
- "type": [
- "number",
- "null"
- ]
- },
- "match_layer": {
- "description": "Which lookup path answered.",
- "type": [
- "string",
- "null"
- ]
- },
- "matches": {
- "anyOf": [
- {
- "items": {
- "additionalProperties": {},
- "properties": {
- "cpe_vendor": {
- "description": "The vendor NVD's CPE asserts for this match.",
- "type": [
- "string",
- "null"
- ]
- },
- "cpe_version_end_excluding": {
- "description": "CPE match: NVD's versionEndExcluding for the range that matched, the first version that range no longer holds. Not a fix, and never fixed_in: another range of the same CVE, or a vendor backport, can sit past it. Absent on a registry match, and where the range sets no such end.",
- "type": [
- "string",
- "null"
- ]
- },
- "cpe_version_end_including": {
- "description": "CPE match: NVD's versionEndIncluding for the range that matched, the last version that range holds. Not a fix, and never fixed_in. Absent on a registry match, and where the range sets no such end.",
- "type": [
- "string",
- "null"
- ]
- },
- "cve_id": {
- "type": [
- "string",
- "null"
- ]
- },
- "cvss_v2_score": {
- "type": [
- "number",
- "null"
- ]
- },
- "cvss_v3_score": {
- "type": [
- "number",
- "null"
- ]
- },
- "cvss_v4_score": {
- "type": [
- "number",
- "null"
- ]
- },
- "description": {
- "type": [
- "string",
- "null"
- ]
- },
- "echelongraph_score": {
- "description": "EchelonGraph's 0-10 score: present only when score_assessed is true.",
- "type": [
- "number",
- "null"
- ]
- },
- "echelongraph_severity": {
- "type": [
- "string",
- "null"
- ]
- },
- "effective_score": {
- "description": "The best real score held for the CVE (EchelonGraph's, else CVSS), the number the matches are ranked by.",
- "type": [
- "number",
- "null"
- ]
- },
- "effective_severity": {
- "description": "The band of effective_score; absent or empty when the CVE has no band at all (unrated, not harmless).",
- "type": [
- "string",
- "null"
- ]
- },
- "epss_score": {
- "description": "EPSS exploitation probability, 0 to 1.",
- "type": [
- "number",
- "null"
- ]
- },
- "fixed_in": {
- "description": "Registry match: the lowest version above this one that no affected interval of the CVE's record for the package holds, always above it: the fixed bound of the interval that holds this version, moved past any overlapping interval that still holds that bound (fixed_in_detail then names it). null when no such version is on record (an interval on the way records no fix: it ends at last_affected, or has no end) or no interval holds the version, with fixed_in_reason saying which. Absent on a CPE match. Where fixed_in_dispute is set, the CVE record's CNA and the advisory disagree on the range that holds this version, and fixed_in follows the source its higher names (its note says how).",
- "type": [
- "string",
- "null"
- ]
- },
- "fixed_in_detail": {
- "description": "Set when fixed_in is not the fixed bound of the interval that holds this version: the overlapping intervals of the same record it moved past, which still hold that bound.",
- "type": [
- "string",
- "null"
- ]
- },
- "fixed_in_dispute": {
- "anyOf": [
- {
- "additionalProperties": {},
- "properties": {
- "advisory_fixed": {
- "type": [
- "string",
- "null"
- ]
- },
- "advisory_id": {
- "type": [
- "string",
- "null"
- ]
- },
- "advisory_introduced": {
- "type": [
- "string",
- "null"
- ]
- },
- "advisory_last_affected": {
- "type": [
- "string",
- "null"
- ]
- },
- "advisory_listed": {
- "type": [
- "boolean",
- "null"
- ]
- },
- "cna": {
- "anyOf": [
- {
- "additionalProperties": {},
- "properties": {
- "name": {
- "type": [
- "string",
- "null"
- ]
- },
- "short_name": {
- "type": [
- "string",
- "null"
- ]
- }
- },
- "type": "object"
- },
- {
- "type": "null"
- }
- ]
- },
- "cna_product": {
- "type": [
- "string",
- "null"
- ]
- },
- "cna_range": {
- "anyOf": [
- {
- "additionalProperties": {},
- "properties": {
- "changes": {
- "anyOf": [
- {
- "items": {
- "additionalProperties": {},
- "properties": {
- "at": {
- "type": [
- "string",
- "null"
- ]
- },
- "status": {
- "type": [
- "string",
- "null"
- ]
- }
- },
- "type": "object"
- },
- "type": "array"
- },
- {
- "type": "null"
- }
- ]
- },
- "changes_truncated": {
- "type": [
- "boolean",
- "null"
- ]
- },
- "less_than": {
- "type": [
- "string",
- "null"
- ]
- },
- "less_than_or_equal": {
- "type": [
- "string",
- "null"
- ]
- },
- "status": {
- "type": [
- "string",
- "null"
- ]
- },
- "version": {
- "type": [
- "string",
- "null"
- ]
- },
- "version_type": {
- "type": [
- "string",
- "null"
- ]
- }
- },
- "type": "object"
- },
- {
- "type": "null"
- }
- ]
- },
- "cna_range_default": {
- "type": [
- "boolean",
- "null"
- ]
- },
- "higher": {
- "anyOf": [
- {
- "anyOf": [
- {
- "enum": [
- "cna",
- "advisory"
- ],
- "type": "string"
- },
- {
- "type": "string"
- }
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "kind": {
- "anyOf": [
- {
- "anyOf": [
- {
- "enum": [
- "fixed",
- "introduced"
- ],
- "type": "string"
- },
- {
- "type": "string"
- }
- ]
- },
- {
- "type": "null"
- }
- ]
- },
- "note": {
- "type": [
- "string",
- "null"
- ]
- }
- },
- "type": "object"
- },
- {
- "type": "null"
- }
- ],
- "description": "Once EchelonGraph's API serves it, set where the API found the CVE record's CNA and the advisory disagreeing on the range that holds this version. kind: fixed (they disagree on where the package is fixed) or introduced (the CNA's range starts below where the advisory's does). The advisory's bound in dispute, exactly one of advisory_fixed, advisory_last_affected and advisory_introduced, as the advisory's own statement gives it (advisory_listed: it lists affected versions rather than a range, and the bound is a version it lists), and advisory_id, the advisory. cna (name, short_name), cna_product (what the CNA's entry names, as the API reads it) and cna_range (version, less_than or less_than_or_equal, status, version_type; changes, each {at, status}, where the range's status changes inside it, with changes_truncated where the record held more): the CNA's range in dispute, as the API reads the record (where higher is cna, the CNA's range that reaches past the advisory's bound: on a cna_affected_range match it holds the version, and on an advisory_interval or exact_version_list match it holds the advisory's bound past the version (its fix, or the versions just above its last affected or listed version), so it may start above the version; where higher is advisory, the CNA's range that ends below it, the CNA saying the version is fixed), from an entry the record writes, or, with cna_range_default true, a span no entry writes that the record's defaultStatus covers. higher: the source the answer follows, the more conservative one (cna or advisory). note: the API's sentence on the dispute and what the answer does with it, relayed verbatim. Fields and values a later API adds are relayed. Its absence is not a finding that the CNA agrees: an API that does not serve it yet, or older than the field, sends none; one that serves it reads a CNA's ranges only where it applies them and only from an entry it matches to the package; and a match the CNA's range alone raises may carry none."
- },
- "fixed_in_reason": {
- "description": "Why fixed_in is null; absent when fixed_in is a version.",
- "type": [
- "string",
- "null"
- ]
- },
- "interval": {
- "anyOf": [
- {
- "additionalProperties": {},
- "properties": {
- "fixed": {
- "type": [
- "string",
- "null"
- ]
- },
- "introduced": {
- "type": [
- "string",
- "null"
- ]
- },
- "last_affected": {
- "type": [
- "string",
- "null"
- ]
- }
- },
- "type": "object"
- },
- {
- "type": "null"
- }
- ],
- "description": "Registry match: the affected interval that holds this version (fixed is exclusive, last_affected inclusive): the advisory's, or, where version_evidence is cna_affected_range, the CVE record's CNA range. Absent when no interval holds it."
- },
- "kev_listed": {
- "description": "Listed in CISA-KEV: known to be exploited.",
- "type": [
- "boolean",
- "null"
- ]
- },
- "match_confidence": {
- "type": [
- "number",
- "null"
- ]
- },
- "match_method": {
- "type": [
- "string",
- "null"
- ]
- },
- "match_reason": {
- "type": [
- "string",
- "null"
- ]
- },
- "matched_criteria": {
- "type": [
- "string",
- "null"
- ]
- },
- "ransomware": {
- "description": "CISA-KEV records known use in ransomware campaigns.",
- "type": [
- "boolean",
- "null"
- ]
- },
- "score_assessed": {
- "description": "Whether EchelonGraph has scored the CVE. false: NOT YET SCORED, and echelongraph_score is withheld.",
- "type": [
- "boolean",
- "null"
- ]
- },
- "score_unassessed_reason": {
- "type": [
- "string",
- "null"
- ]
- },
- "severity": {
- "description": "NVD's own CVSS v3 band, as provenance: it can be NONE for a CVE NVD rated only under CVSS v2. Rank and display on effective_severity.",
- "type": [
- "string",
- "null"
- ]
- },
- "vendor_severity": {
- "type": [
- "string",
- "null"
- ]
- },
- "vendor_unknown": {
- "description": "true: the vendor was not verified, so the match is real but its attribution to your vendor is not.",
- "type": [
- "boolean",
- "null"
- ]
- },
- "version_evidence": {
- "anyOf": [
- {
- "anyOf": [
- {
- "enum": [
- "exact_version_list",
- "advisory_interval",
- "fix_boundary_only",
- "no_version_supplied",
- "cna_affected_range"
- ],
- "type": "string"
- },
- {
- "type": "string"
- }
- ]
- },
- {
- "type": "null"
- }
- ],
- "description": "Registry match: how the version was decided: exact_version_list (named in the advisory's list of affected versions), advisory_interval (inside one of its intervals), fix_boundary_only (below its only stored fix, its lower bound assumed), no_version_supplied (no version given, so no claim about it), or, once EchelonGraph's API serves it, cna_affected_range (held by the CVE record's CNA range, where no advisory statement holds it: interval is the CNA's range, and fixed_in_dispute, where the API publishes one, says how the two differ; such a match may carry none). Relayed as the API sends it; a later value is relayed too."
- }
- },
- "type": "object"
- },
- "type": "array"
- },
- {
- "type": "null"
- }
- ]
- },
- "not_affected_count": {
- "description": "CVEs decided as not affecting this version: on the registry path one per CVE, however many of its advisory records are stored (advisories_considered counts those).",
- "type": [
- "number",
- "null"
- ]
- },
- "not_assessed_reason": {
- "anyOf": [
- {
- "anyOf": [
- {
- "enum": [
- "product_not_in_cpe_corpus",
- "package_not_cpe_nameable",
- "candidate_load_pending",
- "candidate_window_truncated",
- "package_not_in_advisory_corpus",
- "no_decidable_advisory",
- "advisory_lookup_failed"
- ],
- "type": "string"
- },
- {
- "type": "string"
- }
- ],
- "description": "Why assessed is false; empty or absent when it is true."
- },
- {
- "type": "null"
- }
- ]
- },
- "package": {
- "type": [
- "string",
- "null"
- ]
- },
- "product": {
- "type": [
- "string",
- "null"
- ]
- },
- "product_named_count": {
- "type": [
- "number",
- "null"
- ]
- },
- "undecidable_excluded_count": {
- "type": [
- "number",
- "null"
- ]
- },
- "undecided_candidate_count": {
- "type": [
- "number",
- "null"
- ]
- },
- "undetermined": {
- "anyOf": [
- {
- "items": {
- "additionalProperties": {},
- "properties": {
- "cve_id": {
- "type": [
- "string",
- "null"
- ]
- },
- "detail": {
- "type": [
- "string",
- "null"
- ]
- },
- "ecosystem": {
- "type": [
- "string",
- "null"
- ]
- },
- "package": {
- "type": [
- "string",
- "null"
- ]
- },
- "reason": {
- "type": [
- "string",
- "null"
- ]
- }
- },
- "type": "object"
- },
- "type": "array"
- },
- {
- "type": "null"
- }
- ]
- },
- "undetermined_count": {
- "type": [
- "number",
- "null"
- ]
- },
- "vendor": {
- "type": [
- "string",
- "null"
- ]
- },
- "vendor_advisory_count": {
- "type": [
- "number",
- "null"
- ]
- },
- "version": {
- "type": [
- "string",
- "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": {
- "anyOf": [
- {
- "additionalProperties": {},
- "type": "object"
- },
- {
- "type": "null"
- }
- ],
- "description": "The producing radar's last completed check (last_run_at), where the API serves one."
- },
- "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": {},
- "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": {
- "assessed": {
- "description": "The answer's assessed, first: null when the answer does not say.",
- "type": [
- "boolean",
- "null"
- ]
- },
- "candidates_capped": {
- "type": [
- "boolean",
- "null"
- ]
- },
- "capped": {
- "type": [
- "boolean",
- "null"
- ]
- },
- "count": {
- "type": [
- "number",
- "null"
- ]
- },
- "degraded": {
- "type": [
- "boolean",
- "null"
- ]
- },
- "excluded_count": {
- "type": [
- "number",
- "null"
- ]
- },
- "lookup": {
- "description": "Which lookup path this call asked for.",
- "enum": [
- "cpe",
- "registry"
- ],
- "type": "string"
- },
- "match_layer": {
- "type": [
- "string",
- "null"
- ]
- },
- "not_affected_count": {
- "type": [
- "number",
- "null"
- ]
- },
- "not_assessed_reason": {
- "anyOf": [
- {
- "anyOf": [
- {
- "enum": [
- "product_not_in_cpe_corpus",
- "package_not_cpe_nameable",
- "candidate_load_pending",
- "candidate_window_truncated",
- "package_not_in_advisory_corpus",
- "no_decidable_advisory",
- "advisory_lookup_failed"
- ],
- "type": "string"
- },
- {
- "type": "string"
- }
- ],
- "description": "Why assessed is false; empty or absent when it is true."
- },
- {
- "type": "null"
- }
- ]
- },
- "undetermined_count": {
- "type": [
- "number",
- "null"
- ]
- }
- },
- "required": [
- "assessed",
- "not_assessed_reason",
- "lookup",
- "match_layer",
- "count",
- "capped",
- "candidates_capped",
- "excluded_count",
- "undetermined_count",
- "not_affected_count",
- "degraded"
- ],
- "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; 503 with kind internal and path null where this server was too busy to make the call."
- }
- },
- "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": {},
+ "properties": {
+ "assessed": {
+ "description": "The answer's assessed, first: null when the answer does not say.",
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "candidates_capped": {
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "capped": {
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "count": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "degraded": {
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "excluded_count": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "lookup": {
+ "anyOf": [
+ {
+ "enum": [
+ "cpe",
+ "registry"
+ ],
+ "type": "string"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Which lookup path this call asked for."
+ },
+ "match_layer": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "not_affected_count": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "not_assessed_reason": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "enum": [
+ "product_not_in_cpe_corpus",
+ "package_not_cpe_nameable",
+ "candidate_load_pending",
+ "candidate_window_truncated",
+ "package_not_in_advisory_corpus",
+ "no_decidable_advisory",
+ "advisory_lookup_failed"
+ ],
+ "type": "string"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Why assessed is false; empty or absent when it is true."
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "undetermined_count": {
+ "type": [
+ "number",
+ "null"
+ ]
+ }
+ },
+ "required": [
+ "assessed",
+ "not_assessed_reason",
+ "lookup",
+ "match_layer",
+ "count",
+ "capped",
+ "candidates_capped",
+ "excluded_count",
+ "undetermined_count",
+ "not_affected_count",
+ "degraded"
+ ],
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "What the answer covers; null where the answer says nothing about it."
+ },
+ "data": {
+ "additionalProperties": {},
+ "properties": {
+ "advisories_considered": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "assessed": {
+ "description": "count depends on it. true: the lookup evaluated this component. false: it did not, and count 0 says nothing about whether this version is affected.",
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "candidate_count": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "candidates_capped": {
+ "description": "true: not every candidate CVE was loaded.",
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "capped": {
+ "description": "true: the match list stopped at its cap.",
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "count": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "cve_ids": {
+ "anyOf": [
+ {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "degraded": {
+ "description": "true: the lookup ran out of time.",
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "ecosystem": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "ecosystem_recognised": {
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "excluded": {},
+ "excluded_count": {
+ "description": "CPE candidates suppressed by the vendor or platform gate.",
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "match_layer": {
+ "description": "Which lookup path answered.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "matches": {
+ "anyOf": [
+ {
+ "items": {
+ "additionalProperties": {},
+ "properties": {
+ "cpe_vendor": {
+ "description": "The vendor NVD's CPE asserts for this match.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "cpe_version_end_excluding": {
+ "description": "CPE match: NVD's versionEndExcluding for the range that matched, the first version that range no longer holds. Not a fix, and never fixed_in: another range of the same CVE, or a vendor backport, can sit past it. Absent on a registry match, and where the range sets no such end.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "cpe_version_end_including": {
+ "description": "CPE match: NVD's versionEndIncluding for the range that matched, the last version that range holds. Not a fix, and never fixed_in. Absent on a registry match, and where the range sets no such end.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "cve_id": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "cvss_v2_score": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "cvss_v3_score": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "cvss_v4_score": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "description": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "echelongraph_score": {
+ "description": "EchelonGraph's 0-10 score: present only when score_assessed is true.",
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "echelongraph_severity": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "effective_score": {
+ "description": "The best real score held for the CVE (EchelonGraph's, else CVSS), the number the matches are ranked by.",
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "effective_severity": {
+ "description": "The band of effective_score; absent or empty when the CVE has no band at all (unrated, not harmless).",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "epss_score": {
+ "description": "EPSS exploitation probability, 0 to 1.",
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "fixed_in": {
+ "description": "Registry match: the lowest version above this one that no affected interval of the CVE's record for the package holds, always above it: the fixed bound of the interval that holds this version, moved past any overlapping interval that still holds that bound (fixed_in_detail then names it). null when no such version is on record (an interval on the way records no fix: it ends at last_affected, or has no end) or no interval holds the version, with fixed_in_reason saying which. Absent on a CPE match. Where fixed_in_dispute is set, the CVE record's CNA and the advisory disagree on the range that holds this version, and fixed_in follows the source its higher names (its note says how).",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "fixed_in_detail": {
+ "description": "Set when fixed_in is not the fixed bound of the interval that holds this version: the overlapping intervals of the same record it moved past, which still hold that bound.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "fixed_in_dispute": {
+ "anyOf": [
+ {
+ "additionalProperties": {},
+ "properties": {
+ "advisory_fixed": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "advisory_id": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "advisory_introduced": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "advisory_last_affected": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "advisory_listed": {
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "cna": {
+ "anyOf": [
+ {
+ "additionalProperties": {},
+ "properties": {
+ "name": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "short_name": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ },
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "cna_product": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "cna_range": {
+ "anyOf": [
+ {
+ "additionalProperties": {},
+ "properties": {
+ "changes": {
+ "anyOf": [
+ {
+ "items": {
+ "additionalProperties": {},
+ "properties": {
+ "at": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "status": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "changes_truncated": {
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "less_than": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "less_than_or_equal": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "status": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "version": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "version_type": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ },
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "cna_range_default": {
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "higher": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "enum": [
+ "cna",
+ "advisory"
+ ],
+ "type": "string"
+ },
+ {
+ "type": "string"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "kind": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "enum": [
+ "fixed",
+ "introduced"
+ ],
+ "type": "string"
+ },
+ {
+ "type": "string"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "note": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ },
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "Once EchelonGraph's API serves it, set where the API found the CVE record's CNA and the advisory disagreeing on the range that holds this version. kind: fixed (they disagree on where the package is fixed) or introduced (the CNA's range starts below where the advisory's does). The advisory's bound in dispute, exactly one of advisory_fixed, advisory_last_affected and advisory_introduced, as the advisory's own statement gives it (advisory_listed: it lists affected versions rather than a range, and the bound is a version it lists), and advisory_id, the advisory. cna (name, short_name), cna_product (what the CNA's entry names, as the API reads it) and cna_range (version, less_than or less_than_or_equal, status, version_type; changes, each {at, status}, where the range's status changes inside it, with changes_truncated where the record held more): the CNA's range in dispute, as the API reads the record (where higher is cna, the CNA's range that reaches past the advisory's bound: on a cna_affected_range match it holds the version, and on an advisory_interval or exact_version_list match it holds the advisory's bound past the version (its fix, or the versions just above its last affected or listed version), so it may start above the version; where higher is advisory, the CNA's range that ends below it, the CNA saying the version is fixed), from an entry the record writes, or, with cna_range_default true, a span no entry writes that the record's defaultStatus covers. higher: the source the answer follows, the more conservative one (cna or advisory). note: the API's sentence on the dispute and what the answer does with it, relayed verbatim. Fields and values a later API adds are relayed. Its absence is not a finding that the CNA agrees: an API that does not serve it yet, or older than the field, sends none; one that serves it reads a CNA's ranges only where it applies them and only from an entry it matches to the package; and a match the CNA's range alone raises may carry none."
+ },
+ "fixed_in_reason": {
+ "description": "Why fixed_in is null; absent when fixed_in is a version.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "interval": {
+ "anyOf": [
+ {
+ "additionalProperties": {},
+ "properties": {
+ "fixed": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "introduced": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "last_affected": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ },
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "Registry match: the affected interval that holds this version (fixed is exclusive, last_affected inclusive): the advisory's, or, where version_evidence is cna_affected_range, the CVE record's CNA range. Absent when no interval holds it."
+ },
+ "kev_listed": {
+ "description": "Listed in CISA-KEV: known to be exploited.",
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "match_confidence": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "match_method": {
+ "description": "How the match was made, as the API sends it. Registry path: registry package (an advisory record EchelonGraph holds names the package for the CVE), or cna package url (none does, and the CVE record's CNA names the package by package URL: its statement is the only source, matched_criteria is that purl as the CNA wrote it, version_evidence is cna_affected_range and match_confidence 0.8). CPE path: the CPE matcher's method. A later value is relayed too.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "match_reason": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "matched_criteria": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "ransomware": {
+ "description": "CISA-KEV records known use in ransomware campaigns.",
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "score_assessed": {
+ "description": "Whether EchelonGraph has scored the CVE. false: NOT YET SCORED, and echelongraph_score is withheld.",
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "score_unassessed_reason": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "severity": {
+ "description": "NVD's own CVSS v3 band, as provenance: it can be NONE for a CVE NVD rated only under CVSS v2. Rank and display on effective_severity.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "vendor_severity": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "vendor_unknown": {
+ "description": "true: the vendor was not verified, so the match is real but its attribution to your vendor is not.",
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "version_evidence": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "enum": [
+ "exact_version_list",
+ "advisory_interval",
+ "fix_boundary_only",
+ "no_version_supplied",
+ "cna_affected_range"
+ ],
+ "type": "string"
+ },
+ {
+ "type": "string"
+ }
+ ]
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "Registry match: how the version was decided: exact_version_list (named in the advisory's list of affected versions), advisory_interval (inside one of its intervals), fix_boundary_only (below its only stored fix, its lower bound assumed), no_version_supplied (no version given, so no claim about it), or, once EchelonGraph's API serves it, cna_affected_range (held by the CVE record's CNA range, where no advisory statement holds it: interval is the CNA's range, and fixed_in_dispute, where the API publishes one, says how the two differ; such a match may carry none; on a match whose match_method is cna package url, no advisory record names the package for the CVE at all, and the CNA's statement is the only source). Relayed as the API sends it; a later value is relayed too."
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "not_affected_count": {
+ "description": "CVEs decided as not affecting this version: on the registry path one per CVE, however many of its advisory records are stored (advisories_considered counts those, and each CVE only its CNA names the package for once, decided or not); beside assessed false (package_not_in_advisory_corpus) the count is CNA records only, and is not a clean answer.",
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "not_assessed_reason": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "enum": [
+ "product_not_in_cpe_corpus",
+ "package_not_cpe_nameable",
+ "candidate_load_pending",
+ "candidate_window_truncated",
+ "package_not_in_advisory_corpus",
+ "no_decidable_advisory",
+ "advisory_lookup_failed"
+ ],
+ "type": "string"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Why assessed is false; empty or absent when it is true."
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "package": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "product": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "product_named_count": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "undecidable_excluded_count": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "undecided_candidate_count": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "undetermined": {
+ "anyOf": [
+ {
+ "items": {
+ "additionalProperties": {},
+ "properties": {
+ "cve_id": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "detail": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "ecosystem": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "package": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "reason": {
+ "description": "Why the CVE could not be decided at this version, as the API sends it: for an advisory record, such as no_version_data, version_not_comparable, git_range_only or collapsed_fix_boundary (on the CPE path, version_not_comparable: a CPE range the version has no order against); where the CVE record's CNA statements could not be read against it, a cna_range_ reason (such as cna_range_truncated, cna_range_unreadable, cna_range_unplaceable or cna_range_conflict). For a CVE no advisory record names the package for, decided on its CNA's statement alone, also cna_range_status_unknown (no statement of the CNA's calls the version affected or unaffected) and cna_range_undecidable_scheme (the CNA states the package's versions in a version scheme the matcher cannot order, such as custom or git). Not a finding of not affected. A later value is relayed too.",
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "undetermined_count": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "vendor": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "vendor_advisory_count": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "version": {
+ "type": [
+ "string",
+ "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": {
+ "anyOf": [
+ {
+ "additionalProperties": {},
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "The producing radar's last completed check (last_run_at), where the API serves one."
+ },
+ "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": {},
+ "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": {
+ "assessed": {
+ "description": "The answer's assessed, first: null when the answer does not say.",
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "candidates_capped": {
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "capped": {
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "count": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "degraded": {
+ "type": [
+ "boolean",
+ "null"
+ ]
+ },
+ "excluded_count": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "lookup": {
+ "description": "Which lookup path this call asked for.",
+ "enum": [
+ "cpe",
+ "registry"
+ ],
+ "type": "string"
+ },
+ "match_layer": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "not_affected_count": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "not_assessed_reason": {
+ "anyOf": [
+ {
+ "anyOf": [
+ {
+ "enum": [
+ "product_not_in_cpe_corpus",
+ "package_not_cpe_nameable",
+ "candidate_load_pending",
+ "candidate_window_truncated",
+ "package_not_in_advisory_corpus",
+ "no_decidable_advisory",
+ "advisory_lookup_failed"
+ ],
+ "type": "string"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Why assessed is false; empty or absent when it is true."
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "undetermined_count": {
+ "type": [
+ "number",
+ "null"
+ ]
+ }
+ },
+ "required": [
+ "assessed",
+ "not_assessed_reason",
+ "lookup",
+ "match_layer",
+ "count",
+ "capped",
+ "candidates_capped",
+ "excluded_count",
+ "undetermined_count",
+ "not_affected_count",
+ "degraded"
+ ],
+ "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; 503 with kind internal and path null where this server was too busy to make the call."
+ }
+ },
+ "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"
+ }
+]