---
title: "List, download or diff project backups"
method: GET
path: "/projects/{projectId}/backups"
tags: ["Backups and portability"]
---

# List, download or diff project backups

`GET /projects/{projectId}/backups`

## Request

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

Read-only access to the project's point-in-time backups. One endpoint, three modes:

- No query: lists backups, newest first, as `{ object: "list", data: [{ id, byteSize, trigger, createdAt }] }`. `trigger` is one of `SCHEDULED`, `PRE_DELETE`, `PRE_RESET`, `PRE_PUBLISH`, `MANUAL`.
- `?backupId=<id>`: downloads the stored backup as a brotli-compressed file (`application/x-brotli`, `attachment`). This is the file `POST /backup-restores` accepts.
- `?diff=<id>`: compares that backup with the live project and returns `{ object: "backup_diff", backupId, diff }`. `diff` has `added`/`removed`/`changed`/`unchanged` counts for `pages`, `items`, `translations`, `globalSections` and `languages` (with named `changes` where a label exists, capped), `theme.changed`, and `hasChanges`.

A backup id is resolved through this project and the caller's shop before any storage read; an unknown or foreign id returns 404.

Required scope: `project:manage`

## Response `200`

Backup list, or the diff for ?diff=. ?backupId= downloads the stored backup as a brotli-compressed JSON attachment (application/x-brotli).

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