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

# Update post

`PATCH /api/posts/{id}`

## Request

- Base URL: `https://api.postproxy.dev`
- URL: `https://api.postproxy.dev/api/posts/{id}`
- Auth: HTTP bearer

Updates an existing post; omitted fields are left unchanged. Draft posts and scheduled posts (more than 5 minutes before their publish time) can be fully updated. On a published post only text can change — post[body], platforms.youtube.title, platforms.pinterest.title and platforms.pinterest.destination_link (anything else returns 422). The new text is pushed asynchronously to every platform post that supports editing (Facebook feed posts, LinkedIn, YouTube, Pinterest, Telegram, Google Business except photo posts, and X within 30 minutes of publishing — X assigns a new platform_id); each outcome fires platform_post.edited or platform_post.edit_failed. Instagram, Threads, TikTok and Bluesky posts keep their original text.

## Path parameters

- `id` string, required

## Query parameters

- `profile_group_id` string

## Headers

- `Idempotency-Key` string

## Request body

- PostUpdateRequest: Request body for updating a post. All parameters are optional — only send the fields you want to change. profiles, media, and thread are full replaces; post fields and platforms are merged.
  - `post` object: Merged with existing values — only the fields you include are changed
    - `body` string: Updated text content
    - `scheduled_at` string, date-time: Updated ISO 8601 schedule timestamp
    - `draft` boolean: Set or unset draft status
  - `profiles` string[]: Full replace: all existing profile assignments are removed and replaced with the new set (array of profile IDs or platform names)
  - `platforms` object: Merged with existing platform params. When sent together with profiles, platform params are applied to the new profile set (same as create)
  - `media` string[]: Full replace: all existing media attachments are destroyed and replaced. Send an empty array to remove all media
  - `thread` PostThreadItemRequest[]: Full replace: all existing thread children are destroyed and rebuilt from the new array. Send an empty array to remove all thread children. Thread children automatically inherit the parent's profiles, scheduling, and draft status
    - `body` string, required: Text content for this thread post
    - `media` string[]: Array of media URLs (same format as top-level media)
  - `queue_id` string: Assign the post to a queue
  - `queue_priority` 'high' | 'medium' | 'low': Queue priority
  - `profile_group_id` string: Scope the lookup to a specific profile group

## Response `200`

The updated post

