---
title: "Restore trashed content"
method: POST
path: "/content/{id}/restore"
tags: ["Content"]
---

# Restore trashed content

`POST /content/{id}/restore`

## Request

- Base URL: `https://next.frase.io/api/v1`
- URL: `https://next.frase.io/api/v1/content/{id}/restore`
- Auth: API key in header `X-API-KEY`

Bring a soft-deleted (trashed) content row back out of the Trash. Requires the `write:content` scope. Takes no request body.

Only content that is currently IN the Trash can be restored: the lookup requires the row to be org-scoped and to have a deletion timestamp, so a live (never-deleted) id, an already-restored id, and another organization's id are all indistinguishable 404s. Restoring is idempotent only in the sense that a second call 404s — it will not re-restore.

There is a hard 30-day customer restore window measured from the deletion timestamp. Once 30 or more full days have passed the endpoint answers 410 and the row can only be recovered by Frase support. The restore clears the deletion markers, bumps the row's `updated_at`, and may bring linked companion records back with it; those companions are not reported in this response.

`title` and `status` in the response are the values the row already had — restoring does not change a content row's workflow status. This endpoint does NOT run the content-rules gate and never returns 422 or a `retry_with_force` hint; that behaviour belongs to the CMS post version-restore endpoint, which republishes through the update path.

CORS preflight is supported (OPTIONS returns 204; allowed methods POST, OPTIONS; allowed headers Content-Type, X-API-KEY, token).

## Path parameters

- `id` string, uuid, required

## Response `200`

Content restored

- object
  - `data` object
    - `id` string, uuid
    - `title` string: The restored row's title, as it was in the Trash.
    - `status` 'draft' | 'generating' | 'review' | 'published' | 'archived': Workflow status, unchanged by the restore.
    - `restored` boolean: Always true on a 200.

## Other responses

- `400`: Validation failed
- `401`: Authentication failed
- `403`: Forbidden - action not allowed on this resource
- `404`: Resource not found
- `410`: Past the 30-day customer restore window — permanent, retrying will not help.
- `429`: Rate limit exceeded
- `500`: The restore failed

---

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