---
title: "Retract a fact"
method: POST
path: "/v1/facts/{id}/retract"
tags: ["Facts"]
---

# Retract a fact

`POST /v1/facts/{id}/retract`

## Request

- Base URL: `https://brain.inite.ai`
- URL: `https://brain.inite.ai/v1/facts/{id}/retract`
- Auth: HTTP bearer

Marks the fact retracted and writes the audit trail. Two cascades follow: facts DERIVED from it are retracted too (`cascadedFactIds`), and facts this one had SUPERSEDED come back to active (`revivedFactIds`) unless they were separately retracted on their own merits. Deliberately NOT gated by FACTS_API_ENABLED — the read routes above are, but a tenant must always be able to remove a fact. `brain:write` is the floor; FactsService elevates the requirement to `brain:admin` for billing_event / human_declared / legal-source facts once it has read the row (403 from there, not from the guard). For erasure rather than retraction, see the GDPR cascade on the admin surface (docs/api.md).

Required scope: `brain:write`.

## Path parameters

- `id` string, required

## Request body

- RetractFactRequest
  - `reason` string, required
  - `retractedBy` RetractedBy, required
    - `source` 'human' | 'system', required
    - `userId` string

## Response `201`

What the retraction changed.

- RetractFactResponse
  - `cascadedFactIds` string[], required
  - `factId` string, required
  - `retractedAt` string, required
  - `revivedFactIds` string[], required

## Other responses

- `400`: Validation failed.
- `401`: Missing or unknown bearer key.
- `403`: The key lacks the required scope.
- `404`: No such resource in this tenant.

---

[API](https://skmtc.dev/inite/apis/inite-brain-platform-api.md) · [All operations](https://skmtc.dev/inite/apis/inite-brain-platform-api/llms.txt) · [OpenAPI document](https://skmtc.dev/inite/apis/inite-brain-platform-api/revisions/c7c3eb5e304b?raw)
