Skip to main content
Glama

Create post

create_post

Create a new social media post. Can be saved as a draft or scheduled for a specific time. Supports platform-specific content overrides, media attachments, labels, and thread format. IMPORTANT: YouTube and TikTok REQUIRE video — do not include them when posting images only. Instagram defaults to feed_photo — set postTypeOverrides for video content (reel, feed_video). Use this when the user wants to draft or schedule one new post. It never publishes immediately; publish_post does that.

Input Schema

NameRequiredDescriptionDefault
labelsNoArray of label IDs to tag the post with.
statusNoPost status. "draft" (default) or "scheduled".
contentNoThe post text content. Optional — defaults to empty for media-only posts. LinkedIn mentions: write @[Display Name](urn:li:organization:ID) for a Page or @[Display Name](urn:li:person:ID) for a person; The token publishes as a real mention on LinkedIn and as plain @Display Name on other channels.
channelsYesArray of channels to post to. Get channel IDs from list_channels.
timezoneNoTimezone for scheduling (e.g. "America/New_York"). Defaults to UTC.
postFormatNoPost format. "post" (default), "video", "reel", "story", "carousel", or "thread" for multi-part threads.
scheduledAtNoISO 8601 datetime for scheduling (e.g. 2025-01-15T10:00:00Z). Required when status is scheduled.
threadPartsNoThread parts array. Required when postFormat is thread (min 2 parts). EVERY part is measured against the character limit of every platform the post targets, not only the first — an over-long part is rejected with 400 VALIDATION_ERROR naming the part number, the platform and its limit. URLs count as 23 characters on X and Mastodon, their real length elsewhere.
mediaFileIdsNoArray of media file IDs to attach. Upload media first with upload_media.
platformContentNoPer-platform content overrides, e.g. { "x": "Short tweet", "linkedin": "Longer LinkedIn post" }.
requestApprovalNoOptional (default false). Set true to hold a scheduled post for team approval (approvalStatus becomes 'pending'). Forced on server-side for API keys of roles without post:publish (contributors), regardless of this flag.
platformSpecificNoPlatform-specific settings, e.g. { "youtube": { "title": "…", "privacyStatus": "public" } }. Discord, Telegram, Tumblr and Snapchat nest their options under the BulkPublish channel id, e.g. { "discord": { "12": { "channelId": "1090123456789012345" } } }. Full per-platform option lists (polls, quotes, tags, drafts, settings) are on each platform key; bad values are refused with 400 VALIDATION_ERROR.
postTypeOverridesNoPer-platform post type override. E.g. { "instagram": "reel", "youtube": "short" }. Video length is checked per type when the post is scheduled or published, and a video outside the range is refused: instagram reel/feed_video 3s–15min, story 3–60s; facebook reel 3–90s, story 3–60s; threads video/carousel up to 5min; linkedin 3s–30min; pinterest video_pin at least 4s; snapchat story 5–60s, spotlight 6–60s (saved_story not checked).
publishWhenApprovedNoOptional (default false). Set true on a post that waits for approval when it should go out as soon as it is approved, even if that is after its scheduled time. This is how someone who needs approval says 'publish now': status 'scheduled', scheduledAt = now, requestApproval true (or a contributor key), publishWhenApproved true. An approval arriving more than 15 minutes late then publishes immediately; with false it is approved but returned to draft for a new time. Stored only when the post ends up approvalStatus 'pending'; otherwise saved as false.
linkTrackingOverrideNoOptional per-post override for link tracking (bulkpubli.sh). true forces links in this post to be shortened and their clicks counted, false forces them to publish as written, and null/omitted (the default) inherits the organization's Link Tracking setting. Shortening happens at publish time, per channel, so two accounts on the same platform get distinct codes; it is skipped for a channel when the rewrite would push the post past that platform's character limit (a short URL is 28 characters and can be longer than the link it replaces). Short links are part of the Pro and Business plans: on Free, links always publish as written and true has no effect.

Output Schema

