---
title: "Update a single post"
method: PATCH
path: "/v1/posts/{postId}"
tags: ["Content"]
---

# Update a single post

`PATCH /v1/posts/{postId}`

Updates any combination of title, slug, markdown, and status. Sending markdown re-renders the stored HTML, and when title is omitted it is taken from the first heading in the markdown, keeping the existing title when the markdown has no heading. Slugs are only accepted for blog posts and changelogs.

## Path parameters

- `postId` string, required

## Request body

- object
  - `title` string
  - `slug` string, nullable
  - `markdown` string
  - `status` 'draft' | 'published'

## Response `200`

Post updated successfully

- object
  - `organization` object, required
    - `id` string, required
    - `slug` string, required
    - `name` string, required
    - `logo` string, nullable, required
  - `post` object, required
    - `id` string, required
    - `title` string, required
    - `slug` string, nullable, required
    - `content` string, required — Rendered HTML for text posts. For image posts, this is the public CDN URL of the rendered image.
    - `htmlUrl` string, nullable, required — Public CDN URL of the generated HTML artifact for image posts. Null for non-image posts.
    - `markdown` string, nullable, required — Markdown source for text posts. Null for image posts.
    - `rawHtml` string, nullable, required — Legacy inline generated HTML for image posts. New generated image HTML is stored as htmlUrl. Null for non-image posts.
    - `recommendations` string, nullable, required
    - `contentType` 'changelog' | 'linkedin_post' | 'twitter_post' | 'blog_post' | 'investor_update' | 'image', required
    - `sourceMetadata` unknown
    - `status` 'draft' | 'published', required
    - `createdAt` string, required
    - `updatedAt` string, required

## Other responses

- `400` — Invalid path params or request body
- `401` — Missing or invalid API key
- `403` — Forbidden
- `404` — Post not found
- `409` — Post slug already exists
- `429` — Rate limit exceeded. This endpoint allows 60 requests per 1 minute per API key.
- `503` — Authentication service unavailable

---

[API](https://skmtc.dev/usenotra/apis/notra-api.md) · [All operations](https://skmtc.dev/usenotra/apis/notra-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/usenotra/notra-api/revisions/931a7bd8d32c/schema)
