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

# Update a post

`PATCH /posts/{id}`

Updates a post. Published posts are immutable and will return 400. The `media` field: Up to 20 public image or video URLs, each max 100MB. Files are downloaded server-side from the provided URLs. Pass an empty array to clear media. Stories support a single, non-GIF media item; submitting multiple media URLs or a GIF for a story returns 400. Set `archived` to `true` to archive a post or `false` to restore it; archiving removes any active schedule. Use `videoThumbnail` to set a custom video thumbnail (cover) from an image URL or from a video frame offset; the post must have a fully transcoded video (the first video is used for mixed media). Set `notify` to `false` to suppress notifications (email/in-app push, Zapier) for the edit activities created by this update; internal activity feed entries are always recorded. `notify` modifies nothing by itself, so it does not count towards the at-least-one-field requirement. It is not an approval request — use POST /posts/{id}/request-approval to notify approvers.

## Path parameters

- `id` string, required

## Request body

- object
  - `text` string
  - `scheduledAt` string, date-time, nullable
  - `labels` string[]
  - `media` string[] — Up to 20 public image or video URLs, each max 100MB. Files are downloaded server-side from the provided URLs.
  - `teamOnly` boolean
  - `approved` boolean
  - `approvedBy` string
  - `linkedinPdfTitle` string — LinkedIn PDF carousel title (`linkedinData.pdfTitle`). When set on a LinkedIn post with multiple images, also enables publishing as a PDF document carousel (`linkedinData.publishCarouselAsPdf`). Pass an empty string on PATCH to disable PDF mode and clear the title.
  - `linkedinVideoTitle` string
  - `pinterest` object
    - `boardId` string
    - `title` string
    - `link` string, uri
    - `description` string
  - `publishAtScheduledDate` boolean
  - `archived` boolean
  - `campaignId` string, nullable
  - `notify` boolean — When false, the edit activities created by this update do not trigger notifications (email/in-app push, Zapier). Modifies nothing by itself, so at least one other field must be provided.
  - `videoThumbnail` object — Sets a custom thumbnail on the post video (the single video, or the first video for mixed media). Requires the video to be fully transcoded.
    - `imageUrl` string, uri — Public URL of a static image that is uploaded and set as the video thumbnail (cover).
    - `offsetSeconds` number — Offset into the video, in seconds; the frame at this position is extracted and set as the thumbnail.

## Response `200`

Updated post detail

- object
  - `data` object, required
    - `id` string, required
    - `workspaceId` string, required
    - `pageId` string, required
    - `type` string, required
    - `classification` string, required
    - `plainText` string, required
    - `createdAt` string, date-time, required
    - `gridPosition` number
    - `campaignId` string, nullable, required
    - `media` string[], required — Up to 20 public image or video URLs, each max 100MB. Files are downloaded server-side from the provided URLs.
    - `scheduledAt` string, date-time, nullable, required
    - `status` string, required
    - `approved` boolean, required
    - `approvedBy` object[]
      - `userId` string, required
      - `approvedAt` string, date-time, required
      - `levelId` string
    - `approval` object, required
      - `status` 'NOT_APPLICABLE' | 'NEVER_SENT' | 'PENDING' | 'PARTIALLY_APPROVED' | 'FULLY_APPROVED', required
      - `approved` boolean, required
      - `type` 'NONE' | 'OPTIONAL' | 'REQUIRED' | 'MULTIPLE', required
      - `completedLevels` integer, required
      - `totalLevels` integer, required
      - `currentLevelId` string
      - `levels` object[], required
        - `id` string, required
        - `label` string, required
        - `approved` boolean, required
        - `approvedBy` object[], required
          - `userId` string, required
          - `approvedAt` string, date-time, required
          - `levelId` string
    - `published` boolean, required
    - `scheduledSet` boolean, required
    - `teamOnly` boolean, required
    - `archived` boolean, required
    - `modifiedAt` string, date-time
    - `mediaType` string
    - `videoThumbnailUrl` string, uri — Current thumbnail (cover) URL of the post video, when the post has a video with a thumbnail.
    - `labels` object[]
      - `uuid` string, required
      - `text` string, required
      - `color` string, required
    - `commentsCounter` number, required
    - `notesCounter` number, required
    - `publicShareLink` string, uri
    - `publishedPostLink` string, uri
    - `groupId` string
    - `groupPageIds` string[]
    - `groupSync` boolean
    - `pinterest` object
      - `boardId` string, required
      - `boardName` string, required
      - `title` string, nullable, required
      - `link` string, nullable, required
      - `description` string, nullable, required

## Other responses

- `400` — Validation error or post is already published
- `401` — Unauthorized
- `403` — Forbidden
- `404` — Post not found
- `429` — Rate limit exceeded
- `500` — Internal server error

---

[API](https://skmtc.net/planable/apis/planable-public-api.md) · [All operations](https://skmtc.net/planable/apis/planable-public-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/planable/planable-public-api/revisions/e91a4f756dfe/schema)
