---
title: "Set one page’s SEO title, description and keywords"
method: PATCH
path: "/api/v1/sites/{id}/pages/{slug}/seo"
tags: ["Pages"]
---

# Set one page’s SEO title, description and keywords

`PATCH /api/v1/sites/{id}/pages/{slug}/seo`

## Request

- Base URL: `https://app.mondovo.com`
- URL: `https://app.mondovo.com/api/v1/sites/{id}/pages/{slug}/seo`
- Auth: HTTP bearer

The PER-PAGE half of SEO — a page’s own title and description win over the site-wide defaults in `PATCH /api/v1/sites/{id}/settings`. Partial: only the fields you send change. This is a publish INPUT. Requires scope `sites:refine`.

## Request body

- UpdatePageSeoInput: Partial per-page SEO. Send only what should change.
  - `title` string, nullable: Aim for 50-60 characters.
  - `description` string, nullable: Aim for 150-160 characters.
  - `keywords` string[], nullable: Most important first.
  - `og_image_url` string, uri, nullable
  - `canonical_url` string, uri, nullable
  - `no_index` boolean
  - `no_follow` boolean
  - `variation_id` string: Design to edit. Defaults to the site’s active design.

## Response `200`

Updated. `seo` is the page’s full resulting SEO object.

- object
  - `site_id` string, uuid, required
  - `slug` string, required
  - `seo` object, required
  - `published` boolean, required: Always false — publish separately.
  - `message` string

## Other responses

- `400`: Error codes: `invalid_json`, `validation_error`, `page_seo_failed`.
- `401`: Authentication failed. Error codes: `invalid_api_key` (missing/unknown key), `key_revoked`, `key_expired`.
- `403`: Authenticated but not allowed. Error codes: `addon_required` (the API key’s workspace no longer has the Agency add-on — checked on every request, not just at key creation) and `missing_scope` (the key lacks the scope this endpoint needs).
- `404`: Error codes: `site_not_found`, `page_not_found` (the response carries `available_slugs`), `variation_not_found`.
- `429`: Rate limit exceeded (`rate_limit_exceeded`). The body includes `retry_after_seconds`, `limit`, and `window` ("minute" or "hour"); a `Retry-After` header is also set.

---

[API](https://skmtc.dev/mondovo/apis/mondovo-public-api.md) · [All operations](https://skmtc.dev/mondovo/apis/mondovo-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/mondovo/apis/mondovo-public-api/revisions/1baa3e2865ba?raw)
