Skip to main content
PUT
Update a post by slug

Authorizations

Authorization
string
header
required

API key for authenticating protected endpoints. Pass as Bearer token in Authorization header.

Path Parameters

slug
string
required

URL-friendly identifier of the post to update

Required string length: 1 - 256

Body

application/json

Body

markdown
string

Post content in Markdown format. Replaces the FULL body. Markdown cannot represent buttons, linked images, or embedded media (videos, tweets, link cards) — replacing a post that has any of those with markdown drops them. Use bodyJson (round-tripped from get-post) to edit an existing post so nothing is lost. Provide markdown OR bodyJson, not both.

bodyJson
string

Post content as a Tiptap document, JSON-stringified (e.g. '{"type":"doc","content":[...]}'). This accepts ANY Tiptap node the editor supports — including videos, tweets, link cards, callouts, and buttons — so editing a post by round-tripping the json returned by get-post preserves everything markdown would drop. Replaces the FULL body; node-type validity is checked by the renderer and an unusable document is rejected. Provide markdown OR bodyJson, not both.

title
string

Title of the post

Maximum string length: 200
subtitle
string

Optional subtitle or brief summary

Maximum string length: 300
slug
string

URL-friendly identifier for the post

Required string length: 1 - 256
postPreview
string

Preview text for the post

Maximum string length: 500
categories

Category tags for the post. Can also be a comma-separated string.

authorIds
string[]

User ids credited as the post's authors, in byline order. Replaces the full list, so include every author you want kept — read the post's current authorIds first and start from those. Each id must be the publication's owner or an active team member; ids from outside the publication are rejected. There is no endpoint that enumerates members, so an id has to come from a post you have read (authorIds on a single post, or authors[].id on a list) or from the writer.

Required array length: 1 - 20 elements
status
enum<string>

Set to 'published' to publish a draft or keep an already-live post published after edits, 'draft' to unpublish, or 'archived' to archive

Available options:
draft,
published,
archived
scheduledAt
integer | null

Unix timestamp (milliseconds) to schedule the post's first publish at a future time. Must be in the future and at most 30 days out. Only valid for draft posts that haven't been published or already scheduled. Cannot be combined with status: 'draft' or 'archived'. Pass null to cancel a previously scheduled publish. The value 0 is treated the same as omitting the field (no scheduling request); note that on an already-scheduled post, omitting scheduledAt while changing status cancels the schedule.

Required range: x >= 0
sendNewsletter

Whether to send an email newsletter to subscribers when the post publishes. Only meaningful when publishing (status: 'published') or scheduling (scheduledAt set). Default: false

publishedAt
integer

Unix timestamp (milliseconds) to set as the post's publish date. Once set, the date is preserved across re-publishes.

Required range: x > 0
imageUrl
string<uri>

URL of an image to set as the post's cover/hero image. The image is fetched, re-hosted on Paragraph's CDN, and a placeholder is generated. Pass clearImage: true instead to remove the existing cover.

clearImage
boolean

When true, removes the post's existing cover/hero image. Ignored if imageUrl is also provided.

Response

Post updated successfully

success
enum<boolean>
required

Whether the update succeeded

Available options:
true