---
title: "Edit a draft or scheduled post."
method: PATCH
path: "/v1/posts/{id}"
tags: ["Posts"]
---

# Edit a draft or scheduled post.

`PATCH /v1/posts/{id}`

## Request

- Base URL: `https://api.ravenpo.st`
- URL: `https://api.ravenpo.st/v1/posts/{id}`
- Auth: HTTP bearer

Editing resets the post to draft — pass `action` in the same call to re-schedule or publish it. A published post cannot be edited.

## Path parameters

- `id` string, required

## Request body

- object
  - `type` string: Post format. Instagram's model, reused as the shared one — a platform that doesn't honour the format falls back to its own default rather than failing.
  - `accountIds` string[]: Destination accounts, from GET /v1/accounts. One post fans out to all of them — at most one X account, since X forbids the same post on several accounts.
  - `mediaIds` string[]: Media assets to attach. Pass [] for a text-only post where the platform allows it.
  - `action` string: What to do with it. 'schedule' needs scheduledAt; 'queue' resolves the next free slot in the workspace posting schedule and fails if none is configured.
  - `caption` string: Base caption, used by every platform without an override. The text X publishes may carry one $cashtag; a second is rejected, as X would.
  - `captionOverrides` object: Per-platform caption. A platform with no entry publishes the base caption. Keys are platform ids from GET /v1/platforms.
  - `scheduledAt` string: When to publish, for action: 'schedule'.
  - `threadParts` string[]: Follow-up posts published in order after the head, on platforms that declare a thread model (X, Bluesky, Mastodon, Threads, Telegram, Discord). Over the platform limit is rejected, never truncated.
  - `firstComment` string: Posted as a comment under the Instagram post right after it publishes, typically for hashtags. Instagram only, and never on a story. A comment Instagram refuses does not fail the post. On update, null clears it.
  - `replyToTweetId` string: Publish the head post as a reply under this tweet. Accepts an id or a tweet URL. X only — and X only takes a reply from an app to the account's own post, or to a post that @mentions it or quotes one of its posts.
  - `quoteTweetId` string: Embed this tweet as a quote card. Id or URL. X only, independent of replyToTweetId — and X only takes a quote of the account's own post, or of one that @mentions it.
  - `tiktokOptions` object: TikTok privacy level, interaction switches and commercial disclosure, keyed by account id. Omitted, a TikTok target publishes SELF_ONLY — TikTok requires the creator to choose, so we never pick a wider audience for them.
  - `audio` object: Reel audio ({ audioId, audioVolume, videoVolume }). Instagram reels only, and only on an account connected through Facebook.
  - `reelCover` object: An Instagram reel's cover: { mediaId } — a JPEG of up to 8 MB from the media library — or { offsetMs }, a frame of the video in milliseconds, before it ends. One or the other. Instagram reels only, on either connection; dropped for any other format. On update, null goes back to Instagram's default, the first frame.
  - `trialReel` string: Publish an Instagram reel as a trial: shown to non-followers first, and to followers once it graduates — by hand in the Instagram app (MANUAL) or by Instagram when it performs well (SS_PERFORMANCE). Instagram decides which accounts may post one; a refused trial fails rather than going out as a normal reel. On update, "" or null makes it a normal reel.
  - `pinterestBoards` object: Which board each Pinterest account pins to, keyed by account id (see GET /v1/accounts/:id/boards). Required to publish: a pin belongs to a board and Pinterest has no default, so a Pinterest target without one fails at publish time. A draft saves fine without it.
  - `pinterestOptions` object: Pinterest pin title ({ title }), max 100 characters. Separate from the caption, which becomes the 800-character description; unset, the caption’s first line is used.
  - `linkUrl` string: The URL this post points at. Facebook publishes it as a link preview card; Pinterest makes it the pin’s destination. Every other platform ignores it.
  - `recurrence` object: Makes this an evergreen post: each occurrence is created after the previous one publishes. Not with an X account, whose rules forbid repeating a post.

## Response `200`

Success

## Other responses

- `401`: Missing, malformed or revoked token
- `429`: Rate limited (120 requests/minute)

---

[API](https://skmtc.dev/ravenpo/apis/ravenpost-api.md) · [All operations](https://skmtc.dev/ravenpo/apis/ravenpost-api/llms.txt) · [OpenAPI document](https://skmtc.dev/ravenpo/apis/ravenpost-api/revisions/82905d43e21d?raw)
