Skip to main content
Scan results use the v3 report schema. The sections below describe the fields you typically use when reading CLI or API output. For the full schema, see the Get scan results API in the HiddenLayer Developer Portal (Console login required). For a response without file-level results, see Get scan result summary.

Report structure

Product documentation uses threat level for the rating exposed by API fields such as severity and highest_severity. These field names remain unchanged.

Understanding scan results

Use the scan’s summary to understand its findings, threat classifications, and coverage. The newer threat-summary fields described below are available in supported API responses; CLI field availability depends on the scanner version. See CLI and API availability. Scan status and policy compliance describe separate outcomes: whether scanning finished and whether the result satisfies the configured policy.

Findings

A finding appears in a file’s detections or advisories collection. The scanner determines which collection contains the finding; threat_type does not determine its placement. Findings with threat_type: "vulnerable" can appear in either collection, so check both when looking for vulnerabilities. For the meaning of category, threat type, and threat level, see Finding Classification. This page explains how those values are represented and summarized in a report. Counts represent findings, not distinct files. A scan can have zero detections and still have advisories, including vulnerabilities.

Threat classification

summary.top_threat_type selects the highest-priority classification present in the scan. Its priority order is independent of threat level: malicious → suspicious → unclassified → vulnerable → advisory → none See Threat types for the four finding classifications. Two additional values describe report state:
  • unclassified: a detection has a missing or unrecognized threat type, such as one produced before threat classification was available.
  • none: the scan completed without findings. This does not establish that every file was successfully analyzed. It is not a group in summary.threat_types.
Advisories with missing or unrecognized threat types are grouped as advisory. summary.threat_types provides a breakdown keyed by classification. Only groups containing findings are included; none is not a breakdown group. Each group contains:
  • count: number of findings in the group.
  • highest_severity: highest threat level within the group (critical, high, medium, or low), omitted if no finding has a ranked threat level.
  • categories: unique, nonempty finding categories, when available.
  • mitre_atlas: unique MITRE ATLAS tactic/technique pairs, when available.
For example, a scan can have a malicious detection with a Low threat level and a vulnerability advisory with a High threat level. Its top threat type is still malicious, while the vulnerability group’s highest threat level is high:
This is a summary excerpt, not a complete scan report.

Scan threat level

summary.highest_severity is the legacy, detection-only threat level summary. It excludes advisories, even when an advisory has a threat level. Prefer summary.threat_types for threat level across both detections and advisories. The Console’s threat level badges represent these values: The older summary.severity and top-level severity fields are deprecated and use safe in place of none. Neither none nor safe means that there are no advisories or that the scan is policy-compliant.

Scan status and coverage

A done scan or a zero finding count does not guarantee complete coverage. Check failed and unknown file counts before interpreting the absence of findings.

Policy outcome

compliance.status is COMPLIANT or NONCOMPLIANT, according to the policy evaluation. It is separate from threat type and threat level: findings do not by themselves determine the policy outcome. compliance.evaluated_at records when that evaluation occurred. An absent compliance result does not mean COMPLIANT.

CLI and API availability

CLI output

CLI v3 JSON is generated locally from the scan results. Its summary is computed even when the scan fails, so read counts together with status. The API completion rules below do not apply to locally generated CLI summaries. Scanner versions using the earlier v3 summary format provide detection/advisory counts and highest_severity, but do not emit top_threat_type, findings_count, or threat_types. Do not expect these newer fields solely because the output uses the v3 schema. For these versions, detections plus advisories give the total finding count; an omitted advisory_count represents zero. Platform feature availability does not change an installed CLI’s output format. Policy compliance is a platform evaluation; local CLI output should not be assumed to contain it. After submitting results, retrieve the API report to read any available compliance result.

Enable threat-classification output

For scanner builds that support VRT output, set HL_MODEL_SCANNER_VRT_OUTPUT=true in the scanner process environment. In Docker, add the following option to your existing docker run command before the image name:
In builds with the opt-in feature, the default is false. Enabling it includes finding threat types, richer advisory metadata, and the summary’s threat-type breakdown. It also enables threat-type CLI flags. Older builds may not support this setting; setting an environment variable does not upgrade the scanner. This controls output, not rule definitions. It does not change a detection’s threat level or category. Use a scanner build containing the updated rule metadata to obtain current category and threat level values.

API responses

Request include_threat_types=true to include summary.top_threat_type, summary.findings_count, and summary.threat_types when available. The deployment’s threat-classification feature must also be enabled; without the query parameter or feature, these fields are omitted. Older stored reports can lack the findings count and breakdown even after that feature is enabled.
  • findings_count and threat_types are populated for scans with status: done; they are omitted for other statuses.
  • top_threat_type can describe findings received before completion. With no findings, it is none only for a completed scan; otherwise it is omitted.
  • A completed scan with no findings has findings_count: 0 when the newer summary is available. Its empty threat_types breakdown is omitted.
  • A missing new field means the value is unavailable, not zero or none. Missing optional category, MITRE ATLAS, or threat level fields within a group do not negate that group’s finding count.
Use the summary counts instead of the deprecated top-level detection_count, file_count, and files_with_detections_count fields.

Other summary fields

File results

Each entry in file_results describes one scanned file.

Detections

Present when a file triggers a detection rule.

Advisories

The advisories collection contains findings emitted as advisories by the scanner. An advisory can carry a threat type and threat level; its collection does not imply threat_type: "advisory". See Finding Classification for their meaning.

Type-specific evidence

file_results[].details.file_type_details includes extra fields for some model formats. Use these fields to understand format metadata that often contextualizes detections.
Not every file type populates file_type_details. Empty objects are normal for formats that do not expose additional metadata.