---
title: "Get a pentest report"
method: GET
path: "/v1/pentests/{pentest_slug}/reports/{report_id}"
tags: ["pentests"]
---

# Get a pentest report

`GET /v1/pentests/{pentest_slug}/reports/{report_id}`

## Request

- Base URL: `https://api.ethiack.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.ethiack.com/v1/pentests/{pentest_slug}/reports/{report_id}`
- Auth: none declared

Return one pentest report by id (404 if not found or not authorized).

Args:
    pentest_slug (str): Public pentest identifier.
    report_id (int): Identifier of the report within the pentest.
    db (AsyncSession): Request-scoped database session.
    context (ActiveContext): Resolved caller identity and scope.

Returns:
    ReportDetailResponse: The requested report.

## Path parameters

- `pentest_slug` string, required
- `report_id` integer, required

## Response `200`

Successful Response

- ReportDetailResponse: Detailed report representation (single-item view).
  - `id` integer, required
  - `pentest_slug` string, nullable
  - `options` object: Generation options this report was requested with. Empty for types that take none.
  - `document_type` string, required
  - `status` integer, required
  - `url` string, nullable
  - `start_date` string, date-time, nullable
  - `end_date` string, date-time, nullable
  - `generation_date` string, date-time, nullable
  - `error` string, nullable
  - `convert_to_pdf` boolean
  - `language` 'en' | 'pt' | 'de' | 'fr' | 'es': Language a document is rendered in. Members are ISO 639-1 codes. This docstring is served as the field description in the public OpenAPI spec, so keep it about the contract; the reasoning behind the closed set is on :attr:`~phoenix.db.models.document.Document.language` and in revision ``a3f8d2c15e47``. The values are what ``documents.language`` stores (a native PostgreSQL enum of member *values*, unlike ``document_type`` above -- NULL there for the CSV exports, which render no text) and what the report-generation microservice takes on the wire, where they must match its own ``Language`` enum label for label — it ships translations for exactly these five and answers anything else with English, so a member added here without one there is silently wrong rather than an error.
  - `created` string, date-time, nullable
  - `event_slug` string, nullable, required: Previous name for pentest_slug.

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/ethiack/apis/ethiack-api.md) - [All operations](https://skmtc.dev/ethiack/apis/ethiack-api/llms.txt) - [OpenAPI document](https://skmtc.dev/ethiack/apis/ethiack-api/revisions/4eaba89bfebf?raw)