NameRequiredDescriptionDefault
idNo
authorNoWho wrote the post: { id, name, image }. Null when that account is gone.
labelsNo
statusNodraft, scheduled, processing, published, partial or failed.
contentNo
approverNoWho approved it: { id, name, image }. Null unless approvalStatus is approved.
assigneeNoWho is expected to act on it next: { id, name, image }. Null when nobody is.
timezoneNo
createdAtNo
mediaFilesNo
publishedAtNo
scheduledAtNo
postPlatformsNo
approvalStatusNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • changedInput schema / properties / content / description
      Previous value: -"The post text content. Optional — defaults to empty for media-only posts. LinkedIn mentions: write @[Display Name](urn:li:organization:ID) for a Page or @[Display Name](urn:li:person:ID) for a person; search_mentions on a LinkedIn channel returns ready-made Page tokens. The token publishes as a real mention on LinkedIn and as plain @Display Name on other channels."New value: +"The post text content. Optional — defaults to empty for media-only posts. LinkedIn mentions: write @[Display Name](urn:li:organization:ID) for a Page or @[Display Name](urn:li:person:ID) for a person; The token publishes as a real mention on LinkedIn and as plain @Display Name on other channels."
    • changedInput schema / properties / platformSpecific / properties / discord / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": {
      -      "additionalProperties": {},
      -      "properties": {
      -        "buttons": {
      -          "description": "Link buttons, up to 5.",
      -          "items": {
      -            "properties": {
      -              "label": {
      -                "description": "Up to 80 characters.",
      -                "type": "string"
      -              },
      -              "url": {
      -                "description": "http(s) link.",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "label",
      -              "url"
      -            ],
      -            "type": "object"
      -          },
      -          "type": "array"
      -        },
      -        "channelId": {
      -          "description": "Required. Target Discord text channel id (a snowflake) inside the connected server. NOT the BulkPublish channel id used as the outer key. List postable channels via get_channel_options.",
      -          "type": "string"
      -        },
      -        "embed": {
      -          "description": "Send the text as a rich embed with the first image inside.",
      -          "properties": {
      -            "color": {
      -              "enum": [
      -                "orange",
      -                "blue",
      -                "green",
      -                "red",
      -                "purple",
      -                "gray"
      -              ],
      -              "type": "string"
      -            },
      -            "title": {
      -              "description": "Up to 256 characters.",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "pin": {
      -          "description": "Pin the message. If Discord refuses, the post stays published and a warning is recorded. The bot needs the Pin Messages permission.",
      -          "type": "boolean"
      -        },
      -        "poll": {
      -          "description": "A native poll. The bot needs the Send Polls permission.",
      -          "properties": {
      -            "answers": {
      -              "description": "2 to 10 answers, each up to 55 characters.",
      -              "items": {
      -                "type": "string"
      -              },
      -              "type": "array"
      -            },
      -            "durationHours": {
      -              "description": "Whole hours 1 to 768 (default 24).",
      -              "type": "number"
      -            },
      -            "multiselect": {
      -              "type": "boolean"
      -            },
      -            "question": {
      -              "description": "Up to 300 characters.",
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "question",
      -            "answers"
      -          ],
      -          "type": "object"
      -        },
      -        "silent": {
      -          "description": "Suppress notifications for the message.",
      -          "type": "boolean"
      -        },
      -        "startThread": {
      -          "description": "Start a thread from the message (no effect on a forum channel).",
      -          "type": "boolean"
      -        },
      -        "tags": {
      -          "description": "Up to 5 forum tag IDs (digits) for a forum channel; IDs come from get_channel_options.",
      -          "items": {
      -            "type": "string"
      -          },
      -          "type": "array"
      -        },
      -        "threadName": {
      -          "description": "Name for that thread, up to 100 characters.",
      -          "type": "string"
      -        }
      -      },
      -      "type": "object"
      -    },
      -    "propertyNames": {
      -      "type": "string"
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": {},
      -    "properties": {
      -      "buttons": {
      -        "description": "Link buttons, up to 5.",
      -        "items": {
      -          "properties": {
      -            "label": {
      -              "description": "Up to 80 characters.",
      -              "type": "string"
      -            },
      -            "url": {
      -              "description": "http(s) link.",
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "label",
      -            "url"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "channelId": {
      -        "description": "Required. Target Discord text channel id (a snowflake) inside the connected server. NOT the BulkPublish channel id used as the outer key. List postable channels via get_channel_options.",
      -        "type": "string"
      -      },
      -      "embed": {
      -        "description": "Send the text as a rich embed with the first image inside.",
      -        "properties": {
      -          "color": {
      -            "enum": [
      -              "orange",
      -              "blue",
      -              "green",
      -              "red",
      -              "purple",
      -              "gray"
      -            ],
      -            "type": "string"
      -          },
      -          "title": {
      -            "description": "Up to 256 characters.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "pin": {
      -        "description": "Pin the message. If Discord refuses, the post stays published and a warning is recorded. The bot needs the Pin Messages permission.",
      -        "type": "boolean"
      -      },
      -      "poll": {
      -        "description": "A native poll. The bot needs the Send Polls permission.",
      -        "properties": {
      -          "answers": {
      -            "description": "2 to 10 answers, each up to 55 characters.",
      -            "items": {
      -              "type": "string"
      -            },
      -            "type": "array"
      -          },
      -          "durationHours": {
      -            "description": "Whole hours 1 to 768 (default 24).",
      -            "type": "number"
      -          },
      -          "multiselect": {
      -            "type": "boolean"
      -          },
      -          "question": {
      -            "description": "Up to 300 characters.",
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "question",
      -          "answers"
      -        ],
      -        "type": "object"
      -      },
      -      "silent": {
      -        "description": "Suppress notifications for the message.",
      -        "type": "boolean"
      -      },
      -      "startThread": {
      -        "description": "Start a thread from the message (no effect on a forum channel).",
      -        "type": "boolean"
      -      },
      -      "tags": {
      -        "description": "Up to 5 forum tag IDs (digits) for a forum channel; IDs come from get_channel_options.",
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "threadName": {
      -        "description": "Name for that thread, up to 100 characters.",
      -        "type": "string"
      -      }
      -    },
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "buttons": {
      +          "description": "Link buttons, up to 5.",
      +          "items": {
      +            "properties": {
      +              "label": {
      +                "description": "Up to 80 characters.",
      +                "type": "string"
      +              },
      +              "url": {
      +                "description": "http(s) link.",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "label",
      +              "url"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "channelId": {
      +          "description": "Required. Target Discord text channel id (a snowflake) inside the connected server. NOT the BulkPublish channel id used as the outer key.",
      +          "type": "string"
      +        },
      +        "embed": {
      +          "description": "Send the text as a rich embed with the first image inside.",
      +          "properties": {
      +            "color": {
      +              "enum": [
      +                "orange",
      +                "blue",
      +                "green",
      +                "red",
      +                "purple",
      +                "gray"
      +              ],
      +              "type": "string"
      +            },
      +            "title": {
      +              "description": "Up to 256 characters.",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "pin": {
      +          "description": "Pin the message. If Discord refuses, the post stays published and a warning is recorded. The bot needs the Pin Messages permission.",
      +          "type": "boolean"
      +        },
      +        "poll": {
      +          "description": "A native poll. The bot needs the Send Polls permission.",
      +          "properties": {
      +            "answers": {
      +              "description": "2 to 10 answers, each up to 55 characters.",
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            },
      +            "durationHours": {
      +              "description": "Whole hours 1 to 768 (default 24).",
      +              "type": "number"
      +            },
      +            "multiselect": {
      +              "type": "boolean"
      +            },
      +            "question": {
      +              "description": "Up to 300 characters.",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "question",
      +            "answers"
      +          ],
      +          "type": "object"
      +        },
      +        "silent": {
      +          "description": "Suppress notifications for the message.",
      +          "type": "boolean"
      +        },
      +        "startThread": {
      +          "description": "Start a thread from the message (no effect on a forum channel).",
      +          "type": "boolean"
      +        },
      +        "tags": {
      +          "description": "Up to 5 forum tag IDs (digits) for a forum channel.",
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "threadName": {
      +          "description": "Name for that thread, up to 100 characters.",
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "propertyNames": {
      +      "type": "string"
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": {},
      +    "properties": {
      +      "buttons": {
      +        "description": "Link buttons, up to 5.",
      +        "items": {
      +          "properties": {
      +            "label": {
      +              "description": "Up to 80 characters.",
      +              "type": "string"
      +            },
      +            "url": {
      +              "description": "http(s) link.",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "label",
      +            "url"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "channelId": {
      +        "description": "Required. Target Discord text channel id (a snowflake) inside the connected server. NOT the BulkPublish channel id used as the outer key.",
      +        "type": "string"
      +      },
      +      "embed": {
      +        "description": "Send the text as a rich embed with the first image inside.",
      +        "properties": {
      +          "color": {
      +            "enum": [
      +              "orange",
      +              "blue",
      +              "green",
      +              "red",
      +              "purple",
      +              "gray"
      +            ],
      +            "type": "string"
      +          },
      +          "title": {
      +            "description": "Up to 256 characters.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "pin": {
      +        "description": "Pin the message. If Discord refuses, the post stays published and a warning is recorded. The bot needs the Pin Messages permission.",
      +        "type": "boolean"
      +      },
      +      "poll": {
      +        "description": "A native poll. The bot needs the Send Polls permission.",
      +        "properties": {
      +          "answers": {
      +            "description": "2 to 10 answers, each up to 55 characters.",
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "durationHours": {
      +            "description": "Whole hours 1 to 768 (default 24).",
      +            "type": "number"
      +          },
      +          "multiselect": {
      +            "type": "boolean"
      +          },
      +          "question": {
      +            "description": "Up to 300 characters.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "question",
      +          "answers"
      +        ],
      +        "type": "object"
      +      },
      +      "silent": {
      +        "description": "Suppress notifications for the message.",
      +        "type": "boolean"
      +      },
      +      "startThread": {
      +        "description": "Start a thread from the message (no effect on a forum channel).",
      +        "type": "boolean"
      +      },
      +      "tags": {
      +        "description": "Up to 5 forum tag IDs (digits) for a forum channel.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "threadName": {
      +        "description": "Name for that thread, up to 100 characters.",
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  }
      +]
    • changedInput schema / properties / platformSpecific / properties / pinterest / properties / boardSectionId / description
      Previous value: -"Numeric ID of a section of the chosen board (list with get_channel_options and boardId). Send it beside its board, per channel or flat. Pin, video_pin and carousel. A flat value is ignored for a channel with its own boardId, and any section is ignored when no board was chosen."New value: +"Numeric ID of a section of the chosen board. Send it beside its board, per channel or flat. Pin, video_pin and carousel. A flat value is ignored for a channel with its own boardId, and any section is ignored when no board was chosen."
    • changedInput schema / properties / platformSpecific / properties / threads / properties / locationId / description
      Previous value: -"Numeric place ID from get_channel_options with a `q` search on a Threads channel. Only works once the channel has granted location tagging."New value: +"Numeric Threads place ID. Only works once the channel has granted location tagging."
    • changedInput schema / properties / platformSpecific / properties / tumblr / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": {
      -      "additionalProperties": {},
      -      "properties": {
      -        "blogName": {
      -          "description": "Which blog to publish to. Defaults to the blog the channel was connected as (list via get_channel_options).",
      -          "type": "string"
      -        },
      -        "link": {
      -          "description": "Appended as a link block.",
      -          "type": "string"
      -        },
      -        "reblogInteraction": {
      -          "description": "Who can reblog the post.",
      -          "enum": [
      -            "everyone",
      -            "noone"
      -          ],
      -          "type": "string"
      -        },
      -        "reblogUrl": {
      -          "description": "A Tumblr post link (tumblr.com/<blog>/<id> or <blog>.tumblr.com/post/<id>): publishes a reblog of that post with your text as the comment.",
      -          "type": "string"
      -        },
      -        "slug": {
      -          "description": "Up to 200 characters; lowercased and hyphenated into the permalink.",
      -          "type": "string"
      -        },
      -        "sourceUrl": {
      -          "description": "Attribution URL stored as the post's source.",
      -          "type": "string"
      -        },
      -        "state": {
      -          "description": "Default published. A scheduled post with published still goes out at its time; draft and private override that and the post is never made public by BulkPublish.",
      -          "enum": [
      -            "published",
      -            "queue",
      -            "draft",
      -            "private"
      -          ],
      -          "type": "string"
      -        },
      -        "tags": {
      -          "description": "Tumblr tags, without the leading '#'.",
      -          "items": {
      -            "type": "string"
      -          },
      -          "type": "array"
      -        },
      -        "title": {
      -          "description": "Rendered as a heading block above the body.",
      -          "type": "string"
      -        }
      -      },
      -      "type": "object"
      -    },
      -    "propertyNames": {
      -      "type": "string"
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": {},
      -    "properties": {
      -      "blogName": {
      -        "description": "Which blog to publish to. Defaults to the blog the channel was connected as (list via get_channel_options).",
      -        "type": "string"
      -      },
      -      "link": {
      -        "description": "Appended as a link block.",
      -        "type": "string"
      -      },
      -      "reblogInteraction": {
      -        "description": "Who can reblog the post.",
      -        "enum": [
      -          "everyone",
      -          "noone"
      -        ],
      -        "type": "string"
      -      },
      -      "reblogUrl": {
      -        "description": "A Tumblr post link (tumblr.com/<blog>/<id> or <blog>.tumblr.com/post/<id>): publishes a reblog of that post with your text as the comment.",
      -        "type": "string"
      -      },
      -      "slug": {
      -        "description": "Up to 200 characters; lowercased and hyphenated into the permalink.",
      -        "type": "string"
      -      },
      -      "sourceUrl": {
      -        "description": "Attribution URL stored as the post's source.",
      -        "type": "string"
      -      },
      -      "state": {
      -        "description": "Default published. A scheduled post with published still goes out at its time; draft and private override that and the post is never made public by BulkPublish.",
      -        "enum": [
      -          "published",
      -          "queue",
      -          "draft",
      -          "private"
      -        ],
      -        "type": "string"
      -      },
      -      "tags": {
      -        "description": "Tumblr tags, without the leading '#'.",
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "title": {
      -        "description": "Rendered as a heading block above the body.",
      -        "type": "string"
      -      }
      -    },
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "blogName": {
      +          "description": "Which blog to publish to. Defaults to the blog the channel was connected as.",
      +          "type": "string"
      +        },
      +        "link": {
      +          "description": "Appended as a link block.",
      +          "type": "string"
      +        },
      +        "reblogInteraction": {
      +          "description": "Who can reblog the post.",
      +          "enum": [
      +            "everyone",
      +            "noone"
      +          ],
      +          "type": "string"
      +        },
      +        "reblogUrl": {
      +          "description": "A Tumblr post link (tumblr.com/<blog>/<id> or <blog>.tumblr.com/post/<id>): publishes a reblog of that post with your text as the comment.",
      +          "type": "string"
      +        },
      +        "slug": {
      +          "description": "Up to 200 characters; lowercased and hyphenated into the permalink.",
      +          "type": "string"
      +        },
      +        "sourceUrl": {
      +          "description": "Attribution URL stored as the post's source.",
      +          "type": "string"
      +        },
      +        "state": {
      +          "description": "Default published. A scheduled post with published still goes out at its time; draft and private override that and the post is never made public by BulkPublish.",
      +          "enum": [
      +            "published",
      +            "queue",
      +            "draft",
      +            "private"
      +          ],
      +          "type": "string"
      +        },
      +        "tags": {
      +          "description": "Tumblr tags, without the leading '#'.",
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "title": {
      +          "description": "Rendered as a heading block above the body.",
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "propertyNames": {
      +      "type": "string"
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": {},
      +    "properties": {
      +      "blogName": {
      +        "description": "Which blog to publish to. Defaults to the blog the channel was connected as.",
      +        "type": "string"
      +      },
      +      "link": {
      +        "description": "Appended as a link block.",
      +        "type": "string"
      +      },
      +      "reblogInteraction": {
      +        "description": "Who can reblog the post.",
      +        "enum": [
      +          "everyone",
      +          "noone"
      +        ],
      +        "type": "string"
      +      },
      +      "reblogUrl": {
      +        "description": "A Tumblr post link (tumblr.com/<blog>/<id> or <blog>.tumblr.com/post/<id>): publishes a reblog of that post with your text as the comment.",
      +        "type": "string"
      +      },
      +      "slug": {
      +        "description": "Up to 200 characters; lowercased and hyphenated into the permalink.",
      +        "type": "string"
      +      },
      +      "sourceUrl": {
      +        "description": "Attribution URL stored as the post's source.",
      +        "type": "string"
      +      },
      +      "state": {
      +        "description": "Default published. A scheduled post with published still goes out at its time; draft and private override that and the post is never made public by BulkPublish.",
      +        "enum": [
      +          "published",
      +          "queue",
      +          "draft",
      +          "private"
      +        ],
      +        "type": "string"
      +      },
      +      "tags": {
      +        "description": "Tumblr tags, without the leading '#'.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "title": {
      +        "description": "Rendered as a heading block above the body.",
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  }
      +]
  2. Changed1 schema field changed
    • changedInput schema / properties / platformSpecific / properties / tiktok / properties / sendToDrafts / description
      Previous value: -"Send a video or photo_slideshow post to the creator's TikTok drafts instead of publishing it (default false). privacyLevel is then not required, and the direct-post settings (privacyLevel, disableDuet, disableStitch, disableComment, isAigc, brandContentToggle, brandOrganicToggle, autoAddMusic, thumbnailTimestamp) are ignored. A video draft carries no caption; a photo draft sends it. Once delivered the destination becomes published with no platformUrl, and analytics are not collected."New value: +"Send a video or photo_slideshow post to the creator's TikTok drafts instead of publishing it (default false). privacyLevel is then not required, and the direct-post settings (privacyLevel, disableDuet, disableStitch, disableComment, isAigc, brandContentToggle, brandOrganicToggle, autoAddMusic, thumbnailTimestamp) are ignored. A video draft carries no caption; a photo draft sends it. Once delivered the destination becomes published with no platformUrl; if the creator posts it within about a week, platformPostId becomes the video id, platformUrl is filled in and analytics are collected."
  3. Changed53 schema fields changed
    • changedInput schema / properties / channels / items / properties / platform / enum
      Previous value: -[
      -  "facebook",
      -  "instagram",
      -  "x",
      -  "tiktok",
      -  "youtube",
      -  "threads",
      -  "bluesky",
      -  "pinterest",
      -  "gmb",
      -  "linkedin",
      -  "mastodon",
      -  "reddit",
      -  "discord",
      -  "telegram",
      -  "tumblr",
      -  "snapchat"
      -]New value: +[
      +  "facebook",
      +  "instagram",
      +  "x",
      +  "tiktok",
      +  "youtube",
      +  "threads",
      +  "bluesky",
      +  "pinterest",
      +  "gmb",
      +  "linkedin",
      +  "mastodon",
      +  "discord",
      +  "telegram",
      +  "tumblr",
      +  "snapchat"
      +]
    • removedInput schema / properties / platformContent / properties / reddit
      Removed value: -{
      -  "type": "string"
      -}
    • changedInput schema / properties / platformSpecific / description
      Previous value: -"Platform-specific settings, e.g. { \"youtube\": { \"title\": \"…\", \"privacyStatus\": \"public\" } }. Reddit, Discord, Tumblr and Snapchat nest their options under the BulkPublish channel id, e.g. { \"reddit\": { \"12\": { \"subreddit\": \"webdev\" } } }. Telegram takes no options."New value: +"Platform-specific settings, e.g. { \"youtube\": { \"title\": \"…\", \"privacyStatus\": \"public\" } }. Discord, Telegram, Tumblr and Snapchat nest their options under the BulkPublish channel id, e.g. { \"discord\": { \"12\": { \"channelId\": \"1090123456789012345\" } } }. Full per-platform option lists (polls, quotes, tags, drafts, settings) are on each platform key; bad values are refused with 400 VALIDATION_ERROR."
    • addedInput schema / properties / platformSpecific / properties / bluesky / properties / allowQuotes
      Added value: +{
      +  "description": "false stops other accounts quoting the post (default true). Set right after publishing, like replyAllow.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / platformSpecific / properties / bluesky / properties / contentLabel
      Added value: +{
      +  "description": "Adds a content warning. Applies to every part of a thread.",
      +  "enum": [
      +    "sexual",
      +    "nudity",
      +    "porn",
      +    "graphic-media"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / platformSpecific / properties / bluesky / properties / langs
      Added value: +{
      +  "description": "Up to 3 language codes such as 'en' or 'pt-BR'. Applies to every part of a thread.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / platformSpecific / properties / bluesky / properties / quoteId
      Added value: +{
      +  "description": "The post to quote: a bsky.app post link or an at:// URI (a bare ID is read as one of your own posts). Replaces a link card; with media attached both appear together. Publishing fails before anything is posted if the post cannot be found.",
      +  "type": "string"
      +}
    • addedInput schema / properties / platformSpecific / properties / bluesky / properties / replyAllow
      Added value: +{
      +  "description": "Who can reply. Omitted or [] means everyone; otherwise ['nobody'] or any mix of mention, following, follower ('nobody' cannot be combined). Set right after the post publishes; if Bluesky refuses it the post stays published without it. First post of a thread.",
      +  "items": {
      +    "enum": [
      +      "nobody",
      +      "mention",
      +      "following",
      +      "follower"
      +    ],
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • changedInput schema / properties / platformSpecific / properties / discord / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": {
      -      "additionalProperties": {},
      -      "properties": {
      -        "channelId": {
      -          "description": "Required. Target Discord text channel id (a snowflake) inside the connected server. NOT the BulkPublish channel id used as the outer key. List postable channels via get_channel_options.",
      -          "type": "string"
      -        }
      -      },
      -      "type": "object"
      -    },
      -    "propertyNames": {
      -      "type": "string"
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": {},
      -    "properties": {
      -      "channelId": {
      -        "description": "Required. Target Discord text channel id (a snowflake) inside the connected server. NOT the BulkPublish channel id used as the outer key. List postable channels via get_channel_options.",
      -        "type": "string"
      -      }
      -    },
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "buttons": {
      +          "description": "Link buttons, up to 5.",
      +          "items": {
      +            "properties": {
      +              "label": {
      +                "description": "Up to 80 characters.",
      +                "type": "string"
      +              },
      +              "url": {
      +                "description": "http(s) link.",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "label",
      +              "url"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "channelId": {
      +          "description": "Required. Target Discord text channel id (a snowflake) inside the connected server. NOT the BulkPublish channel id used as the outer key. List postable channels via get_channel_options.",
      +          "type": "string"
      +        },
      +        "embed": {
      +          "description": "Send the text as a rich embed with the first image inside.",
      +          "properties": {
      +            "color": {
      +              "enum": [
      +                "orange",
      +                "blue",
      +                "green",
      +                "red",
      +                "purple",
      +                "gray"
      +              ],
      +              "type": "string"
      +            },
      +            "title": {
      +              "description": "Up to 256 characters.",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "pin": {
      +          "description": "Pin the message. If Discord refuses, the post stays published and a warning is recorded. The bot needs the Pin Messages permission.",
      +          "type": "boolean"
      +        },
      +        "poll": {
      +          "description": "A native poll. The bot needs the Send Polls permission.",
      +          "properties": {
      +            "answers": {
      +              "description": "2 to 10 answers, each up to 55 characters.",
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            },
      +            "durationHours": {
      +              "description": "Whole hours 1 to 768 (default 24).",
      +              "type": "number"
      +            },
      +            "multiselect": {
      +              "type": "boolean"
      +            },
      +            "question": {
      +              "description": "Up to 300 characters.",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "question",
      +            "answers"
      +          ],
      +          "type": "object"
      +        },
      +        "silent": {
      +          "description": "Suppress notifications for the message.",
      +          "type": "boolean"
      +        },
      +        "startThread": {
      +          "description": "Start a thread from the message (no effect on a forum channel).",
      +          "type": "boolean"
      +        },
      +        "tags": {
      +          "description": "Up to 5 forum tag IDs (digits) for a forum channel; IDs come from get_channel_options.",
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "threadName": {
      +          "description": "Name for that thread, up to 100 characters.",
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "propertyNames": {
      +      "type": "string"
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": {},
      +    "properties": {
      +      "buttons": {
      +        "description": "Link buttons, up to 5.",
      +        "items": {
      +          "properties": {
      +            "label": {
      +              "description": "Up to 80 characters.",
      +              "type": "string"
      +            },
      +            "url": {
      +              "description": "http(s) link.",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "label",
      +            "url"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "channelId": {
      +        "description": "Required. Target Discord text channel id (a snowflake) inside the connected server. NOT the BulkPublish channel id used as the outer key. List postable channels via get_channel_options.",
      +        "type": "string"
      +      },
      +      "embed": {
      +        "description": "Send the text as a rich embed with the first image inside.",
      +        "properties": {
      +          "color": {
      +            "enum": [
      +              "orange",
      +              "blue",
      +              "green",
      +              "red",
      +              "purple",
      +              "gray"
      +            ],
      +            "type": "string"
      +          },
      +          "title": {
      +            "description": "Up to 256 characters.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "pin": {
      +        "description": "Pin the message. If Discord refuses, the post stays published and a warning is recorded. The bot needs the Pin Messages permission.",
      +        "type": "boolean"
      +      },
      +      "poll": {
      +        "description": "A native poll. The bot needs the Send Polls permission.",
      +        "properties": {
      +          "answers": {
      +            "description": "2 to 10 answers, each up to 55 characters.",
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "durationHours": {
      +            "description": "Whole hours 1 to 768 (default 24).",
      +            "type": "number"
      +          },
      +          "multiselect": {
      +            "type": "boolean"
      +          },
      +          "question": {
      +            "description": "Up to 300 characters.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "question",
      +          "answers"
      +        ],
      +        "type": "object"
      +      },
      +      "silent": {
      +        "description": "Suppress notifications for the message.",
      +        "type": "boolean"
      +      },
      +      "startThread": {
      +        "description": "Start a thread from the message (no effect on a forum channel).",
      +        "type": "boolean"
      +      },
      +      "tags": {
      +        "description": "Up to 5 forum tag IDs (digits) for a forum channel; IDs come from get_channel_options.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "threadName": {
      +        "description": "Name for that thread, up to 100 characters.",
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  }
      +]
    • addedInput schema / properties / platformSpecific / properties / facebook / properties / textFormatPresetId
      Added value: +{
      +  "description": "Digits only (a Facebook background ID). Shows a short text post on a coloured background. Used only on a Page feed post with no photo, video or link card and at most 130 characters; anywhere else it is left out and the post publishes as plain text. If Facebook refuses the background the post is published once more without it.",
      +  "type": "string"
      +}
    • addedInput schema / properties / platformSpecific / properties / instagram / properties / locationId
      Added value: +{
      +  "description": "Digits only: the numeric ID of a Facebook Page that has a location. Applies to photos, videos, Reels and carousels, not Stories. Instagram refuses the post if it does not recognise the ID as a place.",
      +  "type": "string"
      +}
    • addedInput schema / properties / platformSpecific / properties / instagram / properties / shareToFeed
      Added value: +{
      +  "description": "Reels only. false shows the Reel only in the Reels tab; true also shows it in the main feed. Omitted: Instagram's own default (feed and Reels tab).",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / platformSpecific / properties / instagram / properties / userTags
      Added value: +{
      +  "description": "People tagged in the post, up to 20 per photo or video. On a photo (and each photo of a carousel) a tag needs x and y or it is left out; on a Reel or video post people are tagged by username only and any position is ignored. Carousel videos and Stories carry no tags.",
      +  "items": {
      +    "properties": {
      +      "mediaIndex": {
      +        "description": "Which attached media item the tag belongs to, counting from 0 in attachment order (default 0).",
      +        "type": "number"
      +      },
      +      "username": {
      +        "description": "A public Instagram username, leading @ optional.",
      +        "type": "string"
      +      },
      +      "x": {
      +        "description": "Position on the photo, 0 to 1 from the left. Give x and y together or not at all.",
      +        "type": "number"
      +      },
      +      "y": {
      +        "description": "Position on the photo, 0 to 1 from the top.",
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "username"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / platformSpecific / properties / linkedin / properties / disableReshare
      Added value: +{
      +  "description": "true stops other members resharing the post (default false).",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / platformSpecific / properties / linkedin / properties / documentTitle
      Added value: +{
      +  "description": "`document` posts only: the title shown above the document in the feed. Defaults to the file's name.",
      +  "type": "string"
      +}
    • addedInput schema / properties / platformSpecific / properties / linkedin / properties / poll
      Added value: +{
      +  "description": "Required for `poll` posts, which also need post text and take no media.",
      +  "properties": {
      +    "duration": {
      +      "description": "Default THREE_DAYS.",
      +      "enum": [
      +        "ONE_DAY",
      +        "THREE_DAYS",
      +        "SEVEN_DAYS",
      +        "FOURTEEN_DAYS"
      +      ],
      +      "type": "string"
      +    },
      +    "options": {
      +      "description": "2 to 4 answers, each up to 30 characters; blank entries are ignored.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "question": {
      +      "description": "Up to 140 characters.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "question",
      +    "options"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / platformSpecific / properties / linkedin / properties / reshareId
      Added value: +{
      +  "description": "Required for `reshare` posts: the post's LinkedIn link, or its urn:li:share:<id> / urn:li:ugcPost:<id> ID. Activity links (urn:li:activity:<id>) cannot be reshared.",
      +  "type": "string"
      +}
    • addedInput schema / properties / platformSpecific / properties / linkedin / properties / thumbnailUrl
      Added value: +{
      +  "description": "Cover for a `post` that carries a video: a public http(s) link to an image of up to 10MB. A cover that cannot be fetched is skipped and LinkedIn picks the frame.",
      +  "type": "string"
      +}
    • addedInput schema / properties / platformSpecific / properties / linkedin / properties / visibility
      Added value: +{
      +  "description": "Who can see the post (default PUBLIC). CONNECTIONS applies to personal profiles only; on a Page it is published as PUBLIC.",
      +  "enum": [
      +    "PUBLIC",
      +    "CONNECTIONS",
      +    "LOGGED_IN"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / platformSpecific / properties / mastodon / properties / poll
      Added value: +{
      +  "description": "Adds a poll. Cannot be combined with media. First post of a thread. A server with tighter limits refuses it at publish time.",
      +  "properties": {
      +    "expiresIn": {
      +      "description": "Seconds the poll stays open, 300 to 2629746.",
      +      "type": "number"
      +    },
      +    "hideTotals": {
      +      "description": "Hide counts until the poll ends (default false).",
      +      "type": "boolean"
      +    },
      +    "multiple": {
      +      "description": "Voters may pick more than one choice (default false).",
      +      "type": "boolean"
      +    },
      +    "options": {
      +      "description": "2 to 4 choices, each 1 to 50 characters.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "options",
      +    "expiresIn"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / platformSpecific / properties / mastodon / properties / quoteId
      Added value: +{
      +  "description": "The post to quote: its URL, or its status ID on your own server. Needs a server running Mastodon 4.5 or later, otherwise publishing fails and nothing is posted.",
      +  "type": "string"
      +}
    • addedInput schema / properties / platformSpecific / properties / mastodon / properties / sensitive
      Added value: +{
      +  "description": "Hides attached media behind a click (default false). No effect without media. Applies to every part of a thread.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / platformSpecific / properties / pinterest / properties / boardSectionId
      Added value: +{
      +  "description": "Numeric ID of a section of the chosen board (list with get_channel_options and boardId). Send it beside its board, per channel or flat. Pin, video_pin and carousel. A flat value is ignored for a channel with its own boardId, and any section is ignored when no board was chosen.",
      +  "type": "string"
      +}
    • addedInput schema / properties / platformSpecific / properties / pinterest / properties / coverKeyFrameTime
      Added value: +{
      +  "description": "video_pin only: use the frame at this many seconds (whole number, 0 or more) as the cover. A time past the end uses the last frame; coverImageUrl wins when both are sent.",
      +  "type": "number"
      +}
    • removedInput schema / properties / platformSpecific / properties / reddit
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "additionalProperties": {
      -        "additionalProperties": {},
      -        "properties": {
      -          "flairId": {
      -            "description": "Link-flair id (list via get_channel_options).",
      -            "type": "string"
      -          },
      -          "subreddit": {
      -            "description": "Required. Target subreddit — 'webdev', 'r/webdev' and '/r/webdev' are all accepted. Falls back to the subreddit stored on the channel.",
      -            "type": "string"
      -          },
      -          "thumbnailUrl": {
      -            "description": "Poster image URL for video posts. Optional — when omitted the server falls back to the video's auto-extracted poster frame, failing only if neither exists. Unlike Pinterest's coverImageUrl there is no attached-image fallback, because a Reddit media post accepts exactly one file.",
      -            "type": "string"
      -          },
      -          "title": {
      -            "description": "Post title. Defaults to the first line of content, truncated to 300 characters.",
      -            "type": "string"
      -          },
      -          "type": {
      -            "description": "Set to 'link' to force a link submission. Otherwise the kind is resolved from media: image -> image, video -> video, url set -> link, else self (text).",
      -            "type": "string"
      -          },
      -          "url": {
      -            "description": "Destination URL for a link post; implies type 'link'.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "propertyNames": {
      -        "type": "string"
      -      },
      -      "type": "object"
      -    },
      -    {
      -      "additionalProperties": {},
      -      "properties": {
      -        "flairId": {
      -          "description": "Link-flair id (list via get_channel_options).",
      -          "type": "string"
      -        },
      -        "subreddit": {
      -          "description": "Required. Target subreddit — 'webdev', 'r/webdev' and '/r/webdev' are all accepted. Falls back to the subreddit stored on the channel.",
      -          "type": "string"
      -        },
      -        "thumbnailUrl": {
      -          "description": "Poster image URL for video posts. Optional — when omitted the server falls back to the video's auto-extracted poster frame, failing only if neither exists. Unlike Pinterest's coverImageUrl there is no attached-image fallback, because a Reddit media post accepts exactly one file.",
      -          "type": "string"
      -        },
      -        "title": {
      -          "description": "Post title. Defaults to the first line of content, truncated to 300 characters.",
      -          "type": "string"
      -        },
      -        "type": {
      -          "description": "Set to 'link' to force a link submission. Otherwise the kind is resolved from media: image -> image, video -> video, url set -> link, else self (text).",
      -          "type": "string"
      -        },
      -        "url": {
      -          "description": "Destination URL for a link post; implies type 'link'.",
      -          "type": "string"
      -        }
      -      },
      -      "type": "object"
      -    }
      -  ],
      -  "description": "Reddit options, nested under the BulkPublish channel id: { \"12\": { \"subreddit\": \"webdev\" } }. A flat object (e.g. { \"subreddit\": \"webdev\" }) applies to every Reddit channel on the post. subreddit is required; a media post accepts exactly one file."
      -}
    • removedInput schema / properties / platformSpecific / properties / telegram / additionalProperties
      Removed value: -{}
    • addedInput schema / properties / platformSpecific / properties / telegram / anyOf
      Added value: +[
      +  {
      +    "additionalProperties": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "buttons": {
      +          "description": "Link buttons under the message, up to 3.",
      +          "items": {
      +            "properties": {
      +              "label": {
      +                "description": "Up to 64 characters.",
      +                "type": "string"
      +              },
      +              "url": {
      +                "description": "http(s) link.",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "label",
      +              "url"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "disablePreview": {
      +          "description": "Turns off the link preview.",
      +          "type": "boolean"
      +        },
      +        "pin": {
      +          "description": "Pin after sending. If the bot lacks the right to pin the post still publishes and a warning is recorded.",
      +          "type": "boolean"
      +        },
      +        "poll": {
      +          "description": "Sent as a poll after the message.",
      +          "properties": {
      +            "anonymous": {
      +              "description": "Default true.",
      +              "type": "boolean"
      +            },
      +            "correctOption": {
      +              "description": "0-based index of the right answer; required when quiz is true.",
      +              "type": "number"
      +            },
      +            "multipleAnswers": {
      +              "description": "Default false. Cannot be combined with quiz.",
      +              "type": "boolean"
      +            },
      +            "options": {
      +              "description": "2 to 12 answers, each up to 100 characters.",
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            },
      +            "question": {
      +              "description": "1 to 300 characters.",
      +              "type": "string"
      +            },
      +            "quiz": {
      +              "description": "Default false.",
      +              "type": "boolean"
      +            }
      +          },
      +          "required": [
      +            "question",
      +            "options"
      +          ],
      +          "type": "object"
      +        },
      +        "protectContent": {
      +          "description": "Recipients cannot forward or save the message.",
      +          "type": "boolean"
      +        },
      +        "silent": {
      +          "description": "Send without a notification sound.",
      +          "type": "boolean"
      +        },
      +        "spoiler": {
      +          "description": "Hides a photo or video behind a spoiler.",
      +          "type": "boolean"
      +        },
      +        "threadId": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "number"
      +            }
      +          ],
      +          "description": "Forum topic to post into: digits only, up to 12."
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "propertyNames": {
      +      "type": "string"
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": {},
      +    "properties": {
      +      "buttons": {
      +        "description": "Link buttons under the message, up to 3.",
      +        "items": {
      +          "properties": {
      +            "label": {
      +              "description": "Up to 64 characters.",
      +              "type": "string"
      +            },
      +            "url": {
      +              "description": "http(s) link.",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "label",
      +            "url"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "disablePreview": {
      +        "description": "Turns off the link preview.",
      +        "type": "boolean"
      +      },
      +      "pin": {
      +        "description": "Pin after sending. If the bot lacks the right to pin the post still publishes and a warning is recorded.",
      +        "type": "boolean"
      +      },
      +      "poll": {
      +        "description": "Sent as a poll after the message.",
      +        "properties": {
      +          "anonymous": {
      +            "description": "Default true.",
      +            "type": "boolean"
      +          },
      +          "correctOption": {
      +            "description": "0-based index of the right answer; required when quiz is true.",
      +            "type": "number"
      +          },
      +          "multipleAnswers": {
      +            "description": "Default false. Cannot be combined with quiz.",
      +            "type": "boolean"
      +          },
      +          "options": {
      +            "description": "2 to 12 answers, each up to 100 characters.",
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "question": {
      +            "description": "1 to 300 characters.",
      +            "type": "string"
      +          },
      +          "quiz": {
      +            "description": "Default false.",
      +            "type": "boolean"
      +          }
      +        },
      +        "required": [
      +          "question",
      +          "options"
      +        ],
      +        "type": "object"
      +      },
      +      "protectContent": {
      +        "description": "Recipients cannot forward or save the message.",
      +        "type": "boolean"
      +      },
      +      "silent": {
      +        "description": "Send without a notification sound.",
      +        "type": "boolean"
      +      },
      +      "spoiler": {
      +        "description": "Hides a photo or video behind a spoiler.",
      +        "type": "boolean"
      +      },
      +      "threadId": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "number"
      +          }
      +        ],
      +        "description": "Forum topic to post into: digits only, up to 12."
      +      }
      +    },
      +    "type": "object"
      +  }
      +]
    • changedInput schema / properties / platformSpecific / properties / telegram / description
      Previous value: -"Telegram accepts no options — the destination chat is fixed when the channel is connected. Content is sent as plain text (no markdown). Text over the 1024-char caption limit is posted as a second message alongside captionless media."New value: +"Telegram options, nested under the BulkPublish channel id: { \"12\": { \"silent\": true } }. A flat object applies to every Telegram channel on the post. The destination chat is fixed when the channel is connected. Content is sent as plain text (no markdown). Text over the 1024-char caption limit is posted as a second message alongside captionless media. Attached GIFs, audio and other files are sent as an animation, an audio file or a document according to their type."
    • removedInput schema / properties / platformSpecific / properties / telegram / properties
      Removed value: -{}
    • removedInput schema / properties / platformSpecific / properties / telegram / type
      Removed value: -"object"
    • addedInput schema / properties / platformSpecific / properties / threads / properties / linkAttachment
      Added value: +{
      +  "description": "An http(s) URL on a public host shown as the preview card on a text post; left out on other post types. Threads refuses a post with more than 5 links in total, and a link here that differs from every link in the text counts as one more.",
      +  "type": "string"
      +}
    • addedInput schema / properties / platformSpecific / properties / threads / properties / pollOptions
      Added value: +{
      +  "description": "2 to 4 poll choices, each 1 to 25 characters. Text-only posts: on an image, video or carousel post the poll is left out. In a thread it goes on the first part when that part has no media.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / platformSpecific / properties / threads / properties / replyControl
      Added value: +{
      +  "description": "Who can reply (default everyone). parent_post_author_only means only you. Applies to the post itself, never to later replies in a thread; ignored on a repost.",
      +  "enum": [
      +    "everyone",
      +    "accounts_you_follow",
      +    "mentioned_only",
      +    "parent_post_author_only",
      +    "followers_only"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / platformSpecific / properties / tiktok / properties / autoAddMusic
      Added value: +{
      +  "description": "Photo posts published directly only: lets TikTok add a recommended track (default false). Ignored with sendToDrafts.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / platformSpecific / properties / tiktok / properties / photoCoverIndex
      Added value: +{
      +  "description": "photo_slideshow only: which image is the cover, a whole number 0 to 34 counting from 0 in attachment order (default 0). An index past the last image falls back to the first.",
      +  "type": "number"
      +}
    • addedInput schema / properties / platformSpecific / properties / tiktok / properties / sendToDrafts
      Added value: +{
      +  "description": "Send a video or photo_slideshow post to the creator's TikTok drafts instead of publishing it (default false). privacyLevel is then not required, and the direct-post settings (privacyLevel, disableDuet, disableStitch, disableComment, isAigc, brandContentToggle, brandOrganicToggle, autoAddMusic, thumbnailTimestamp) are ignored. A video draft carries no caption; a photo draft sends it. Once delivered the destination becomes published with no platformUrl, and analytics are not collected.",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / platformSpecific / properties / tumblr / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": {
      -      "additionalProperties": {},
      -      "properties": {
      -        "blogName": {
      -          "description": "Which blog to publish to. Defaults to the blog the channel was connected as (list via get_channel_options).",
      -          "type": "string"
      -        },
      -        "link": {
      -          "description": "Appended as a link block.",
      -          "type": "string"
      -        },
      -        "sourceUrl": {
      -          "description": "Attribution URL stored as the post's source.",
      -          "type": "string"
      -        },
      -        "tags": {
      -          "description": "Tumblr tags, without the leading '#'.",
      -          "items": {
      -            "type": "string"
      -          },
      -          "type": "array"
      -        },
      -        "title": {
      -          "description": "Rendered as a heading block above the body.",
      -          "type": "string"
      -        }
      -      },
      -      "type": "object"
      -    },
      -    "propertyNames": {
      -      "type": "string"
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": {},
      -    "properties": {
      -      "blogName": {
      -        "description": "Which blog to publish to. Defaults to the blog the channel was connected as (list via get_channel_options).",
      -        "type": "string"
      -      },
      -      "link": {
      -        "description": "Appended as a link block.",
      -        "type": "string"
      -      },
      -      "sourceUrl": {
      -        "description": "Attribution URL stored as the post's source.",
      -        "type": "string"
      -      },
      -      "tags": {
      -        "description": "Tumblr tags, without the leading '#'.",
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "title": {
      -        "description": "Rendered as a heading block above the body.",
      -        "type": "string"
      -      }
      -    },
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "blogName": {
      +          "description": "Which blog to publish to. Defaults to the blog the channel was connected as (list via get_channel_options).",
      +          "type": "string"
      +        },
      +        "link": {
      +          "description": "Appended as a link block.",
      +          "type": "string"
      +        },
      +        "reblogInteraction": {
      +          "description": "Who can reblog the post.",
      +          "enum": [
      +            "everyone",
      +            "noone"
      +          ],
      +          "type": "string"
      +        },
      +        "reblogUrl": {
      +          "description": "A Tumblr post link (tumblr.com/<blog>/<id> or <blog>.tumblr.com/post/<id>): publishes a reblog of that post with your text as the comment.",
      +          "type": "string"
      +        },
      +        "slug": {
      +          "description": "Up to 200 characters; lowercased and hyphenated into the permalink.",
      +          "type": "string"
      +        },
      +        "sourceUrl": {
      +          "description": "Attribution URL stored as the post's source.",
      +          "type": "string"
      +        },
      +        "state": {
      +          "description": "Default published. A scheduled post with published still goes out at its time; draft and private override that and the post is never made public by BulkPublish.",
      +          "enum": [
      +            "published",
      +            "queue",
      +            "draft",
      +            "private"
      +          ],
      +          "type": "string"
      +        },
      +        "tags": {
      +          "description": "Tumblr tags, without the leading '#'.",
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "title": {
      +          "description": "Rendered as a heading block above the body.",
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "propertyNames": {
      +      "type": "string"
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": {},
      +    "properties": {
      +      "blogName": {
      +        "description": "Which blog to publish to. Defaults to the blog the channel was connected as (list via get_channel_options).",
      +        "type": "string"
      +      },
      +      "link": {
      +        "description": "Appended as a link block.",
      +        "type": "string"
      +      },
      +      "reblogInteraction": {
      +        "description": "Who can reblog the post.",
      +        "enum": [
      +          "everyone",
      +          "noone"
      +        ],
      +        "type": "string"
      +      },
      +      "reblogUrl": {
      +        "description": "A Tumblr post link (tumblr.com/<blog>/<id> or <blog>.tumblr.com/post/<id>): publishes a reblog of that post with your text as the comment.",
      +        "type": "string"
      +      },
      +      "slug": {
      +        "description": "Up to 200 characters; lowercased and hyphenated into the permalink.",
      +        "type": "string"
      +      },
      +      "sourceUrl": {
      +        "description": "Attribution URL stored as the post's source.",
      +        "type": "string"
      +      },
      +      "state": {
      +        "description": "Default published. A scheduled post with published still goes out at its time; draft and private override that and the post is never made public by BulkPublish.",
      +        "enum": [
      +          "published",
      +          "queue",
      +          "draft",
      +          "private"
      +        ],
      +        "type": "string"
      +      },
      +      "tags": {
      +        "description": "Tumblr tags, without the leading '#'.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "title": {
      +        "description": "Rendered as a heading block above the body.",
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  }
      +]
    • addedInput schema / properties / platformSpecific / properties / x / properties / communityId
      Added value: +{
      +  "description": "Posts into an X Community: its numeric ID or its https://x.com/i/communities/<id> URL. The account must be a member.",
      +  "type": "string"
      +}
    • addedInput schema / properties / platformSpecific / properties / x / properties / poll
      Added value: +{
      +  "description": "Adds a poll. Cannot be combined with media or quoteId. On a thread it goes on the first post.",
      +  "properties": {
      +    "durationMinutes": {
      +      "description": "How long the poll stays open, whole minutes from 5 to 10080 (7 days).",
      +      "type": "number"
      +    },
      +    "options": {
      +      "description": "2 to 4 choices, each 1 to 25 characters.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "options",
      +    "durationMinutes"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / platformSpecific / properties / x / properties / quoteId
      Added value: +{
      +  "description": "The post to quote: its numeric ID or its x.com / twitter.com status URL. Cannot be combined with poll. On a thread it applies to the first post.",
      +  "type": "string"
      +}
    • addedInput schema / properties / platformSpecific / properties / x / properties / replySettings / description
      Added value: +"Who can reply: everyone, following, verified, subscribers or mentionedUsers. Applies to a single post and to the first post of a thread."
    • addedInput schema / properties / platformSpecific / properties / x / properties / shareWithFollowers
      Added value: +{
      +  "description": "With communityId, also shows the post to your followers (default false). Ignored without communityId.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / platformSpecific / properties / youtube / properties / containsSyntheticMedia
      Added value: +{
      +  "description": "true discloses realistic altered or synthetic content. Video and short posts.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / platformSpecific / properties / youtube / properties / defaultAudioLanguage
      Added value: +{
      +  "description": "Language spoken in the video, e.g. 'en'.",
      +  "type": "string"
      +}
    • addedInput schema / properties / platformSpecific / properties / youtube / properties / defaultLanguage
      Added value: +{
      +  "description": "Language of the title and description, e.g. 'en', 'pt-BR', 'zh-Hans'.",
      +  "type": "string"
      +}
    • addedInput schema / properties / platformSpecific / properties / youtube / properties / embeddable
      Added value: +{
      +  "description": "false stops other websites embedding the video.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / platformSpecific / properties / youtube / properties / license
      Added value: +{
      +  "description": "Default youtube; creativeCommon publishes under Creative Commons Attribution.",
      +  "enum": [
      +    "youtube",
      +    "creativeCommon"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / platformSpecific / properties / youtube / properties / notifySubscribers
      Added value: +{
      +  "description": "Only an explicit false changes anything: publishes without notifying subscribers.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / platformSpecific / properties / youtube / properties / publicStatsViewable
      Added value: +{
      +  "description": "false hides extended statistics on the watch page.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / platformSpecific / properties / youtube / properties / recordingDate
      Added value: +{
      +  "description": "YYYY-MM-DD or an ISO 8601 date-time; a plain date is stored as midnight UTC.",
      +  "type": "string"
      +}
    • addedInput schema / properties / postTypeOverrides / properties / linkedin / description
      Added value: +"document: one PDF, Word or PowerPoint file from the media library (exactly one document, no images or videos; title from platformSpecific.linkedin.documentTitle). poll: a question with 2-4 answers from platformSpecific.linkedin.poll (needs post text, no media). reshare: shares an existing LinkedIn post from platformSpecific.linkedin.reshareId (post text optional, no media)."
    • changedInput schema / properties / postTypeOverrides / properties / linkedin / enum
      Previous value: -[
      -  "post",
      -  "multi_image",
      -  "pdf_carousel",
      -  "article"
      -]New value: +[
      +  "post",
      +  "multi_image",
      +  "pdf_carousel",
      +  "article",
      +  "document",
      +  "poll",
      +  "reshare"
      +]
    • removedInput schema / properties / postTypeOverrides / properties / reddit
      Removed value: -{
      -  "enum": [
      -    "post"
      -  ],
      -  "type": "string"
      -}
  4. Changed1 schema field changed
    • changedInput schema / properties / linkTrackingOverride / description
      Previous value: -"Optional per-post override for link tracking (bulkpubli.sh). true forces links in this post to be shortened and their clicks counted, false forces them to publish as written, and null/omitted (the default) inherits the organization's Link Tracking setting. Shortening happens at publish time, per channel, so two accounts on the same platform get distinct codes; it is skipped for a channel when the rewrite would push the post past that platform's character limit (a short URL is 28 characters and can be longer than the link it replaces)."New value: +"Optional per-post override for link tracking (bulkpubli.sh). true forces links in this post to be shortened and their clicks counted, false forces them to publish as written, and null/omitted (the default) inherits the organization's Link Tracking setting. Shortening happens at publish time, per channel, so two accounts on the same platform get distinct codes; it is skipped for a channel when the rewrite would push the post past that platform's character limit (a short URL is 28 characters and can be longer than the link it replaces). Short links are part of the Pro and Business plans: on Free, links always publish as written and true has no effect."
  5. Changed3 schema fields changed
    • changedInput schema / properties / platformSpecific / properties / snapchat / description
      Previous value: -"Snapchat options, nested under the BulkPublish channel id: { \"12\": { \"title\": \"My story\" } }. A flat object applies to every Snapchat channel on the post. Post types: story (default), saved_story, spotlight. Every Snapchat post requires exactly ONE image or video (vertical, videos 5–60s, spotlight 6–60s video-only, max 1GB). The caption is NOT sent for plain stories — it is only the Spotlight description (160 chars max) and the Saved Story title fallback. First comments are not supported."New value: +"Snapchat options, nested under the BulkPublish channel id: { \"12\": { \"title\": \"My story\" } }. A flat object applies to every Snapchat channel on the post. Post types: story (default), saved_story, spotlight. Every Snapchat post requires exactly ONE image or video (vertical, story videos 5–60s, spotlight 6–60s video-only, saved_story videos not length-checked, max 1GB; a video outside its range is refused when the post is scheduled or published). The caption is NOT sent for plain stories — it is only the Spotlight description (160 chars max) and the Saved Story title fallback. First comments are not supported."
    • changedInput schema / properties / postTypeOverrides / description
      Previous value: -"Per-platform post type override. E.g. { \"instagram\": \"reel\", \"youtube\": \"short\" }."New value: +"Per-platform post type override. E.g. { \"instagram\": \"reel\", \"youtube\": \"short\" }. Video length is checked per type when the post is scheduled or published, and a video outside the range is refused: instagram reel/feed_video 3s–15min, story 3–60s; facebook reel 3–90s, story 3–60s; threads video/carousel up to 5min; linkedin 3s–30min; pinterest video_pin at least 4s; snapchat story 5–60s, spotlight 6–60s (saved_story not checked)."
    • changedInput schema / properties / postTypeOverrides / properties / snapchat / description
      Previous value: -"story (default): 1 image or video, caption NOT sent. saved_story: 1 image or video with a title. spotlight: video only, 6–60s, caption becomes the description."New value: +"story (default): 1 image or video, caption NOT sent. saved_story: 1 image or video with a title. spotlight: video only, 6–60s, caption becomes the description. Story videos must be 5–60s; a video outside its range is refused when the post is scheduled or published. saved_story video length is not checked."
  6. Changed24 schema fields changed
    • changedInput schema / properties / content / description
      Previous value: -"The post text content. Optional — defaults to empty for media-only posts."New value: +"The post text content. Optional — defaults to empty for media-only posts. LinkedIn mentions: write @[Display Name](urn:li:organization:ID) for a Page or @[Display Name](urn:li:person:ID) for a person; search_mentions on a LinkedIn channel returns ready-made Page tokens. The token publishes as a real mention on LinkedIn and as plain @Display Name on other channels."
    • addedInput schema / properties / platformSpecific / properties / bluesky / properties / repostId
      Added value: +{
      +  "description": "With postTypeOverrides.bluesky = 'repost': the bsky.app post URL (or at:// URI) to repost.",
      +  "type": "string"
      +}
    • addedInput schema / properties / platformSpecific / properties / facebook / properties / thumbnailUrl
      Added value: +{
      +  "description": "Cover image URL for a video or Reel. Facebook only accepts a cover once the video exists, so it is applied after the video publishes and appears a moment after the post; a cover that cannot be fetched or that Facebook rejects leaves the video published with Facebook's own chosen frame rather than failing the post.",
      +  "type": "string"
      +}
    • addedInput schema / properties / platformSpecific / properties / instagram / properties / collaborators / description
      Added value: +"Comma-separated Instagram usernames (no leading @) tagged as co-authors. Applies with postTypeOverrides.instagram of 'feed_photo', 'feed_video', 'reel' or 'carousel' — on a carousel the co-authors are set on the carousel itself, not on its individual items. Ignored on 'story', which has no co-author concept."
    • addedInput schema / properties / platformSpecific / properties / instagram / properties / coverUrl
      Added value: +{
      +  "description": "Cover image URL for a video or Reel. Takes precedence over thumbnailTimestamp: Instagram accepts one or the other and rejects a request carrying both, so only this one is forwarded when both are sent.",
      +  "type": "string"
      +}
    • addedInput schema / properties / platformSpecific / properties / instagram / properties / graduationStrategy / description
      Added value: +"How a trial reel becomes a normal one: 'manual' (the creator releases it) or 'auto' (released automatically if it performs well). Default 'manual'. Ignored unless trialReel is true."
    • addedInput schema / properties / platformSpecific / properties / instagram / properties / thumbnailTimestamp / description
      Added value: +"Cover frame for a video or Reel, in seconds from the start. Applies to postTypeOverrides.instagram of 'feed_video' or 'reel'. Ignored when coverUrl is also set."
    • addedInput schema / properties / platformSpecific / properties / instagram / properties / trialReel / description
      Added value: +"Publish as a trial reel, shown to people who do not follow the account first. Only takes effect with postTypeOverrides.instagram of 'reel' — a 'feed_video' publishes as an ordinary reel and this is ignored, even though both use the same underlying reel container."
    • addedInput schema / properties / platformSpecific / properties / mastodon / properties / repostId
      Added value: +{
      +  "description": "With postTypeOverrides.mastodon = 'repost': the status URL or ID to boost.",
      +  "type": "string"
      +}
    • addedInput schema / properties / platformSpecific / properties / threads / properties / locationId
      Added value: +{
      +  "description": "Numeric place ID from get_channel_options with a `q` search on a Threads channel. Only works once the channel has granted location tagging.",
      +  "type": "string"
      +}
    • addedInput schema / properties / platformSpecific / properties / threads / properties / repostId
      Added value: +{
      +  "description": "With postTypeOverrides.threads = 'repost': the numeric ID of the Threads post to repost (Threads links cannot be used; the ID of a post published through BulkPublish is in get_post's platforms[].platformPostId).",
      +  "type": "string"
      +}
    • addedInput schema / properties / platformSpecific / properties / threads / properties / topicTag
      Added value: +{
      +  "description": "One topic tag for the post, without a leading '#'. Must not contain periods or ampersands.",
      +  "type": "string"
      +}
    • addedInput schema / properties / platformSpecific / properties / tiktok / properties / thumbnailTimestamp / description
      Added value: +"Cover frame for the video, in seconds from the start."
    • changedInput schema / properties / platformSpecific / properties / tumblr / description
      Previous value: -"Tumblr options, nested under the BulkPublish channel id: { \"12\": { \"blogName\": \"myblog\", \"tags\": [\"art\"] } }. A flat object applies to every Tumblr channel on the post. Up to 30 images OR exactly one video per post."New value: +"Tumblr options, nested under the BulkPublish channel id: { \"12\": { \"blogName\": \"myblog\", \"tags\": [\"art\"] } } (tags: array of strings or one comma-separated string). A flat object applies to every Tumblr channel on the post. Up to 30 images OR exactly one video per post."
    • addedInput schema / properties / platformSpecific / properties / x / properties / repostId
      Added value: +{
      +  "description": "With postTypeOverrides.x = 'repost': the X post URL or ID to repost (retweet).",
      +  "type": "string"
      +}
    • changedInput schema / properties / postTypeOverrides / properties / bluesky / enum
      Previous value: -[
      -  "post",
      -  "video"
      -]New value: +[
      +  "post",
      +  "video",
      +  "thread",
      +  "repost"
      +]
    • changedInput schema / properties / postTypeOverrides / properties / mastodon / enum
      Previous value: -[
      -  "post"
      -]New value: +[
      +  "post",
      +  "thread",
      +  "repost"
      +]
    • changedInput schema / properties / postTypeOverrides / properties / threads / enum
      Previous value: -[
      -  "text",
      -  "image",
      -  "video",
      -  "carousel"
      -]New value: +[
      +  "text",
      +  "image",
      +  "video",
      +  "carousel",
      +  "repost"
      +]
    • changedInput schema / properties / postTypeOverrides / properties / x / enum
      Previous value: -[
      -  "tweet",
      -  "video",
      -  "thread"
      -]New value: +[
      +  "tweet",
      +  "video",
      +  "thread",
      +  "repost"
      +]
    • addedInput schema / properties / publishWhenApproved
      Added value: +{
      +  "description": "Optional (default false). Set true on a post that waits for approval when it should go out as soon as it is approved, even if that is after its scheduled time. This is how someone who needs approval says 'publish now': status 'scheduled', scheduledAt = now, requestApproval true (or a contributor key), publishWhenApproved true. An approval arriving more than 15 minutes late then publishes immediately; with false it is approved but returned to draft for a new time. Stored only when the post ends up approvalStatus 'pending'; otherwise saved as false.",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / threadParts / description
      Previous value: -"Thread parts array. Required when postFormat is thread (min 2 parts)."New value: +"Thread parts array. Required when postFormat is thread (min 2 parts). EVERY part is measured against the character limit of every platform the post targets, not only the first — an over-long part is rejected with 400 VALIDATION_ERROR naming the part number, the platform and its limit. URLs count as 23 characters on X and Mastodon, their real length elsewhere."
    • addedOutput schema / properties / approver
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": {},
      +      "properties": {},
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Who approved it: { id, name, image }. Null unless approvalStatus is approved."
      +}
    • addedOutput schema / properties / assignee
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": {},
      +      "properties": {},
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Who is expected to act on it next: { id, name, image }. Null when nobody is."
      +}
    • addedOutput schema / properties / author
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": {},
      +      "properties": {},
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Who wrote the post: { id, name, image }. Null when that account is gone."
      +}
  7. Changed1 schema field changed
    • changedOutput schema / properties / mediaFiles / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "additionalProperties": {},
      -      "properties": {},
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "anyOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "additionalProperties": {},
      +          "properties": {},
      +          "type": "object"
      +        }
      +      ]
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  8. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "approvalStatus": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "content": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "createdAt": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "id": {
      +      "anyOf": [
      +        {
      +          "anyOf": [
      +            {
      +              "type": "number"
      +            },
      +            {
      +              "type": "string"
      +            }
      +          ]
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "labels": {
      +      "anyOf": [
      +        {
      +          "items": {
      +            "additionalProperties": {},
      +            "properties": {},
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "mediaFiles": {
      +      "anyOf": [
      +        {
      +          "items": {
      +            "additionalProperties": {},
      +            "properties": {},
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "postPlatforms": {
      +      "anyOf": [
      +        {
      +          "items": {
      +            "additionalProperties": {},
      +            "properties": {
      +              "platform": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "status": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "publishedAt": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "scheduledAt": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "status": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "draft, scheduled, processing, published, partial or failed."
      +    },
      +    "timezone": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    }
      +  },
      +  "type": "object"
      +}
  9. First observed

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=true, so the bar is lower, yet the description still adds real behavior: the post is never published immediately, and YouTube/TikTok reject image-only posts while Instagram silently defaults to feed_photo unless postTypeOverrides is set. It does not cover rate limits or the approval flow, but those live in the schema for requestApproval/publishWhenApproved.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five short sentences, front-loaded with the core action, followed by platform constraints marked IMPORTANT, then the routing sentence. Every sentence adds either a behavior or a selection rule; nothing is redundant with the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 15 parameters with deep nested platform objects and an output schema, the description correctly stays high-level and covers the cross-cutting traps (media-required platforms, Instagram default post type, no immediate publish). It could have noted that Discord/Telegram/Tumblr/Snapchat options nest under the BulkPublish channel id, which is the trickiest structural detail, but that is documented in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description does add meaning beyond the schema for two parameters by naming postTypeOverrides' role with video on Instagram, but it never mentions channels, status, scheduledAt, mediaFileIds, labels or threadParts by name, leaving the schema to carry it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create a new social media post') with the draft/scheduled scope spelled out, and explicitly separates itself from publish_post ('It never publishes immediately'). The remaining ambiguity is with the sibling compose_post, which the description never mentions, so an agent cannot tell create from compose without opening both schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear when-to-use ('when the user wants to draft or schedule one new post') and a when-not (never publishes immediately; publish_post does that), plus platform exclusion rules for YouTube/TikTok and an Instagram default. It stops short of routing among the other write siblings (compose_post, update_post, create_media_upload).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources