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

# Edit post

`PATCH /posts/{id}`

## Request

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

Updates a scheduled post. Only posts with status `SCHEDULED` or `RESCHEDULED` can be edited.

Send only the fields you want to change: all fields are optional. If `scheduledAt` is updated, the post is automatically rescheduled with its publish queue job updated.

Platform-specific parameters (`youtubeParams`, `tiktokParams`, `pinterestParams`, `googleBusinessParams`, `xCommunityId`, `xTaggedUsers`) must match the post's platform. Sending `pinterestParams` on a YouTube post will return a validation error.

## Path parameters

- `id` string, uuid, required

## Request body

- EditPostRequest: Partial update: only include the fields you want to change. Platform-specific parameters must match the post's platform or the request will be rejected.
  - `caption` string: New post caption
  - `scheduledAt` string, date-time: New scheduled time (UTC, must be in the future)
  - `youtubeParams` YouTubeParams: YouTube-specific parameters. Only applicable to YouTube posts.
    - `title` string, required: Video title (required)
    - `selfDeclaredMadeForKids` boolean: Whether the video is made for kids (COPPA compliance)
    - `categoryId` '1' | '2' | '10' | '15' | '17' | '18' | '19' | '20' | '21' | '22' | '23' | '24' | '25' | '26' | '27' | '28' | '29' | '30' | '31' | '32' | '33' | '34' | '35' | '36' | '37' | '38' | '39' | '40' | '41' | '42' | '43' | '44': YouTube video category ID. Defaults to "22" (People & Blogs). Common categories: "1" Film & Animation, "2" Autos & Vehicles, "10" Music, "15" Pets & Animals, "17" Sports, "19" Travel & Events, "20" Gaming, "22" People & Blogs, "23" Comedy, "24" Entertainment, "25" News & Politics, "26" Howto & Style, "27" Education, "28" Science & Technology.
    - `tags` string: Comma-separated tags (e.g. "tech,tutorial,howto")
  - `tiktokParams` TikTokParams: TikTok-specific parameters. Only applicable to TikTok posts.
    - `privacyLevel` 'SELF_ONLY' | 'MUTUAL_FOLLOW_FRIENDS' | 'FOLLOWER_OF_CREATOR' | 'PUBLIC_TO_EVERYONE': Who can view the post. Defaults to `PUBLIC_TO_EVERYONE`.
    - `disableDuet` boolean: Prevent others from creating duets with this video
    - `disableComment` boolean: Disable comments on the post
    - `disableStitch` boolean: Prevent others from stitching this video
    - `isDraftType` boolean: Save as draft in TikTok inbox instead of publishing directly
    - `isCommercialContent` boolean: Disclose the post as commercial content
    - `isYourBrand` boolean: The post promotes your own brand or business
    - `isBrandedContent` boolean: The post is a paid partnership or sponsored content. Cannot be `true` when `privacyLevel` is `SELF_ONLY`.
    - `autoAddMusic` boolean: Automatically add music to photo posts
    - `photosPostTitle` string: Title for photo/carousel posts only (max 90 characters)
  - `pinterestParams` PinterestParams: Pinterest-specific parameters. Only applicable to Pinterest posts.
    - `title` string: Pin title
    - `boardId` string, required: Target board ID (required). Use `GET /social-accounts/{id}/pinterest-boards` to list available boards and their IDs.
    - `boardName` string: Board name: stored for reference, auto-filled from the selected board
    - `link` string: Destination URL when the pin is clicked. Must be a valid URL (contain a dot, no spaces).
    - `altText` string: Alt text for accessibility (max 500 characters)
  - `googleBusinessParams` GoogleBusinessParams: Google Business Profile post parameters. Only applicable to Google Business posts. Three post types are supported: - **STANDARD**: General update or announcement (default) - **EVENT**: Promote an event with dates. Requires `eventTitle`, `startDate`, and `endDate`. - **OFFER**: Share a deal or promotion. Requires `eventTitle`, `startDate`, and `endDate`. Automatically includes a "View offer" button: do not set `actionType`.
    - `topicType` 'STANDARD' | 'EVENT' | 'OFFER': Post type
    - `actionType` 'BOOK' | 'ORDER' | 'SHOP' | 'LEARN_MORE' | 'SIGN_UP' | 'CALL', nullable: CTA button type. Not supported for OFFER posts (they get an automatic "View offer" button). CALL uses the business profile phone number and does not require `actionUrl`.
    - `actionUrl` string, nullable: CTA button URL. Required when `actionType` is set (except CALL).
    - `eventTitle` string, nullable: Event or offer title (max 58 characters). Required for EVENT and OFFER posts.
    - `startDate` string, date-time, nullable: Event/offer start date (ISO 8601). Required for EVENT and OFFER posts. Must be before `endDate`.
    - `endDate` string, date-time, nullable: Event/offer end date (ISO 8601). Required for EVENT and OFFER posts. Must be after `startDate`.
    - `couponCode` string, nullable: Coupon code for OFFER posts (max 58 characters)
    - `redeemOnlineUrl` string, nullable: Redemption URL for OFFER posts
    - `termsConditions` string, nullable: Terms and conditions for OFFER posts
  - `xCommunityId` string, nullable: X community ID (X posts only)
  - `xTaggedUsers` string, nullable: Tagged users for media posts (X posts only)
  - `shortenLinks` boolean: Shorten links in the caption, thread posts and first comment with the workspace's connected Bitly account when the post is published. Ignored if the workspace has no Bitly connected (the original links are posted). See "Link shortening" under Create post.
  - `utmCampaign` string, nullable: Value for `utm_campaign` added to links when `shortenLinks` is true. `utm_source` (the platform) and `utm_medium=social` are added automatically.

