---
title: "Read a submitted analysis"
method: GET
path: "/api/v3/analyses/{analysis_id}"
tags: ["Analyses"]
---

# Read a submitted analysis

`GET /api/v3/analyses/{analysis_id}`

## Request

- Base URL: `https://ai.virustotal.com`
- URL: `https://ai.virustotal.com/api/v3/analyses/{analysis_id}`
- Auth: one of:
  - API key in header `x-apikey`
  - HTTP bearer

Read an analysis registered to the same submitting identity. Follow top-level status and next_poll_after_seconds within a finite budget; pending can coexist with analysis_status completed while verification finishes. A completed analysis is not a safety verdict.

## Path parameters

- `analysis_id` string, required: Opaque analysis ID returned by this identity's submission, at most 1024 UTF-8 bytes. Preserve the exact ID and URL-encode it as a path value; it can contain slashes. Whitespace and control characters are not accepted.

## Query parameters

- `request_id` string, nullable: Saved lowercase UUIDv4 for a network submission. Selects its receipt if an upstream analysis ID is reused; omit for file submissions.

## Response `200`

Successful Response

- union
  - AnalysisResponse
    - `status` 'pending' | 'completed', required
    - `analysis_id` string, required
    - `analysis_status` 'queued' | 'in-progress' | 'completed', nullable, required
    - `sha256` string, required
    - `source` 'VirusTotal via VTAI'
    - `retrieved_at` string, required
    - `analysis_date` string, nullable, required
    - `stats` object, nullable, required
    - `results` object, nullable, required
    - `detections` string[], required
    - `coverage` ReportCoverage, required
      - `engines` integer, nullable, required: Number of entries in last_analysis_results; null when unavailable
      - `categories` string[], required: Distinct categories actually present in last_analysis_results; not a safety verdict
    - `report_url` string, required
    - `next_poll_after_seconds` 5, nullable, required
    - `pending_reason` 'processing' | 'not_available_yet' | 'result_not_ready', nullable, required
  - NetworkAnalysisResponse
    - `status` 'pending' | 'completed', required
    - `analysis_id` string, required
    - `analysis_status` 'queued' | 'in-progress' | 'completed', nullable, required
    - `request_id` string, required
    - `indicator_type` 'url' | 'domain' | 'ip', required
    - `report_id` string, nullable, required
    - `source` 'VirusTotal via VTAI'
    - `retrieved_at` string, required
    - `analysis_date` string, nullable, required
    - `stats` object, nullable, required
    - `results` object, nullable, required
    - `detections` string[], required
    - `coverage` ReportCoverage, required
      - `engines` integer, nullable, required: Number of entries in last_analysis_results; null when unavailable
      - `categories` string[], required: Distinct categories actually present in last_analysis_results; not a safety verdict
    - `report_url` string, nullable, required
    - `next_poll_after_seconds` 5, nullable, required
    - `pending_reason` 'processing' | 'not_available_yet' | 'result_not_ready', nullable, required

## Other responses

- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not Found
- `409`: Conflict
- `413`: Request Entity Too Large
- `422`: Unprocessable Entity
- `429`: Too Many Requests
- `502`: Bad Gateway
- `503`: Service Unavailable
- `504`: Gateway Timeout

---

[API](https://skmtc.dev/virustotal/apis/virustotal-ai-api.md) · [All operations](https://skmtc.dev/virustotal/apis/virustotal-ai-api/llms.txt) · [OpenAPI document](https://skmtc.dev/virustotal/apis/virustotal-ai-api/revisions/3c7943feccc6?raw)
