# Get an issue

`GET /app/issues/{id}`

The issue with its latest finding, detection history, proof, how to reproduce it, and its comments.

Scope: `issues:read`.

## Parameters

- `id` (path, integer, required)

## Example

```bash
curl -X GET "https://api.fortwatch.ai/app/issues/42" \
  -H "Authorization: Bearer $FORTWATCH_API_KEY"
```

## Response 200

The request succeeded.

- `id` (number, required)
- `workspaceId` (number, required)
- `assetId` (number, required)
- `title` (string, required)
- `description` (string | null, required)
- `severity` (string, required)
- `status` (string, required)
- `templateId` (string | null, required)
- `dedupKey` (string, required)
- `assignedTo` (number | null, required)
- `resolution` (string | null, required)
- `resolvedBy` (string | null, required)
- `resolvedByScanId` (number | null, required)
- `resolvedByUserId` (number | null, required)
- `dismissedByUserId` (number | null, required)
- `category` (string, required)
- `dueDate` (string (date-time) | null, required)
- `resolvedAt` (string (date-time) | null, required)
- `lastReopenedAt` (string (date-time) | null, required)
- `dismissReason` (string | null, required)
- `dismissNotes` (string | null, required)
- `dismissExpiresAt` (string (date-time) | null, required)
- `firstSeenAt` (string (date-time), required)
- `lastSeenAt` (string (date-time), required)
- `lastCheckedAt` (string (date-time) | null, required)
- `reachability` (string, required)
- `verificationScanId` (number | null, required)
- `verificationSkipped` (string | null, required)
- `createdAt` (string (date-time), required)
- `updatedAt` (string (date-time), required)
- `latestFinding` (object | null, required)
- `detectionHistory` (object[], required)
  - `id` (number, required)
  - `scanId` (object | null, required)
  - `createdAt` (string (date-time), required)
- `totalDetections` (number, required)
- `cdnFronting` (object[], required)
  - `asset` (string, required)
  - `name` (string, required)
  - `source` (string, required)
- `comments` (object[], required)
  - `id` (number, required)
  - `body` (string, required)
  - `authorName` (string, required)
  - `userId` (object | null, required)
  - `createdAt` (string (date-time), required)
  - `editedAt` (string (date-time) | null, required)
- `proof` (object | null, required)
- `reproduce` (object | null, required)
- `vantage` (object | null, required)
- `raw` (object, required)
- `evidence` (object | null, required)
- `verification` (object, required)
  - `status` (string, required) One of: `queued`, `running`, `done`, `failed`, `skipped`.
  - `scanId` (number | null, required)
  - `reason` (string | null, required): Why no re-check started: limit, asset_not_active, ownership_unverified, error
  - `nextScheduledAt` (string (date-time) | null, required): The asset's next scheduled scan, when no re-check started

```json
{
  "id": 42,
  "workspaceId": 42,
  "assetId": 42,
  "title": "string",
  "description": "string",
  "severity": "string",
  "status": "string",
  "templateId": "string",
  "dedupKey": "string",
  "assignedTo": 1,
  "resolution": "string",
  "resolvedBy": "string",
  "resolvedByScanId": 42,
  "resolvedByUserId": 42,
  "dismissedByUserId": 42,
  "category": "string",
  "dueDate": "2026-10-16T12:00:00.000Z",
  "resolvedAt": "2026-10-16T12:00:00.000Z",
  "lastReopenedAt": "2026-10-16T12:00:00.000Z",
  "dismissReason": "string",
  "dismissNotes": "string",
  "dismissExpiresAt": "2026-10-16T12:00:00.000Z",
  "firstSeenAt": "2026-10-16T12:00:00.000Z",
  "lastSeenAt": "2026-10-16T12:00:00.000Z",
  "lastCheckedAt": "2026-10-16T12:00:00.000Z",
  "reachability": "string",
  "verificationScanId": 42,
  "verificationSkipped": "string",
  "createdAt": "2026-10-16T12:00:00.000Z",
  "updatedAt": "2026-10-16T12:00:00.000Z",
  "latestFinding": {},
  "detectionHistory": [
    {
      "id": 42,
      "scanId": {},
      "createdAt": "2026-10-16T12:00:00.000Z"
    }
  ],
  "totalDetections": 1,
  "cdnFronting": [
    {
      "asset": "string",
      "name": "Production",
      "source": "string"
    }
  ],
  "comments": [
    {
      "id": 42,
      "body": "string",
      "authorName": "string",
      "userId": {},
      "createdAt": "2026-10-16T12:00:00.000Z",
      "editedAt": "2026-10-16T12:00:00.000Z"
    }
  ],
  "proof": {},
  "reproduce": {},
  "vantage": {},
  "raw": {},
  "evidence": {},
  "verification": {
    "status": "queued",
    "scanId": 42,
    "reason": "string",
    "nextScheduledAt": "2026-10-16T12:00:00.000Z"
  }
}
```

## Errors

- 400: The request is not valid: a field is missing or has the wrong shape (the message names it).
- 401: No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).
- 403: Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.
- 404: Not found in your workspace.
- 429: Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.
