---
title: "Edit a post"
method: PATCH
path: "/posts/{id}"
tags: ["Posts"]
---

# Edit a post

`PATCH /posts/{id}`

## Request

- Base URL: `https://www.postbase.so/api/v1`
- URL: `https://www.postbase.so/api/v1/posts/{id}`
- Auth: HTTP bearer

Edit or reschedule a draft or scheduled post. Only the fields you send change; scheduled_at null turns it into a draft.

## Path parameters

- `id` string, uuid, required

## Request body

- object
  - `body` string: The post text, for a single post.
  - `thread` string[]: Several posts to publish as a thread, in order. Takes precedence over body.
  - `channel_ids` string[]: Channels to publish to, from GET /channels.
  - `channel_bodies` object: Text for particular channels instead of body, keyed by channel id. Each is a single post.
  - `scheduled_at` string, date-time, nullable: When to publish: ISO 8601 with Z or an offset (2026-10-01T09:00:00+01:00). Omit or null to save a draft.
  - `schedule_in_minutes` number: Publish this many minutes from now, on the server's clock. Instead of scheduled_at.
  - `media_ids` string[]: Files from GET /media to attach, in order.
  - `media_urls` string[]: Public https links to images or a video, attached after media_ids. Each is downloaded into the media library (up to 10 per request, 200 MB each).
  - `youtube` object
    - `title` string
    - `privacy` 'public' | 'unlisted' | 'private'
    - `made_for_kids` boolean: Required to schedule to YouTube.

## Response `200`

The edited post

- object
  - `post` Post
    - `id` string, uuid, required
    - `status` 'draft' | 'scheduled' | 'publishing' | 'published' | 'failed', required
    - `body` string
    - `thread` string[]
    - `scheduled_at` string, date-time, nullable
    - `created_at` string, date-time
    - `media` object[]
      - `url` string, uri
      - `type` string
    - `channels` PostChannel[], required
      - `channel_id` string, uuid, required
      - `platform` string, nullable
      - `handle` string, nullable
      - `status` 'draft' | 'scheduled' | 'publishing' | 'published' | 'failed', required
      - `url` string, uri, nullable: The live post, once published
      - `error` string, nullable: Why it failed
      - `warning` string, nullable: It published, with something to know
      - `retry_at` string, date-time, nullable: When Postbase will retry a failed channel on its own
      - `body` string, nullable: This channel's own text, if any
      - `metrics` object, nullable: Latest likes, impressions, etc.
    - `summary` object
      - `published` integer
      - `failed` integer
      - `pending` integer
    - `warning` string

## Other responses

- `400`: Invalid request
- `401`: Missing or invalid API key
- `402`: No active plan
- `404`: Not found
- `409`: Conflict with the post's state
- `429`: Rate limited

---

[API](https://skmtc.dev/postbase/apis/postbase-api.md) · [All operations](https://skmtc.dev/postbase/apis/postbase-api/llms.txt) · [OpenAPI document](https://skmtc.dev/postbase/apis/postbase-api/revisions/6d9919b1e551?raw)
