---
title: "Get a page's editable content and revision tokens"
method: GET
path: "/projects/{projectId}/page-drafts/{pageId}"
tags: ["Drafts and publishing"]
---

# Get a page's editable content and revision tokens

`GET /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

Returns the content you should edit for one page, plus the revision tokens that a later save must send back unchanged. This is step 1 of draft-first editing.

**Workflow.** Drafts and publishing work together like this:

1. `GET /projects/{projectId}/page-drafts/{pageId}` reads the editable content and its revision tokens.
2. `PUT` on the same path saves a new draft head (`versionId`). Live content is not touched.
3. Publish the draft with `POST /publish-versions/{versionId}`, or schedule it with `POST /versions/{versionId}/schedule`.
4. Manage history and the schedule with `GET /projects/{projectId}/versions`, `/versions/{versionId}` (read, reschedule, replace content, cancel), `publish-now` and `restore`.

**What is returned**

- When the page has a draft head: the draft's items, with `headVersionId` set to that draft. `pageUpdatedAt` and `projectUpdatedAt` are the live revisions the draft was built on, not the current live revisions. If live content has changed since the draft was saved, a save from this read is refused with 409 `STALE_PAGE`, so a draft can never quietly publish over a newer live edit.
- When there is no draft: the live items, with `headVersionId: null` and the current live `pageUpdatedAt` / `projectUpdatedAt`.
- Items are a flat list. Each item has `id`, `type`, `data` and `children` (child id references). `rootId` names the root item.
- `pageUpdatedAt` or `projectUpdatedAt` is `null` for a legacy row whose revision was never set. Send that `null` back as is. A read never repairs it.

**Addressing.** The page is addressed by `pageId` only. There is no locale or handle fallback, so a draft can never be read from or saved onto another assignment. A page that is not a live page of this project, or a draft head whose snapshot cannot be read, returns 404.

Required scope: `content:read`

## Response `200`

Draft basis (draft snapshot or live items)

- object

## Other responses

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

---

[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)
