---
title: "List what changed in the draft since the last publish"
method: GET
path: "/api/v1/sites/{slug}/draft-status"
tags: ["Draft & publish"]
---

# List what changed in the draft since the last publish

`GET /api/v1/sites/{slug}/draft-status`

## Request

- Base URL: `https://api.dotsy.ai`
- URL: `https://api.dotsy.ai/api/v1/sites/{slug}/draft-status`
- Auth: one of:
  - HTTP bearer
  - HTTP bearer

Everything staged and not yet live: content files, routes and menu items, each `new`, `modified` or `deleted`. Review it before `publishSite`: send the `{key, hash}` pairs you reviewed (a route's `path` goes in `key`) and this `fingerprint` as `reviewedSet`, so the publish answers 409 `drafts_changed` instead of shipping something that moved after you looked. Add `verify=1` to also get the last `verifySite` run and whether the draft changed since. Safe to call repeatedly.

## Path parameters

- `slug` string, required

## Query parameters

- `verify` '1'

## Response `200`

The staged changes.

- DraftStatusResponse
  - `total` integer, required: Staged changes in all three lists.
  - `content` object[], required: Content files that differ from the live site.
    - `key` string, required
    - `status` 'modified' | 'new' | 'deleted', required
    - `hash` string, required: Fingerprint of the staged content (`deleted` for a deletion). Echo it in `reviewedSet` when you publish.
  - `routes` object[], required: Routes that differ from the live site.
    - `path` string, required
    - `status` 'modified' | 'new' | 'deleted', required
    - `hash` string, required
  - `menus` object[], required: Menu items that differ from the live site. Menus always publish together with the rest.
    - `id` string, required
    - `menu` string, required
    - `status` 'modified' | 'new' | 'deleted', required
  - `fingerprint` string, required: One opaque token for the whole staged state. If it is unchanged when you publish, nothing moved since you looked.
  - `indexState` 'building': The staged-set index is being rebuilt, so the lists above may be a subset of what is staged.
  - `contentBytesIssues` object[]: Pages whose stored bytes are missing or empty. A publish would be refused (`content_bytes_missing`): re-write them first.
    - `key` string, required
    - `reason` 'missing' | 'empty', required
  - `draftLog` object[]: The most recent draft edits an agent recorded (up to 20). Cleared when all drafts are discarded.
    - `tool` string, required
    - `context` string, required
    - `at` number, required: Unix ms.
  - `verify` object, nullable: The last `verifySite` run. Present only with `?verify=1`; `null` when the site has never been verified.
    - `at` number, required: Unix ms when that check ran.
    - `scanned` integer, required: Pages the check composed and scanned.
    - `errors` integer, required
    - `warnings` integer, required
    - `scope` 'site' | 'paths', required: `site`: every route was checked. `paths`: only the pages the caller named, so a sample.
    - `stale` boolean, required: True when the draft changed (content, routes or menus) after the check ran, so its result no longer describes it.

## Other responses

- `401`: Missing or invalid credentials.
- `403`: The key or token is scoped to other sites.
- `404`: No such site, or it is not visible to this account (`site_not_found`).

---

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