---
title: "Rename a page or update its SEO"
method: POST
path: "/projects/{projectId}/page-settings/{pageId}"
tags: ["Page settings"]
---

# Rename a page or update its SEO

`POST /projects/{projectId}/page-settings/{pageId}`

## Request

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

Updates one page's metadata, selected by `op`. These are live writes: they change labels, routes or SEO immediately and do not go through the page draft. They never publish page content.

Operations:

- `rename`: sets the page `name` (1-191 characters) and `prefix`. Omitting `prefix` clears it.
- `rename-custom`: renames a CUSTOM page and changes its URL handle. Requires `name`, `handle` and the `assignmentId` of the CUSTOM assignment to change. Returns the handle actually written. A non-CUSTOM page returns `400`; a handle already used by another custom page returns `409 CONFLICT`. A page version is recorded after the rename.
- `set-seo`: upserts the page SEO. `seo` accepts `title` (max 70), `description` (max 320), `keywords` (max 500), `canonicalUrl` (URL), `openGraph` (`title` max 90, `description` max 200, `image` URL, `type`: `website`, `article`, `product`, `profile` or `video.other`), `twitter` (`cardType`: `summary`, `summary_large_image`, `app` or `player`; `title` max 70, `description` max 200, `image` URL) and `robots` (`index`, `follow` booleans). Empty strings are treated as unset.

Only pages this project owns exclusively can be changed; others return `404`.

Required scope: `content:write`

## Request body

- union
  - object
    - `op` 'rename', required
    - `name` string, required
    - `prefix` string
  - object
    - `op` 'rename-custom', required
    - `name` string, required
    - `handle` string, required
    - `assignmentId` string, required
  - object
    - `op` 'set-seo', required
    - `seo` object, required

## Response `200`

Updated

- object

## Other responses

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

---

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