---
title: "Discard a page draft"
method: DELETE
path: "/projects/{projectId}/page-drafts/{pageId}"
tags: ["Drafts and publishing"]
---

# Discard a page draft

`DELETE /projects/{projectId}/page-drafts/{pageId}`

## Request

- Base URL: `https://studio.weaverse.io/api/v1/content`
- URL: `https://studio.weaverse.io/api/v1/content/projects/{projectId}/page-drafts/{pageId}`
- Auth: HTTP bearer

Discards the page's current draft head. Live content stays as it is, and the draft's version row is kept in history; only the head pointer is removed. The next GET returns live content again.

**Fence.** Send `expectedHeadVersionId` with the `headVersionId` from GET. The discard is an exact compare-and-set:

- If another save replaced the head since your read, the response is 409 `STALE_PAGE` and nothing is discarded.
- Only an active (unscheduled) draft can be discarded. A scheduled draft, an unknown version or a page without a draft returns 404 `PAGE_NOT_FOUND`. Cancel the schedule with `DELETE /versions/{versionId}` first.

Required scope: `content:write`

## Request body

- PageDraftDiscard
  - `expectedHeadVersionId` string, required: The `headVersionId` of the draft being discarded, exactly as GET returned it. The discard is refused when the draft head has moved.

## Response `200`

Discarded

- object

## Other responses

- `401`: Missing or invalid credentials
- `403`: Foreign project or missing scope (INSUFFICIENT_SCOPE)
- `404`: Not found (never discloses other tenants)
- `409`: STALE_PAGE

---

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