---
title: "Get a scan report"
method: GET
path: "/api/v1/scans/{scan_id}/report"
tags: ["scans"]
---

# Get a scan report

`GET /api/v1/scans/{scan_id}/report`

## Request

- Base URL: `https://api.sytecheck.app` (the document declares no server; this is the origin it was published from)
- URL: `https://api.sytecheck.app/api/v1/scans/{scan_id}/report`
- Auth: HTTP bearer

Return the full report: an executive summary with recommended actions, a scored
breakdown, and per-category findings.

Each finding carries a recommendation, except where the account's plan withholds
it: a finding with `detail_locked: true` reports what is wrong (`title`, `detail`,
`severity`) with an empty `recommendation` and no `snippet`. The free plan locks
accessibility fixes this way; every paid plan, and any scan bought with a one-off
scan credit, returns them in full.

Available once the scan is finished; answers `409` while it is still running.

Report text is stored in English and translated on demand — pass `?lang=de` or
send an `Accept-Language` header. A translation failure falls back to English
rather than erroring.

Each category carries its own status. `pass`, `warn` and `fail` reflect its
score; `error` means the analysis failed; `blocked` means the site's bot
protection refused automated access. Both `error` and `blocked` carry a null
score and are excluded from the overall score rather than counted as failures.

## Path parameters

- `scan_id` integer, required

## Query parameters

- `lang` string, nullable: Language for report content (e.g. 'es', 'pt-BR'). Falls back to the Accept-Language header, then English.

## Headers

- `accept-language` string, nullable

## Response `200`

Successful Response

- ScanReportResponse: Full structured report for a completed scan, suitable for rendering or PDF export.
  - `id` integer, required
  - `url` string, required
  - `label` string, nullable, required
  - `status` 'queued' | 'scanning' | 'summarizing' | 'complete' | 'failed', required
  - `overall_score` number, nullable, required
  - `created_at` string, date-time, required
  - `completed_at` string, date-time, nullable, required
  - `score_breakdown` ScoreBreakdownItem[], required
    - `category` string, required
    - `score` number, nullable, required
    - `weight` number, required
  - `screenshots` ScreenshotResponse[], required
    - `breakpoint` 'mobile' | 'tablet' | 'desktop', required
    - `storage_key` string, required
    - `signed_url` string, nullable
  - `categories` CategoryReportResponse[], required
    - `category` string, required
    - `status` 'pass' | 'warn' | 'fail' | 'error' | 'blocked', required
    - `score` number, nullable, required
    - `summary` string, required
    - `findings` FindingResponse[], required
      - `id` string, required
      - `severity` 'critical' | 'warning' | 'info', required
      - `title` string, required
      - `detail` string, required
      - `recommendation` string, required
      - `snippet` string, nullable
      - `detail_locked` boolean
    - `metrics` MetricReport[]
      - `id` string, required
      - `label` string, required
      - `value` string, required
      - `rating` 'good' | 'needs-improvement' | 'poor', nullable
  - `executive_summary` ExecutiveSummary: Claude-generated plain-English overview and prioritised actions for a scan.
    - `summary` string, required
    - `top_actions` string[], required

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/sytecheck/apis/sytecheck-api.md) · [All operations](https://skmtc.dev/sytecheck/apis/sytecheck-api/llms.txt) · [OpenAPI document](https://skmtc.dev/sytecheck/apis/sytecheck-api/revisions/797cf6b3e867?raw)
