> ## Documentation Index
> Fetch the complete documentation index at: https://docs.shipstar.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# publish_content

> Publish a completed changelog, blog post, or KB article set directly

Publishes a completed changelog, blog post, or KB article set directly — for on-demand generations that have no review event (where [`approve_content`](/mcp/lifecycle/approve-content) fails). Assigns a public slug and makes the content live immediately. Only call this after the user has reviewed the draft and confirmed.

**KB caveat:** exactly one knowledge base set is live at a time — publishing a `kb_articles` record takes over the stable KB slug and unpublishes the previous set. To add articles instead of replacing the whole KB, first merge the live set's articles into your draft with [`get_kb_article_set`](/mcp/kb/get-kb-article-set) + [`update_content`](/mcp/lifecycle/update-content), then publish the merged record.

## Arguments

| Name         | Type          | Description                                       |
| ------------ | ------------- | ------------------------------------------------- |
| `content_id` | string (UUID) | The `content_id` returned by a `generate_*` tool. |

## Returns

```json theme={null}
{
  "content_id": "7f5e2c1a-...",
  "output_type": "blog_post",
  "is_published": true,
  "published_at": "2026-08-10T15:20:04+00:00",
  "public_slug": "shipping-faster-with-shipstar",
  "public_url": "https://api.shipstar.example/api/v1/blog/shipping-faster-with-shipstar"
}
```

`public_url` is the live public endpoint for the content (`/api/v1/changelog/{slug}`, `/api/v1/blog/{slug}`, or `/api/v1/kb/{slug}` depending on type).

## Errors

* `Only changelogs, blog posts, and KB articles can be published` — other types go through [`approve_content`](/mcp/lifecycle/approve-content) or [`send_release_email`](/mcp/email/send-release-email).
* `Only completed content can be published` — wait for [`get_generation_status`](/mcp/lifecycle/get-generation-status) to report `completed`.
* `Invalid content_id (must be a UUID): abc123`
* `Content not found`

## Example prompts

> "Publish that blog post now and give me the public URL."

> "Ship the changelog draft live immediately — no need to schedule it."
