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

# Create a topic

`POST /api/mcp/projects/{projectId}/topics`

## Request

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

Create a user-authored prompt topic — the same `prompt_topics` row the in-app Topics tab creates. A name one of the project's topics already uses (ignoring case and surrounding spaces; archived topics excepted) 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

## Request body

- CreateTopicRequest
  - `name` string, required
  - `description` string
  - `seedKeyword` string
  - `category` 'blind_spot' | 'opportunity' | 'strong'

## Response `200`

Topic created.

- CreateTopicResponse
  - `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/post.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)