## Response `200`

Post updated

- object
  - `ok` boolean
  - `data` Post
    - `id` string, uuid
    - `workspaceId` string, uuid
    - `caption` string, nullable
    - `status` 'SCHEDULED' | 'PUBLISHED' | 'CANCELLED' | 'RESCHEDULED'
    - `platform` 'FACEBOOK' | 'INSTAGRAM' | 'X' | 'LINKEDIN' | 'TIKTOK' | 'YOUTUBE' | 'THREADS' | 'BLUESKY' | 'PINTEREST' | 'GOOGLE_BUSINESS'
    - `socialPlatformPostId` string, nullable: The native post ID on the social platform
    - `isStory` boolean
    - `shortenLinks` boolean: Whether links are shortened with the workspace's Bitly account at publish time
    - `utmCampaign` string, nullable: The `utm_campaign` added to shortened links, if any
    - `scheduledAt` string, date-time, nullable
    - `publishedAt` string, date-time, nullable
    - `createdAt` string, date-time
    - `updatedAt` string, date-time
    - `socialAccount` SocialAccountSummary
      - `id` string, uuid
      - `platform` 'FACEBOOK' | 'INSTAGRAM' | 'X' | 'LINKEDIN' | 'TIKTOK' | 'YOUTUBE' | 'THREADS' | 'BLUESKY' | 'PINTEREST' | 'GOOGLE_BUSINESS'
      - `accountName` string
      - `accountUrl` string, nullable
      - `profilePictureUrl` string, nullable
      - `customLabel` string, nullable: User-set label to distinguish accounts (e.g. "Downtown")
    - `medias` PostMedia[]
      - `id` string, uuid
      - `name` string
      - `url` string
      - `type` string: Media type (e.g. IMAGE_JPEG, VIDEO_MP4)
      - `size` number: File size in bytes
      - `width` integer, nullable
      - `height` integer, nullable
      - `duration` number, nullable: Video duration in seconds
      - `coverImageUrl` string, nullable
    - `logs` PostLog[]
      - `type` 'SUCCESS' | 'ERROR' | 'WARNING' | 'INFO'
      - `message` string, nullable
      - `createdAt` string, date-time
    - `platformParams` object, nullable: Platform-specific parameters (YouTube, TikTok, Pinterest, or Google Business fields)
    - `label` PostLabel, nullable: A user-defined content label attached to a post (used for organizing content pillars)
      - `name` string
      - `color` string: Hex color code
    - `metrics` PostMetrics, nullable: A post's most recent daily analytics snapshot. Snapshots are collected once per day per post, so `measuredAt` shows how fresh these figures are.
      - `views` integer, nullable
      - `likes` integer, nullable
      - `comments` integer, nullable
      - `shares` integer, nullable
      - `engagementRate` number, float, nullable: Engagement as a share of views, where the platform reports it
      - `platformMetrics` object, nullable: Platform-specific extras, present only where the platform reports them. For example X returns bookmarks and quotes, Instagram returns reach and saves.
      - `measuredAt` string, date: The date this snapshot was taken

## Other responses

- `400`: Validation error (post not editable, scheduledAt in the past, wrong platform params)
- `404`: Post not found

---

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