- Post: A social media post with per-platform posting results.
  - `id` string: Unique post identifier (id)
  - `body` string: Post body/text content
  - `status` 'draft' | 'processing' | 'processed' | 'scheduled' | 'media_processing_failed': Post-level status
  - `source` 'postproxy' | 'imported': Origin of the post: postproxy (created via app or API) or imported (imported from a connected platform)
  - `draft` boolean: Whether the post is a draft
  - `scheduled_at` string, date-time, nullable: ISO 8601 timestamp if scheduled, null otherwise
  - `created_at` string, date-time: ISO 8601 timestamp of creation
  - `queue_id` string, nullable: Queue ID if the post belongs to a queue
  - `queue_priority` 'high' | 'medium' | 'low' | 'null', nullable: Priority level if in a queue
  - `media` PostMedia[]: Array of media attachment objects
    - `id` string: Unique attachment identifier (id)
    - `status` 'pending' | 'processed' | 'failed': Processing status
    - `error_message` string, nullable: Error details if processing failed
    - `content_type` string: MIME type (e.g. image/jpeg, video/mp4)
    - `source_url` string, nullable: Original source URL if media was provided as a URL
    - `url` string, nullable: Hosted URL of the processed file (null if not yet processed)
    - `platforms` PostMediaPlatformError[]: Per-platform formatting/upload errors for this attachment. Only included when at least one platform had an error processing this specific media file; omitted when there are no platform-level errors
      - `platform` string: Network identifier (instagram, twitter, etc.)
      - `status` string: Per-platform attachment status
      - `error` string: Error summary for this attachment on this platform
      - `error_details` PostErrorDetails: Structured platform error details.
        - `platform_error_code` string, nullable: Error code returned by the platform API
        - `platform_error_subcode` string, nullable: Error subcode returned by the platform API
        - `platform_error_message` string, nullable: Error message returned by the platform API
        - `postproxy_note` string, nullable: Additional context from Postproxy about the error
  - `platforms` PostPlatform[]: Array of platform-specific posting results. For thread posts, this only describes the parent — each thread item carries its own platforms array.
    - `platform` 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'youtube' | 'twitter' | 'threads' | 'pinterest': Platform identifier
    - `profile_id` string: ID of the connected profile this platform entry was posted to
    - `profile_name` string: Display name of the connected profile
    - `status` string: Platform posting status: processing, published, failed, pending_deletion, deleted
    - `params` object, nullable: Platform-specific parameters used for this post
    - `error` string, nullable: Error summary (null on success)
    - `error_details` PostErrorDetails: Structured platform error details.
      - `platform_error_code` string, nullable: Error code returned by the platform API
      - `platform_error_subcode` string, nullable: Error subcode returned by the platform API
      - `platform_error_message` string, nullable: Error message returned by the platform API
      - `postproxy_note` string, nullable: Additional context from Postproxy about the error
    - `attempted_at` string, date-time, nullable: ISO 8601 timestamp of posting attempt
    - `permalink` string, nullable: Direct URL to the published post on the platform. Null if not published or permalink is unavailable
    - `insights` object: Engagement metrics (when available)
      - `impressions` integer: Number of impressions/views
      - `on` string, date-time: ISO 8601 timestamp when insights were captured
    - `attachments` PostPlatformAttachment[]: Platform-level files such as the video cover. Only returned by GET /posts/{id}, and omitted when there are none. For imported posts the cover comes from the platform (Instagram Reels, TikTok and LinkedIn videos). Imported TikTok posts have an empty media array, so use the cover as the thumbnail.
      - `id` string: Unique attachment identifier
      - `type` 'cover': Attachment type
      - `status` 'pending' | 'processed' | 'failed': Processing status
      - `content_type` string, nullable: MIME type of the file (e.g. image/jpeg)
      - `url` string, nullable: Hosted URL of the processed file (null until processed)
  - `thread` PostThreadChild[]: Array of thread child posts (only present for thread posts). Each item carries its own platforms array.
    - `id` string: Unique identifier (id) of the child post
    - `body` string: Text content of the child post
    - `media` PostMedia[]: Array of media attachment objects
      - `id` string: Unique attachment identifier (id)
      - `status` 'pending' | 'processed' | 'failed': Processing status
      - `error_message` string, nullable: Error details if processing failed
      - `content_type` string: MIME type (e.g. image/jpeg, video/mp4)
      - `source_url` string, nullable: Original source URL if media was provided as a URL
      - `url` string, nullable: Hosted URL of the processed file (null if not yet processed)
      - `platforms` PostMediaPlatformError[]: Per-platform formatting/upload errors for this attachment. Only included when at least one platform had an error processing this specific media file; omitted when there are no platform-level errors
        - `platform` string: Network identifier (instagram, twitter, etc.)
        - `status` string: Per-platform attachment status
        - `error` string: Error summary for this attachment on this platform
        - `error_details` PostErrorDetails: Structured platform error details.
          - `platform_error_code` string, nullable: Error code returned by the platform API
          - `platform_error_subcode` string, nullable: Error subcode returned by the platform API
          - `platform_error_message` string, nullable: Error message returned by the platform API
          - `postproxy_note` string, nullable: Additional context from Postproxy about the error
    - `platforms` PostPlatform[]: Per-platform delivery results for this thread item (status, permalink, error, error_details)
      - `platform` 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'youtube' | 'twitter' | 'threads' | 'pinterest': Platform identifier
      - `profile_id` string: ID of the connected profile this platform entry was posted to
      - `profile_name` string: Display name of the connected profile
      - `status` string: Platform posting status: processing, published, failed, pending_deletion, deleted
      - `params` object, nullable: Platform-specific parameters used for this post
      - `error` string, nullable: Error summary (null on success)
      - `error_details` PostErrorDetails: Structured platform error details.
        - `platform_error_code` string, nullable: Error code returned by the platform API
        - `platform_error_subcode` string, nullable: Error subcode returned by the platform API
        - `platform_error_message` string, nullable: Error message returned by the platform API
        - `postproxy_note` string, nullable: Additional context from Postproxy about the error
      - `attempted_at` string, date-time, nullable: ISO 8601 timestamp of posting attempt
      - `permalink` string, nullable: Direct URL to the published post on the platform. Null if not published or permalink is unavailable
      - `insights` object: Engagement metrics (when available)
        - `impressions` integer: Number of impressions/views
        - `on` string, date-time: ISO 8601 timestamp when insights were captured
      - `attachments` PostPlatformAttachment[]: Platform-level files such as the video cover. Only returned by GET /posts/{id}, and omitted when there are none. For imported posts the cover comes from the platform (Instagram Reels, TikTok and LinkedIn videos). Imported TikTok posts have an empty media array, so use the cover as the thumbnail.
        - `id` string: Unique attachment identifier
        - `type` 'cover': Attachment type
        - `status` 'pending' | 'processed' | 'failed': Processing status
        - `content_type` string, nullable: MIME type of the file (e.g. image/jpeg)
        - `url` string, nullable: Hosted URL of the processed file (null until processed)

## Other responses

- `401`: Invalid, missing, or insufficient API key permissions.
- `404`: Resource does not exist or is not accessible.
- `422`: Validation failed.

---

[API](https://skmtc.dev/postproxy/apis/postproxy-social-media-api.md) - [All operations](https://skmtc.dev/postproxy/apis/postproxy-social-media-api/llms.txt) - [OpenAPI document](https://skmtc.dev/postproxy/apis/postproxy-social-media-api/revisions/d54482ac4ce7?raw)
