Update a draft
update_draftModify any part of an existing Substack draft—title, body, audience, or more—without resending unchanged fields. Works on unpublished drafts.
Instructions
Change any part of an existing draft. Only the fields you pass are touched, so you can update just the title without resending the body. Works on unpublished drafts.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Draft id, from create_draft or list_drafts. | |
| body | No | Post body. Markdown by default. Supported: headings, bold, italic, inline code, strikethrough, links, images, nested lists (any depth, ordered and unordered mixed), fenced code blocks with a language, blockquotes and horizontal rules. Two things worth knowing: - A line containing only a YouTube, X, Spotify or Vimeo URL becomes a real embedded player, not a link. Put the URL inside a sentence if you want a plain link. - Write <paywall> on its own line to mark where the paywall starts. Everything after it is for paying subscribers only. One per post. Markdown tables have no equivalent in Substack's editor, so they are preserved verbatim in a code block rather than being mangled. | |
| type | No | Post type. 'newsletter' is the normal long-form post. | |
| title | No | ||
| audience | No | Who can read it. 'everyone' is public, 'only_free' is any subscriber, 'only_paid' and 'founding' are paying tiers. | |
| subtitle | No | ||
| section_id | No | ||
| body_format | No | How to read `body`. 'auto' detects it and is almost always right. Use 'prosemirror' to send a Substack document directly. | |
| cover_image | No | ||
| publication | No | Which connected publication to act on, matched loosely against its hostname (for example 'example.substack.com' or just 'example'). Defaults to the first connected publication. | |
| social_title | No | ||
| search_engine_title | No | ||
| search_engine_description | No |