---
title: "Create a backup or restore one as a new project"
method: POST
path: "/projects/{projectId}/backups"
tags: ["Backups and portability"]
---

# Create a backup or restore one as a new project

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

Two operations, selected by `op`:

- `{ "op": "create" }`: backs up the project now. Deduplicated: when the current content matches a stored snapshot, nothing is uploaded and the response has `deduped: true`. Returns 200 `{ object: "backup_created", deduped }`.
- `{ "op": "restore", "backupId": "…" }`: restores that backup as a new project in the caller's shop. It never overwrites the current project, so no confirmation is required. Returns 201 `{ object: "project_restored", newProjectId }`.

Neither operation is destructive to existing content. The backup id must belong to this project (404 otherwise).

Required scope: `project:manage`

## Request body

- union
  - object
    - `op` 'create', required
  - object
    - `op` 'restore', required
    - `backupId` string, required

## Response `200`

Created (deduped flag)

- object

## Other responses

- `201`: Restored as new project
- `400`: Invalid body (INVALID_PARAMS)
- `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)
