---
title: "Close a finding (mark fixed or dismiss as not an issue)"
method: PATCH
path: "/api/v1/findings/{finding_id}/close"
tags: ["findings"]
---

# Close a finding (mark fixed or dismiss as not an issue)

`PATCH /api/v1/findings/{finding_id}/close`

## Request

- Base URL: `https://api.enokilabs.ai`
- URL: `https://api.enokilabs.ai/api/v1/findings/{finding_id}/close`
- Auth: none declared

Closes a finding from CI/CD or an agent: mark it 'fixed' or dismiss it as not an issue ('dismissed'). Every close requires an explanation, and a dismissal also requires a category (reason_code). Workspace-scoped: a finding from another workspace resolves to 404.

## Path parameters

- `finding_id` string, required

## Headers

- `Authorization` string, nullable: Bearer token with API key

## Request body

- ApiFindingCloseRequest: Request body to close a finding. Every close needs an explanation, and a dismissal also needs a reason code.
  - `status` 'fixed' | 'dismissed', required: Close action: 'fixed' (resolved) or 'dismissed' (not an issue).
  - `explanation` string, required: Why the finding is being closed. Required for every close: recorded as the fix description when 'fixed' and as the dismissal rationale when 'dismissed'. Maximum 4000 characters.
  - `reason_code` 'data_is_public' | 'authenticated_users_only' | 'working_as_designed' | 'mitigated_elsewhere' | 'accepted_risk' | 'false_positive' | 'other', nullable: Dismissal category. Required when status is 'dismissed'; ignored otherwise. Allowed values: data_is_public, authenticated_users_only, working_as_designed, mitigated_elsewhere, accepted_risk, false_positive, other.

## Response `200`

Successful Response

- ApiFindingItem: One finding, with the attacks that reproduce it in `attacks`.
  - `finding_id` string, required
  - `lens` 'security' | 'safety' | 'quality' | 'policy', required: The kind of testing a finding came from.
  - `category` string, required
  - `severity` 'critical' | 'high' | 'medium' | 'low', required: Business-impact severity levels, ordered from most to least severe.
  - `description` string, required
  - `expected_behavior` string, required
  - `status` string, required
  - `created_at` string, required
  - `attacks` ApiAttackItem[], required
    - `attack_id` string, required
    - `score` integer, required
    - `source` ApiAttackSource, required: Provenance block of one attack in the external API response.
      - `source_type` 'manual' | 'adaptive_attacker' | 'compliance' | 'test_suite' | 'drill_down', required: What produced a finding's attack. An assessment, a compliance workflow, a test suite, a manual entry, or a follow-up on an existing finding.
      - `assessment_id` string, required
      - `attack_index` integer, required
      - `date` string, nullable, required
    - `replay_script` ReplayStepResponse[], required
      - `step` 'chat' | 'http' | 'assert', required
      - `message` string, nullable
      - `response` string, nullable
      - `session_id` string, nullable
      - `method` string, nullable
      - `url` string, nullable
      - `headers` object, nullable
      - `body` string, nullable
      - `response_status` integer, nullable
      - `response_body` string, nullable
      - `target` string, nullable
      - `assertion` string, nullable
      - `expected_behavior` string, nullable
      - `capture_as` string, nullable
    - `last_replay_status` 'pending' | 'succeeded' | 'failed' | 'inconclusive' | 'stale', required
    - `last_replayed_at` string, nullable
    - `created_at` string, required

## Other responses

- `403`: The workspace's plan withholds this finding's proof, so its status cannot be changed
- `404`: Finding not found
- `422`: Invalid status, category, or explanation

---

[API](https://skmtc.dev/enokilabs/apis/enoki-external-api.md) · [All operations](https://skmtc.dev/enokilabs/apis/enoki-external-api/llms.txt) · [OpenAPI document](https://skmtc.dev/enokilabs/apis/enoki-external-api/revisions/9b13fb6ab124?raw)
