---
title: "Edit, schedule or move back to drafts"
method: PATCH
path: "/v1/posts/{id}"
---

# Edit, schedule or move back to drafts

`PATCH /v1/posts/{id}`

## Request

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

Edits a draft, scheduled or failed post. Only the fields you send change. Sending scheduledAt, useNextSlot or publishNow schedules the post: a draft goes out at that time, a failed post is retried. draft: true moves a scheduled post back to drafts so it won't publish. Published posts can't be edited.

## Path parameters

- `id` string, required

## Request body

- object
  - `content` string
  - `accountIds` string[]: Replaces the target accounts
  - `media` string[]: Replaces the media
  - `scheduledAt` string: ISO datetime in the workspace timezone, e.g. 2026-09-20T11:00:00
  - `publishNow` boolean
  - `useNextSlot` boolean
  - `draft` boolean: true moves the post back to drafts
  - `workspace` string: Workspace slug (optional)
  - `pinterestBoardId` string
  - `pinterestLink` string, uri
  - `redditSubreddit` string
  - `redditFlairText` string
  - `articleSettings` ArticleSettings: Options for the blog networks (Dev.to, Hashnode, Ghost, Tumblr). On Dev.to, Hashnode and Ghost the first line of content is the title and the rest the body, in Markdown; the first photo is the cover
    - `tags` string[]: Dev.to keeps the first 4 (letters and digits), Hashnode 15, Ghost and Tumblr up to 30
    - `canonicalUrl` string, uri: Where the article was first published, when this is a copy (Dev.to, Hashnode, Ghost)
    - `asDraft` boolean: Create it as an unpublished draft on the blog instead of publishing it
    - `newsletter` string: Ghost: also email the post with this newsletter (its slug, or "default" for the site's first active one)
    - `emailSegment` 'all' | 'status:free' | 'status:-free': Ghost newsletter: who gets the email (default all members)
    - `aiDisclosure` 'no_ai' | 'some_ai' | 'fully_autonomous': Dev.to: how much AI wrote the article (Dev.to asks API clients to say so accurately)
  - `googleBusinessSettings` GoogleBusinessSettings: Google Business Profile only: the button under the update. The update itself is the content (up to 1,500 characters) and one photo; videos aren't accepted
    - `button` 'BOOK' | 'ORDER' | 'SHOP' | 'LEARN_MORE' | 'SIGN_UP' | 'CALL': BOOK, ORDER (order online), SHOP (buy), LEARN_MORE, SIGN_UP, or CALL (calls the profile's phone number). Omit for no button
    - `buttonUrl` string, uri: Where the button leads (http/https), required for every button except CALL

## Response `200`

Updated

- object
  - `post` CreatedPost, required
    - `id` string, required
    - `status` 'draft' | 'scheduled' | 'publishing', required: publishing when publishNow was set, draft when draft was set
    - `scheduledAt` string, date-time, required: Publish time, in UTC
    - `accounts` string[], required: Target accounts as "platform (display name)", e.g. "instagram (Acme)"

## Other responses

- `400`: Post already published, empty content or accountIds, draft combined with publishNow, missing media or pinterestBoardId once scheduled, invalid scheduledAt
- `401`: Missing, invalid or expired API key
- `402`: No active Breakreach subscription or trial
- `403`: Not a member of the requested workspace
- `404`: Post or workspace not found, or useNextSlot found no free slot

---

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