---
title: "Edit a topic"
method: PATCH
path: "/api/mcp/projects/{projectId}/topics/{topicId}"
tags: ["Prompts"]
---

# Edit a topic

`PATCH /api/mcp/projects/{projectId}/topics/{topicId}`

## Request

- Base URL: `https://app.searchable.com`
- URL: `https://app.searchable.com/api/mcp/projects/{projectId}/topics/{topicId}`
- Auth: HTTP bearer

Edit a prompt topic as the in-app Topics tab does: rename it, change its seed keyword, archive it, or restore an archived one. Archiving takes the topic off every prompt it was on, and restoring it later does not put it back on them. A name another live topic in the project uses (ignoring case and surrounding spaces) is refused with 409 `conflict`, carrying that topic's id as `existingTopicId`. Requires the `prompt:draft` capability. A pitch project that is not currently active refuses with 409 `INACTIVE_PITCH_PROMPT_MUTATION`.

## Path parameters

- `projectId` string, uuid, required
- `topicId` string, uuid, required

## Request body

- UpdateTopicRequest: At least one field.
  - `name` string: The topic's new name.
  - `seedKeyword` string: The keyword the topic is built around.
  - `status` 'active' | 'archived': archived archives the topic: it comes off every prompt it was on, and restoring it later does not put it back on them. active restores an archived topic.

## Response `200`

Topic updated.

- UpdateTopicResponse
  - `success` boolean, required
  - `topic` TopicRecord, required: The prompt_topics row createTopic creates and updateTopic returns — the raw internal shape (not the read-side listTopics summary, which adds prompt counts).
    - `id` string, uuid, required
    - `projectId` string, uuid
    - `name` string, required
    - `type` string
    - `purpose` string
    - `status` string
    - `generatedBy` string
    - `createdAt` string, date-time
    - `updatedAt` string, date-time

## Other responses

- `400`: Error response. `code` is the machine-readable reason — see the [error reference](/api/errors) for the full catalog and remediation per code.
- `401`: Error response. `code` is the machine-readable reason — see the [error reference](/api/errors) for the full catalog and remediation per code.
- `403`: Error response. `code` is the machine-readable reason — see the [error reference](/api/errors) for the full catalog and remediation per code.
- `404`: Error response. `code` is the machine-readable reason — see the [error reference](/api/errors) for the full catalog and remediation per code.
- `409`: Error response. `code` is the machine-readable reason — see the [error reference](/api/errors) for the full catalog and remediation per code.
- `429`: Rate limited. Usually the per-API-key REST limit (600 requests/minute); on Google-backed endpoints it can also relay an upstream Google rate limit. `Retry-After` (seconds) is present when the limit was applied by Searchable's own rate limiter; it may be absent when an upstream provider rate-limits.

## Changes

- **2026-11-03** `28a5e2a65cd3`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/searchable/apis/searchable-rest-api/changes/api/mcp/projects/:projectId/topics/:topicId/patch.md)

---

[API](https://skmtc.dev/searchable/apis/searchable-rest-api.md) - [All operations](https://skmtc.dev/searchable/apis/searchable-rest-api/llms.txt) - [OpenAPI document](https://skmtc.dev/searchable/apis/searchable-rest-api/revisions/a1cc70e46e73?raw)
