Skip to main content
Glama

Publish a post

publish
Destructive

Post to social channels. Channels open today: threads, instagram, youtube, facebook, bluesky, telegram, naver_blog, tiktok. Get accountIds from select_channels — do not guess which channel the person meant. Naver Blog caps how many posts one ID publishes; when it does, this returns 429 naver_rate_limited with retryAfterSeconds. Do not call again before that, the draft is already in Naver. Naver Blog asks which form to publish with, every post: if options.naver_blog.form is missing this returns 400 naver_form_required with forms (id, name, when). The form is the house style to use when the person has no style of their own, so read the conversation first. If they dictated the structure or you laid it out yourself, pass options.naver_blog.layout: "as-is" and the markdown goes out unchanged. Otherwise show them the forms (naver_layout with forms: "all" lays every one out side by side) and call again with the one they pick. Do not pick for them. Naver Blog goes out through the user's browser extension. If the response carries a bridge object, read bridge.state: offline means that Chrome is closed and the post is queued (up to 7 days); logged_out means Chrome is on but not logged in to Naver; login_needed means the Naver login saved for that blog in that Chrome is signed out, so its posts wait until the person logs in again from the dashboard. Either way relay bridge.userMessage to the person word for word, do not say it was published, and know that delete_post cancels a queued post and update_post rewrites it before it goes out. If the extension in that Chrome is too old for what you asked (update_post), this returns 422 extension_outdated with the installed and required versions. Uplika asks that Chrome to update at the same moment, so follow the message: usually call again in a minute or two. Text limits differ per channel: Threads 500 characters, Instagram 2200 characters, YouTube 5000 UTF-8 bytes, Facebook 63206 characters, Bluesky 300 graphemes and 3000 UTF-8 bytes, Telegram 4096 characters (1024 with media attached), Naver Blog 30000 characters, TikTok 2200 characters. Over the limit nothing goes out to any channel, so shorten it before calling. Images and video both work on the channels that take them. How several items sit in one post differs per channel: Threads groups up to 20 items in one post, Instagram groups up to 10 items in one post, YouTube takes 1 video and no images, Facebook groups up to 10 items in one post, Bluesky has no carousel and places up to 4 images in the post itself, Telegram groups up to 10 items in one post, Naver Blog has no carousel and places up to 40 images in the post itself, TikTok groups up to 35 items in one post. More than a channel takes is not refused: the first items up to its limit go out and that target's warning says what was left out. A channel that cannot mix images and video keeps the video. YouTube is different: it takes exactly one video, no images, and it needs options.youtube.title. Its description is measured in UTF-8 bytes, so Korean and Japanese cost three per character. Instagram cannot publish text alone: every post needs at least one image or video. A single video becomes a reel there. Set options.instagram.contentType to story for a story; stories show no caption. Non-JPEG images are converted for Instagram automatically. Instagram feed images (single or carousel) must be between 4:5 and 1.91:1: one outside that range is not refused, it is center-cropped to the nearest of the two on a copy, and that target's warning says so. A 3:4 phone photo loses about 6% of its height; a 9:16 image loses 30%, so crop it yourself or send it as a story if the edges matter. A reel takes music, or another reel's sound, through options.instagram.audio with an id from search_instagram_audio (Instagram accounts connected via Facebook only); for a voice-over set volume around 20 and keep videoVolume at 100, and pick audio at least as long as the reel because it plays once from its start. Facebook publishes to a Page, never a personal profile. options.facebook.link makes a link post (no media alongside), and a single video becomes a reel (3-90 seconds). Bluesky counts graphemes, not characters, and also caps UTF-8 bytes, so a post of 300 emoji can fail on the byte limit. Set options.bluesky.langs to the language of the text (1-3 BCP-47 codes like ["ko"]): without it the post never appears in language-scoped feeds, and Bluesky has no post editing to fix it later. Links, @mentions and #hashtags in the text are made clickable for you, and a link gets a preview card, so write the URL plainly. There are three ways to get a media id, pick by where the file is: media_from_url when it already has a public https address, media_upload_link when it is on the person's own device, media_presign plus media_complete when you can PUT the bytes yourself. Then pass the media ids here. On Naver Blog the body can also place media itself with alt and @video(media:), each on a line of its own. Ids you reference that way are picked up even if you leave them out of mediaIds, and media you pass but never reference goes at the end of the post. Those references only work when every target is Naver Blog: other channels would publish the markup as literal text, so we refuse instead. A photo line takes {.link=https://…} to make the photo a link (describe_grammar topic=media). This publishes immediately unless you pass scheduledAt (we hold the post and send it at that time, on every channel) or draft: true (nothing goes out; the person or update_post finishes it later). scheduledAt needs a timezone offset, 10 minutes to a year out; ask the person which timezone they mean instead of guessing. options.naver_blog.scheduledAt means the same as scheduledAt on the post (we hold the post and send it then; Naver's own reservation is not used), so pass the post-level one. A scheduled or draft post comes back with status scheduled or draft, can be changed with update_post, sent early with publish_now, and dropped with delete_post. Every channel also takes options..content to send that channel a different text than the shared content, which is how Naver Blog Markdown and a 500-character Threads post fit in one call. On YouTube we pass privacyStatus through as you set it and report back what YouTube actually applied, so read the warning on the result instead of promising the person a visibility we did not confirm. Returns while the post is still publishing. The permalink is null at that moment. Call get_post with the returned id to see the final status and link. Pass wait: true to hold the response until it is really out — then you can tell the person it is posted instead of guessing. For a long post use threadItems instead of publish-then-reply: we keep the order and wait for each piece to land before sending the next one.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
waitNoHold the response until the post is really out. Text waits up to 10 seconds, posts with media up to 75 seconds. If it is still going after that you get the usual publishing response and should poll get_post. Defaults to false. Ignored with scheduledAt or draft.
draftNotrue saves the post as a draft on uplika without sending anything. Use it when the person wants to review before it goes out. They finish it in the dashboard, or you call update_post and publish_now.
batchIdNoOptional tag (letters, digits, - or _) to group posts made together, for example the same text sent to two workspaces. Pass the same value on each call.
contentNoPost text
optionsNoPer-channel settings, keyed by channel id. Only the channels you are posting to need an entry. Every channel takes content to override the shared text for that channel alone.
mediaIdsNoMedia ids from media_presign (confirmed with media_complete), media_from_url or media_upload_link. On Naver Blog you can leave out ids the body already points at with media:<id>; we pick those up from the text.
topicTagNoOne topic to tag the post with, like a category. Only some channels take one, and those reject periods and ampersands in it. If any channel in accountIds does not take topics the whole call is refused, so publish to it separately. On a thread it goes on the first piece only. Leave it out unless the person asked for a topic.
accountIdsYesAccount ids from select_channels
automationNoAttach an automation to this post in the same call. template defaults to comment_to_dm; params are that template's params (see list_automation_templates) minus post, which is this post. Created as a draft unless enabled: true. Each target goes through the same checks as create_automation. A target whose channel the template does not cover (comment_to_dm on Threads or Naver Blog, any template on YouTube, Telegram, Bluesky or TikTok) is skipped and named in the response with the reason.
scheduledAtNoISO 8601 time with a timezone offset (2026-09-20T09:00:00+09:00) to send the post at, on every channel. 10 minutes to 365 days from now. We keep the post as scheduled until then; the person can still change or cancel it.
threadItemsNoSplit a long post into a chain instead of calling publish and then reply. The first item is the root and the rest become replies under it, in order. We handle the ordering and the waiting. Each item obeys the character limit on its own. Pass either content or threadItems, not both. If a later item fails, the ones already up stay up and the response tells you where to resume.
workspaceIdNoWhich workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / options / properties / instagram / properties / audio / description
      Previous value: -"Music or a sound from search_instagram_audio to put on a reel. Reels only, and only on Instagram accounts connected via Facebook. Instagram defaults both volumes to 100, which can drown a voice-over; for narration try volume 20 and videoVolume 100. Instagram cannot preview the mix before it is published, and you cannot choose where the audio starts."New value: +"Music or a sound from search_instagram_audio to put on a reel. Reels only, and only on Instagram accounts connected via Facebook. Instagram defaults both volumes to 100, which can drown a voice-over; for narration try volume 20 and videoVolume 100. Instagram cannot preview the mix before it is published. The audio plays once from its beginning (you cannot choose the start) and is not repeated, so pick one at least as long as the reel."
  2. Changed1 schema field changed
    • addedInput schema / properties / options / properties / instagram / properties / audio
      Added value: +{
      +  "description": "Music or a sound from search_instagram_audio to put on a reel. Reels only, and only on Instagram accounts connected via Facebook. Instagram defaults both volumes to 100, which can drown a voice-over; for narration try volume 20 and videoVolume 100. Instagram cannot preview the mix before it is published, and you cannot choose where the audio starts.",
      +  "properties": {
      +    "id": {
      +      "description": "The audio id from search_instagram_audio. Digits only. Use an id from this account's own results.",
      +      "type": "string"
      +    },
      +    "videoVolume": {
      +      "description": "Loudness of the video's own sound, a whole number from 0 to 100. Default 100.",
      +      "type": "number"
      +    },
      +    "volume": {
      +      "description": "Loudness of the added audio, a whole number from 0 to 100. Default 100.",
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "id"
      +  ],
      +  "type": "object"
      +}
  3. Changed2 schema fields changed
    • changedInput schema / properties / options / properties / tiktok / description
      Previous value: -"TikTok settings. privacyLevel is REQUIRED for a normal post and has no default on purpose: TikTok's rules say the person must choose visibility deliberately, so we ask for it instead of guessing. Call get_publish_options first to see which values this account may use right now, whether it can post at all, and its video length limit. TikTok has no text-only posts, cannot mix a video and photos, and has no API for deleting a post or reading comments. Until Uplika completes TikTok's review a direct post is visible only to the creator (SELF_ONLY) and comes back with no link and no metrics. postMode draft sends the video to the creator's TikTok inbox, where they choose who can see it."New value: +"TikTok settings. privacyLevel is REQUIRED for a normal post and has no default on purpose: TikTok's rules say the person must choose visibility deliberately, so we ask for it instead of guessing. Call get_publish_options first to see which values this account may use right now, whether it can post at all, and its video length limit. TikTok has no text-only posts, cannot mix a video and photos, and has no API for deleting a post or reading comments. A direct post goes out with the privacyLevel you pass; only a public post that TikTok has reviewed comes back with a link and metrics. postMode draft sends the video to the creator's TikTok inbox, where they choose who can see it."
    • changedInput schema / properties / options / properties / tiktok / properties / postMode / description
      Previous value: -"direct (default) posts to the profile. draft sends it to the creator's TikTok inbox; they open the notification and finish it in the app, choosing who can see it themselves, so we send no visibility on this path. Until Uplika completes TikTok's review, a direct post is visible only to the creator (SELF_ONLY). A draft is not on the profile until the person finishes it, so there is no link and no metrics in the meantime."New value: +"direct (default) posts to the profile. draft sends it to the creator's TikTok inbox; they open the notification and finish it in the app, choosing who can see it themselves, so we send no visibility on this path. A draft is not on the profile until the person finishes it, so there is no link and no metrics in the meantime."
  4. Changed3 schema fields changed
    • addedInput schema / properties / options / properties / facebook / properties / feedTargeting
      Added value: +{
      +  "description": "Preferred audience for a Facebook text or link post. A hint, not a limit: Facebook may show the post more to these people, others can still see it, and the effect is not guaranteed. Facebook does not keep it on photo posts or reels (we checked), so those are refused. It cannot be changed after the post is published.",
      +  "properties": {
      +    "countries": {
      +      "description": "Countries to aim the post at, for example [\"US\", \"GB\"].",
      +      "items": {
      +        "description": "ISO 3166-1 two-letter country code in capitals, like US.",
      +        "pattern": "^[A-Z]{2}$",
      +        "type": "string"
      +      },
      +      "maxItems": 25,
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / options / properties / youtube / properties / defaultLanguage
      Added value: +{
      +  "description": "The language the title and description are written in, as one BCP-47 code (for example en-US or ko). Leave it out and none is sent. The spoken language (YouTube Studio's Video language) cannot be set through the API.",
      +  "pattern": "^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,8})*$",
      +  "type": "string"
      +}
    • changedInput schema / properties / options / properties / youtube / properties / madeForKids / description
      Previous value: -"Whether this video is directed at children. This is a legal declaration about someone else's channel. Leave it out unless the person tells you, and the channel's own default applies."New value: +"Whether this video is directed at children. This is a legal declaration about someone else's channel. Leave it out unless the person tells you, and the channel's own default applies. If the channel has not set its audience either, YouTube Studio will not save other edits to this video until someone picks one, so ask the person."
  5. Changed1 schema field changed
    • changedInput schema / properties / automation / description
      Previous value: -"Attach an automation to this post in the same call. template defaults to comment_to_dm; params are that template's params (see list_automation_templates) minus post, which is this post. Created as a draft unless enabled: true. Targets on channels without comments or DMs (YouTube, Telegram, Naver Blog, Bluesky, TikTok) are skipped and named in the response."New value: +"Attach an automation to this post in the same call. template defaults to comment_to_dm; params are that template's params (see list_automation_templates) minus post, which is this post. Created as a draft unless enabled: true. Each target goes through the same checks as create_automation. A target whose channel the template does not cover (comment_to_dm on Threads or Naver Blog, any template on YouTube, Telegram, Bluesky or TikTok) is skipped and named in the response with the reason."
  6. Changed2 schema fields changed
    • changedInput schema / properties / options / properties / tiktok / description
      Previous value: -"TikTok settings. privacyLevel is REQUIRED for a normal post and has no default on purpose: TikTok's rules say the person must choose visibility deliberately, so we ask for it instead of guessing. Call get_publish_options first to see which values this account may use right now, whether it can post at all, and its video length limit. TikTok has no text-only posts, cannot mix a video and photos, and has no API for deleting a post or reading comments. While this app is awaiting TikTok's Content Posting audit a direct post can only be SELF_ONLY and comes back with no link and no metrics; if the person wants it public in the meantime, use postMode draft instead."New value: +"TikTok settings. privacyLevel is REQUIRED for a normal post and has no default on purpose: TikTok's rules say the person must choose visibility deliberately, so we ask for it instead of guessing. Call get_publish_options first to see which values this account may use right now, whether it can post at all, and its video length limit. TikTok has no text-only posts, cannot mix a video and photos, and has no API for deleting a post or reading comments. Until Uplika completes TikTok's review a direct post is visible only to the creator (SELF_ONLY) and comes back with no link and no metrics. postMode draft sends the video to the creator's TikTok inbox, where they choose who can see it."
    • changedInput schema / properties / options / properties / tiktok / properties / postMode / description
      Previous value: -"direct (default) posts to the profile. draft sends it to the creator's TikTok inbox; they open the notification and finish it in the app, choosing the visibility themselves. While this app awaits the Content Posting audit this is the only way to get something out publicly: a direct post can only be SELF_ONLY, but on this path we send no visibility at all. The trade is that it is not on the profile until the person finishes it, so there is no link and no metrics in the meantime."New value: +"direct (default) posts to the profile. draft sends it to the creator's TikTok inbox; they open the notification and finish it in the app, choosing who can see it themselves, so we send no visibility on this path. Until Uplika completes TikTok's review, a direct post is visible only to the creator (SELF_ONLY). A draft is not on the profile until the person finishes it, so there is no link and no metrics in the meantime."
  7. Changed1 schema field changed
    • addedInput schema / properties / options / properties / naver_blog / properties / imageSize
      Added value: +{
      +  "description": "Size of every single photo that has none of its own: fit is the document width, small is the editor's Small (about three quarters). A photo line's own {.fit} / {.small} wins. Leave it out for the default: document width for photos wider than 693px, original width for narrower ones. @group photos are always document width. Needs uplika extension 0.7.13 or later; with an older one the post still goes out and, if fit was asked for, a warning says so.",
      +  "enum": [
      +    "fit",
      +    "small"
      +  ],
      +  "type": "string"
      +}
  8. Changed1 schema field changed
    • changedInput schema / properties / wait / description
      Previous value: -"Hold the response until the post is really out. Text waits up to 10 seconds, posts with media up to 90 seconds. If it is still going after that you get the usual publishing response and should poll get_post. Defaults to false. Ignored with scheduledAt or draft."New value: +"Hold the response until the post is really out. Text waits up to 10 seconds, posts with media up to 75 seconds. If it is still going after that you get the usual publishing response and should poll get_post. Defaults to false. Ignored with scheduledAt or draft."
  9. Changed1 schema field changed
    • changedInput schema / properties / options / properties / naver_blog / properties / alignCenter / description
      Previous value: -"Center every paragraph and image."New value: +"Center every paragraph and image that has no alignment of its own. A photo line's own {.left} / {.center} / {.right} wins."
  10. Changed1 schema field changed
    • changedInput schema / properties / options / properties / naver_blog / properties / scheduledAt / description
      Previous value: -"Schedule the post inside Naver (ISO 8601, at least 10 minutes from now). The extension sets it in Naver's publish dialog. For scheduling across channels use scheduledAt on the post instead."New value: +"Same as scheduledAt on the post: ISO 8601 with a timezone offset, 10 minutes to a year out. Uplika holds the post and sends it to Naver at that time; Naver's own reservation is not used. Prefer scheduledAt on the post. Not allowed together with draftOnly or on a post that also targets other channels."
  11. Changed4 schema fields changed
    • changedInput schema / properties / options / properties / naver_blog / properties / categoryId / description
      Previous value: -"The id of a category on the connected blog. list_accounts returns them under naverBlog.categories. Give this or category (the name); there is no default, and without one Naver files the post under the wrong board."New value: +"The id of a category on the connected blog. list_accounts returns them under naverBlog.categories. Give this or category (the name); there is no default, and without one Naver files the post under the wrong board. Not needed and ignored when draftOnly is true (a draft has no board until it is published)."
    • changedInput schema / properties / options / properties / naver_blog / properties / draftOnly / description
      Previous value: -"Save as a draft in Naver instead of publishing. The user finishes it by hand, or you publish it later with publish_naver_draft. Different from draft on the post, which keeps the whole post on uplika."New value: +"Save as a draft in Naver instead of publishing. The user finishes it by hand, or you publish it later with publish_naver_draft. categoryId, tags and openType are not stored on a draft; pass them when you publish it. Different from draft on the post, which keeps the whole post on uplika."
    • changedInput schema / properties / options / properties / naver_blog / properties / openType / description
      Previous value: -"Who can see it. public (default), neighbor, mutual (mutual neighbors only), or private."New value: +"Who can see it. public (default), neighbor, mutual (mutual neighbors only), or private. Ignored when draftOnly is true."
    • changedInput schema / properties / options / properties / naver_blog / properties / tags / description
      Previous value: -"Up to 30 tags without the # sign and without spaces."New value: +"Up to 30 tags without the # sign and without spaces. Ignored when draftOnly is true."
  12. Changed1 schema field changed
    • changedInput schema / properties / options / properties / naver_blog / properties / tempLogNo / description
      Previous value: -"Set by publish_naver_draft: the Naver draft (임시저장) to publish as it is. The body is ignored; the extension loads that draft in the editor and presses publish."New value: +"Set by publish_naver_draft: the Naver temp-saved draft to publish as it is. The body is ignored; the extension loads that draft in the editor and presses publish."
  13. Changed3 schema fields changed
    • changedInput schema / properties / options / properties / instagram / properties / isAiGenerated / description
      Previous value: -"Set true to label the media as AI-generated on Instagram."New value: +"Set true to label the media as AI-generated on Instagram. An attached media marked aiGenerated turns this on automatically unless you set it to false."
    • changedInput schema / properties / options / properties / tiktok / properties / isAigc / description
      Previous value: -"Declare that the content was generated by AI. Worth setting when you made the video or images."New value: +"Declare that the content was generated by AI. Worth setting when you made the video or images. An attached media marked aiGenerated turns this on automatically unless you set it to false."
    • changedInput schema / properties / options / properties / youtube / properties / containsSyntheticMedia / description
      Previous value: -"Set true when the video contains realistic altered or synthetic content, including AI generated footage of real-looking people, places or events."New value: +"Set true when the video contains realistic altered or synthetic content, including AI generated footage of real-looking people, places or events. An attached media marked aiGenerated turns this on automatically unless you set it to false."
  14. Changed2 schema fields changed
    • changedInput schema / properties / options / properties / naver_blog / properties / draftOnly / description
      Previous value: -"Save as a draft in Naver instead of publishing. The user finishes it by hand. Different from draft on the post, which keeps the whole post on uplika."New value: +"Save as a draft in Naver instead of publishing. The user finishes it by hand, or you publish it later with publish_naver_draft. Different from draft on the post, which keeps the whole post on uplika."
    • addedInput schema / properties / options / properties / naver_blog / properties / tempLogNo
      Added value: +{
      +  "description": "Set by publish_naver_draft: the Naver draft (임시저장) to publish as it is. The body is ignored; the extension loads that draft in the editor and presses publish.",
      +  "type": "string"
      +}
  15. Changed1 schema field changed
    • changedInput schema / properties / options / properties / naver_blog / description
      Previous value: -"Naver Blog settings. Required when a target is a Naver Blog account. Naver Blog has no official API: the post is written by the user's browser extension, so it goes out only while that browser is open. list_accounts tells you whether the extension is online; if it is offline the post queues for up to 7 days and you should say so. Write the body as Markdown: `## ` becomes a section title, `> ` a quotation, `---` a divider. Plain paragraphs become body text. Three directives place things in the body, each alone on its line: `![alt](media:<id>)` an uploaded image, `@video(media:<id>)` an uploaded video, `@card(https://…)` a link card. Put them mid-paragraph and they publish as literal text. Ids you reference this way do not have to repeat in mediaIds, and media you pass but never reference goes at the end. When other channels are in the same post, put the Markdown in options.naver_blog.content so the shared content stays plain text."New value: +"Naver Blog settings. Required when a target is a Naver Blog account. Naver Blog has no official API: the post is written by the user's browser extension, so it goes out only while that browser is open. list_accounts tells you whether the extension is online; if it is offline the post queues for up to 7 days and you should say so. The body is Markdown, plus Naver-only markup for things Markdown has no word for (highlighting, styled tables, collages, maps, events): call describe_grammar with platform naver_blog for the syntax and its traps. Reference uploaded media inline with `![alt](media:<id>)`; ids you reference this way do not have to repeat in mediaIds, and media you pass but never reference goes at the end. When other channels are in the same post, put the Markdown in options.naver_blog.content so the shared content stays plain text."
  16. Changed1 schema field changed
    • addedInput schema / properties / automation
      Added value: +{
      +  "description": "Attach an automation to this post in the same call. template defaults to comment_to_dm; params are that template's params (see list_automation_templates) minus post, which is this post. Created as a draft unless enabled: true. Targets on channels without comments or DMs (YouTube, Telegram, Naver Blog, Bluesky, TikTok) are skipped and named in the response.",
      +  "properties": {
      +    "enabled": {
      +      "type": "boolean"
      +    },
      +    "name": {
      +      "type": "string"
      +    },
      +    "params": {
      +      "type": "object"
      +    },
      +    "template": {
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  17. Changed1 schema field changed
    • removedInput schema / properties / automation
      Removed value: -{
      -  "description": "Attach an automation to this post in the same call. template defaults to comment_to_dm; params are that template's params (see list_automation_templates) minus post, which is this post. Created as a draft unless enabled: true. Targets on channels without comments or DMs (YouTube, Telegram, Naver Blog, Bluesky, TikTok) are skipped and named in the response.",
      -  "properties": {
      -    "enabled": {
      -      "type": "boolean"
      -    },
      -    "name": {
      -      "type": "string"
      -    },
      -    "params": {
      -      "type": "object"
      -    },
      -    "template": {
      -      "type": "string"
      -    }
      -  },
      -  "type": "object"
      -}
  18. Changed1 schema field changed
    • addedInput schema / properties / automation
      Added value: +{
      +  "description": "Attach an automation to this post in the same call. template defaults to comment_to_dm; params are that template's params (see list_automation_templates) minus post, which is this post. Created as a draft unless enabled: true. Targets on channels without comments or DMs (YouTube, Telegram, Naver Blog, Bluesky, TikTok) are skipped and named in the response.",
      +  "properties": {
      +    "enabled": {
      +      "type": "boolean"
      +    },
      +    "name": {
      +      "type": "string"
      +    },
      +    "params": {
      +      "type": "object"
      +    },
      +    "template": {
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  19. Changed2 schema fields changed
    • addedInput schema / properties / options / properties / naver_blog / properties / form
      Added value: +{
      +  "description": "Form preset for the template layout (default photo-story). GET /v1/naver/forms lists the presets; naver_layout with forms: \"all\" shows them side by side.",
      +  "enum": [
      +    "bubble-info",
      +    "divider-tutorial",
      +    "photo-review",
      +    "place-list",
      +    "news-event",
      +    "table-explain",
      +    "mood-review",
      +    "photo-story"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / options / properties / naver_blog / properties / layout
      Added value: +{
      +  "description": "template (default) reshapes the body into the blog's house form before it goes out: #/## titles become underlined quote headings, a thin rule sits between sections, and photos you did not place with media: references go one per section (leftovers pair up at the end). Text is never changed. Call naver_layout first to see the result. Use as-is when the person dictated the structure or you placed everything yourself.",
      +  "enum": [
      +    "template",
      +    "as-is"
      +  ],
      +  "type": "string"
      +}
  20. Changed1 schema field changed
    • addedInput schema / properties / options / properties / naver_blog / properties / seoKeywords
      Added value: +{
      +  "description": "The search keywords this post targets, from keyword research (POST /v1/naver/keywords/judge): main is the one keyword the title leads with, subs (2-5) become the section titles one each. Not used when publishing; stored with the post and read by the SEO check.",
      +  "properties": {
      +    "main": {
      +      "description": "The main keyword, verbatim in the title and the first line.",
      +      "maxLength": 100,
      +      "type": "string"
      +    },
      +    "measuredAt": {
      +      "description": "ISO 8601 date the numbers were measured.",
      +      "type": "string"
      +    },
      +    "subs": {
      +      "description": "Sub keywords, one per section title.",
      +      "items": {
      +        "description": "One sub keyword.",
      +        "maxLength": 100,
      +        "type": "string"
      +      },
      +      "maxItems": 5,
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
  21. Changed1 schema field changed
    • changedInput schema / properties / options / properties / youtube / properties / privacyStatus / description
      Previous value: -"Defaults to private. We pass this through as you set it. Google can still restrict uploads from an API project that is under review, so if the video ends up somewhere else you get a warning on the result saying what YouTube actually applied."New value: +"Defaults to private. We pass this through as you set it. If YouTube applies something else, the result carries a warning saying what it actually applied."
  22. Changed4 schema fields changed
    • changedInput schema / properties / options / properties / naver_blog / properties / fontFamily / description
      Previous value: -"Body font as Naver's editor font code, e.g. \"nanumbarungothic\", \"nanumgothic\", \"nanummyeongjo\", \"maruburi\". Omit for the editor default."New value: +"Body font, one of nanumgothic, nanummyeongjo, nanumbarungothic, nanumsquare, maruburi. Omit for the editor default."
    • addedInput schema / properties / options / properties / naver_blog / properties / fontFamily / enum
      Added value: +[
      +  "nanumgothic",
      +  "nanummyeongjo",
      +  "nanumbarungothic",
      +  "nanumsquare",
      +  "maruburi"
      +]
    • changedInput schema / properties / options / properties / naver_blog / properties / fontSize / description
      Previous value: -"Body font size in px, 10-34. Omit for the editor default."New value: +"Body font size in px, one of the editor's sizes (11-38). Omit for the editor default."
    • addedInput schema / properties / options / properties / naver_blog / properties / fontSize / enum
      Added value: +[
      +  "11",
      +  "13",
      +  "15",
      +  "16",
      +  "19",
      +  "24",
      +  "28",
      +  "30",
      +  "34",
      +  "38"
      +]
  23. Changed42 schema fields changed
    • addedInput schema / properties / batchId
      Added value: +{
      +  "description": "Optional tag (letters, digits, - or _) to group posts made together, for example the same text sent to two workspaces. Pass the same value on each call.",
      +  "type": "string"
      +}
    • addedInput schema / properties / draft
      Added value: +{
      +  "description": "true saves the post as a draft on uplika without sending anything. Use it when the person wants to review before it goes out. They finish it in the dashboard, or you call update_post and publish_now.",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / options / description
      Previous value: -"Per-channel settings. Only the channels you are posting to need an entry."New value: +"Per-channel settings, keyed by channel id. Only the channels you are posting to need an entry. Every channel takes content to override the shared text for that channel alone."
    • addedInput schema / properties / options / properties / bluesky / properties / content
      Added value: +{
      +  "description": "Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content.",
      +  "type": "string"
      +}
    • addedInput schema / properties / options / properties / bluesky / properties / langs / items / description
      Added value: +"One BCP-47 code."
    • addedInput schema / properties / options / properties / bluesky / properties / langs / items / pattern
      Added value: +"^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,8})*$"
    • addedInput schema / properties / options / properties / bluesky / properties / langs / maxItems
      Added value: +3
    • changedInput schema / properties / options / properties / facebook / description
      Previous value: -"Facebook Page settings. Optional — plain text publishes without it."New value: +"Facebook Page settings. Optional: plain text publishes without it."
    • addedInput schema / properties / options / properties / facebook / properties / content
      Added value: +{
      +  "description": "Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content.",
      +  "type": "string"
      +}
    • changedInput schema / properties / options / properties / facebook / properties / contentType / description
      Previous value: -"What kind of post. Defaults to reel for a single video and feed otherwise. A Facebook story is rejected if you send any text — publish the story with no content, and put the words in a feed post instead. A story also takes exactly one image or video and no first comment."New value: +"What kind of post. Defaults to reel for a single video and feed otherwise. A Facebook story is rejected if you send any text: publish the story with no content, and put the words in a feed post instead. A story also takes exactly one image or video and no first comment."
    • changedInput schema / properties / options / properties / facebook / properties / scheduledPublishTime / description
      Previous value: -"ISO 8601 time to publish a feed post later, 10 minutes to 28 days from now. Feed posts only — not reels or stories. Cannot be combined with firstComment (a scheduled post is not live yet, so nothing to comment on)."New value: +"ISO 8601 time to publish a feed post later, 10 minutes to 28 days from now. Feed posts only, not reels or stories. Cannot be combined with firstComment (a scheduled post is not live yet, so nothing to comment on). This is Facebook's own scheduling; for scheduling across channels use scheduledAt on the post."
    • changedInput schema / properties / options / properties / instagram / description
      Previous value: -"Instagram settings. Optional — a plain post with media works without it."New value: +"Instagram settings. Optional: a plain post with media works without it."
    • addedInput schema / properties / options / properties / instagram / properties / collaborators / items / description
      Added value: +"A public professional account's username, without @."
    • addedInput schema / properties / options / properties / instagram / properties / collaborators / maxItems
      Added value: +3
    • addedInput schema / properties / options / properties / instagram / properties / content
      Added value: +{
      +  "description": "Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content.",
      +  "type": "string"
      +}
    • addedInput schema / properties / options / properties / instagram / properties / thumbOffsetMs / minimum
      Added value: +0
    • addedInput schema / properties / options / properties / instagram / properties / userTags / items / description
      Added value: +"One tagged account."
    • addedInput schema / properties / options / properties / instagram / properties / userTags / items / properties / mediaIndex / description
      Added value: +"Which carousel slide, from 0."
    • addedInput schema / properties / options / properties / instagram / properties / userTags / items / properties / username / description
      Added value: +"Username without @."
    • addedInput schema / properties / options / properties / instagram / properties / userTags / items / properties / x / description
      Added value: +"0 to 1 from the left. Photos only."
    • addedInput schema / properties / options / properties / instagram / properties / userTags / items / properties / y / description
      Added value: +"0 to 1 from the top. Photos only."
    • changedInput schema / properties / options / properties / naver_blog / description
      Previous value: -"Naver Blog settings. Required when a target is a Naver Blog account. Naver Blog has no official API: the post is written by the user's browser extension, so it goes out only while that browser is open. list_accounts tells you whether the extension is online; if it is offline the post queues for up to 7 days and you should say so. Write `content` as Markdown: `## ` becomes a section title, `> ` a quotation, `---` a divider. Plain paragraphs become body text. Three directives place things in the body, each alone on its line: `![alt](media:<id>)` an uploaded image, `@video(media:<id>)` an uploaded video, `@card(https://…)` a link card. Put them mid-paragraph and they publish as literal text. Ids you reference this way do not have to repeat in mediaIds, and media you pass but never reference goes at the end."New value: +"Naver Blog settings. Required when a target is a Naver Blog account. Naver Blog has no official API: the post is written by the user's browser extension, so it goes out only while that browser is open. list_accounts tells you whether the extension is online; if it is offline the post queues for up to 7 days and you should say so. Write the body as Markdown: `## ` becomes a section title, `> ` a quotation, `---` a divider. Plain paragraphs become body text. Three directives place things in the body, each alone on its line: `![alt](media:<id>)` an uploaded image, `@video(media:<id>)` an uploaded video, `@card(https://…)` a link card. Put them mid-paragraph and they publish as literal text. Ids you reference this way do not have to repeat in mediaIds, and media you pass but never reference goes at the end. When other channels are in the same post, put the Markdown in options.naver_blog.content so the shared content stays plain text."
    • addedInput schema / properties / options / properties / naver_blog / properties / content
      Added value: +{
      +  "description": "Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content. On Naver Blog this is where the Markdown body goes when the other channels get plain text.",
      +  "type": "string"
      +}
    • changedInput schema / properties / options / properties / naver_blog / properties / draftOnly / description
      Previous value: -"Save as a draft in Naver instead of publishing. The user finishes it by hand."New value: +"Save as a draft in Naver instead of publishing. The user finishes it by hand. Different from draft on the post, which keeps the whole post on uplika."
    • addedInput schema / properties / options / properties / naver_blog / properties / fontSize / maximum
      Added value: +34
    • addedInput schema / properties / options / properties / naver_blog / properties / fontSize / minimum
      Added value: +10
    • changedInput schema / properties / options / properties / naver_blog / properties / scheduledAt / description
      Previous value: -"Schedule the post (ISO 8601, at least 10 minutes from now). The extension sets it in Naver's publish dialog."New value: +"Schedule the post inside Naver (ISO 8601, at least 10 minutes from now). The extension sets it in Naver's publish dialog. For scheduling across channels use scheduledAt on the post instead."
    • addedInput schema / properties / options / properties / naver_blog / properties / tags / items / description
      Added value: +"One tag without # and without spaces."
    • addedInput schema / properties / options / properties / naver_blog / properties / tags / maxItems
      Added value: +30
    • addedInput schema / properties / options / properties / naver_blog / properties / title / maxLength
      Added value: +100
    • addedInput schema / properties / options / properties / telegram
      Added value: +{
      +  "description": "Telegram has no channel-specific settings. Note the caption limit: with media attached the text is capped at 1,024 characters instead of 4,096.",
      +  "properties": {
      +    "content": {
      +      "description": "Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content.",
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / options / properties / threads
      Added value: +{
      +  "description": "Threads settings. Optional.",
      +  "properties": {
      +    "content": {
      +      "description": "Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content.",
      +      "type": "string"
      +    },
      +    "topicTag": {
      +      "description": "One topic to tag the post with, like a category. Threads takes exactly one and rejects periods and ampersands in it. On a thread it goes on the first piece only. Leave it out unless the person asked for a topic.",
      +      "maxLength": 64,
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / options / properties / tiktok / properties / content
      Added value: +{
      +  "description": "Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content.",
      +  "type": "string"
      +}
    • changedInput schema / properties / options / properties / tiktok / properties / title / description
      Previous value: -"Required for a photo post, up to 90 characters. A video post has no title field at all and passing one is rejected; a video's text comes from `content`."New value: +"Required for a photo post, up to 90 characters. A video post has no title field at all and passing one is rejected; a video's text comes from content."
    • addedInput schema / properties / options / properties / tiktok / properties / title / maxLength
      Added value: +90
    • addedInput schema / properties / options / properties / tiktok / properties / videoCoverTimestampMs / minimum
      Added value: +0
    • addedInput schema / properties / options / properties / youtube / properties / content
      Added value: +{
      +  "description": "Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content.",
      +  "type": "string"
      +}
    • changedInput schema / properties / options / properties / youtube / properties / publishAt / description
      Previous value: -"ISO 8601 time to make the video public. Only works with privacyStatus private, and only on a video that was never public."New value: +"ISO 8601 time to make the video public. Only works with privacyStatus private, and only on a video that was never public. This is YouTube's own scheduling; for scheduling across channels use scheduledAt on the post."
    • addedInput schema / properties / options / properties / youtube / properties / tags / items / description
      Added value: +"One search tag."
    • addedInput schema / properties / options / properties / youtube / properties / title / maxLength
      Added value: +100
    • addedInput schema / properties / scheduledAt
      Added value: +{
      +  "description": "ISO 8601 time with a timezone offset (2026-09-20T09:00:00+09:00) to send the post at, on every channel. 10 minutes to 365 days from now. We keep the post as scheduled until then; the person can still change or cancel it.",
      +  "type": "string"
      +}
    • changedInput schema / properties / wait / description
      Previous value: -"Hold the response until the post is really out. Text waits up to 10 seconds, posts with media up to 90 seconds. If it is still going after that you get the usual publishing response and should poll get_post. Defaults to false."New value: +"Hold the response until the post is really out. Text waits up to 10 seconds, posts with media up to 90 seconds. If it is still going after that you get the usual publishing response and should poll get_post. Defaults to false. Ignored with scheduledAt or draft."
  24. Changed2 schema fields changed
    • changedInput schema / properties / options / properties / tiktok / description
      Previous value: -"TikTok settings. privacyLevel is REQUIRED for a normal post and has no default on purpose: TikTok's rules say the person must choose visibility deliberately, so we ask for it instead of guessing. Call get_publish_options first to see which values this account may use right now, whether it can post at all, and its video length limit. TikTok has no text-only posts, cannot mix a video and photos, and has no API for deleting a post or reading comments. While this app is awaiting TikTok's Content Posting audit every post goes out private, which means no link and no metrics come back."New value: +"TikTok settings. privacyLevel is REQUIRED for a normal post and has no default on purpose: TikTok's rules say the person must choose visibility deliberately, so we ask for it instead of guessing. Call get_publish_options first to see which values this account may use right now, whether it can post at all, and its video length limit. TikTok has no text-only posts, cannot mix a video and photos, and has no API for deleting a post or reading comments. While this app is awaiting TikTok's Content Posting audit a direct post can only be SELF_ONLY and comes back with no link and no metrics; if the person wants it public in the meantime, use postMode draft instead."
    • changedInput schema / properties / options / properties / tiktok / properties / postMode / description
      Previous value: -"direct (default) posts to the profile. draft sends it to the creator's TikTok inbox so they finish and post it in the app; then we set no visibility and no link or metrics exist until they publish it."New value: +"direct (default) posts to the profile. draft sends it to the creator's TikTok inbox; they open the notification and finish it in the app, choosing the visibility themselves. While this app awaits the Content Posting audit this is the only way to get something out publicly: a direct post can only be SELF_ONLY, but on this path we send no visibility at all. The trade is that it is not on the profile until the person finishes it, so there is no link and no metrics in the meantime."
  25. Changed1 schema field changed
    • addedInput schema / properties / options / properties / tiktok
      Added value: +{
      +  "description": "TikTok settings. privacyLevel is REQUIRED for a normal post and has no default on purpose: TikTok's rules say the person must choose visibility deliberately, so we ask for it instead of guessing. Call get_publish_options first to see which values this account may use right now, whether it can post at all, and its video length limit. TikTok has no text-only posts, cannot mix a video and photos, and has no API for deleting a post or reading comments. While this app is awaiting TikTok's Content Posting audit every post goes out private, which means no link and no metrics come back.",
      +  "properties": {
      +    "brandContentToggle": {
      +      "description": "Declare paid partnership content (\"Branded Content\"). TikTok does not allow branded content to be private, so this cannot be combined with privacyLevel SELF_ONLY.",
      +      "type": "boolean"
      +    },
      +    "brandOrganicToggle": {
      +      "description": "Declare that the post promotes the creator's own brand (\"Your Brand\"). Leave it out rather than sending false: not declaring and declaring 'no' are different statements.",
      +      "type": "boolean"
      +    },
      +    "disableComment": {
      +      "description": "Turn comments off for this post. Cannot be set to false if the creator disabled comments account-wide.",
      +      "type": "boolean"
      +    },
      +    "disableDuet": {
      +      "description": "Turn duets off for this post. Video posts only.",
      +      "type": "boolean"
      +    },
      +    "disableStitch": {
      +      "description": "Turn stitches off for this post. Video posts only.",
      +      "type": "boolean"
      +    },
      +    "isAigc": {
      +      "description": "Declare that the content was generated by AI. Worth setting when you made the video or images.",
      +      "type": "boolean"
      +    },
      +    "postMode": {
      +      "description": "direct (default) posts to the profile. draft sends it to the creator's TikTok inbox so they finish and post it in the app; then we set no visibility and no link or metrics exist until they publish it.",
      +      "enum": [
      +        "direct",
      +        "draft"
      +      ],
      +      "type": "string"
      +    },
      +    "privacyLevel": {
      +      "description": "Required unless postMode is draft. One of the values that get_publish_options returns for this account, e.g. PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR or SELF_ONLY. The list differs per account, so do not hard-code it.",
      +      "type": "string"
      +    },
      +    "title": {
      +      "description": "Required for a photo post, up to 90 characters. A video post has no title field at all and passing one is rejected; a video's text comes from `content`.",
      +      "type": "string"
      +    },
      +    "videoCoverTimestampMs": {
      +      "description": "Which frame to use as the cover, in milliseconds into the video. TikTok does not accept a cover image file, only a timestamp.",
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
  26. Changed3 schema fields changed
    • changedInput schema / properties / mediaIds / description
      Previous value: -"Media ids from media_presign, each already confirmed with media_complete"New value: +"Media ids from media_presign (confirmed with media_complete), media_from_url or media_upload_link. On Naver Blog you can leave out ids the body already points at with media:<id>; we pick those up from the text."
    • changedInput schema / properties / options / properties / naver_blog / description
      Previous value: -"Naver Blog settings. Required when a target is a Naver Blog account. Naver Blog has no official API: the post is written by the user's browser extension, so it goes out only while that browser is open. list_accounts tells you whether the extension is online; if it is offline the post queues for up to 7 days and you should say so. Write `content` as Markdown: `## ` becomes a section title, `> ` a quotation, `---` a divider, and `![alt](media:<id>)` places an uploaded image at that spot. Plain paragraphs become body text."New value: +"Naver Blog settings. Required when a target is a Naver Blog account. Naver Blog has no official API: the post is written by the user's browser extension, so it goes out only while that browser is open. list_accounts tells you whether the extension is online; if it is offline the post queues for up to 7 days and you should say so. Write `content` as Markdown: `## ` becomes a section title, `> ` a quotation, `---` a divider. Plain paragraphs become body text. Three directives place things in the body, each alone on its line: `![alt](media:<id>)` an uploaded image, `@video(media:<id>)` an uploaded video, `@card(https://…)` a link card. Put them mid-paragraph and they publish as literal text. Ids you reference this way do not have to repeat in mediaIds, and media you pass but never reference goes at the end."
    • changedInput schema / properties / options / properties / naver_blog / required
      Previous value: -[
      -  "title",
      -  "categoryId"
      -]New value: +[
      +  "title"
      +]
  27. Changed2 schema fields changed
    • addedInput schema / properties / options / properties / naver_blog / properties / category
      Added value: +{
      +  "description": "The category name instead of its id, exactly as it appears in naverBlog.categories from list_accounts. If the blog does not have it you get naver_category_unknown with the list to pick from; if the person just created it, call refresh_account first.",
      +  "type": "string"
      +}
    • changedInput schema / properties / options / properties / naver_blog / properties / categoryId / description
      Previous value: -"Required. The id of a category on the connected blog. list_accounts returns them under naverBlog.categories. There is no default; without it Naver files the post under the wrong board."New value: +"The id of a category on the connected blog. list_accounts returns them under naverBlog.categories. Give this or category (the name); there is no default, and without one Naver files the post under the wrong board."
  28. Changed1 schema field changed
    • addedInput schema / properties / options / properties / naver_blog
      Added value: +{
      +  "description": "Naver Blog settings. Required when a target is a Naver Blog account. Naver Blog has no official API: the post is written by the user's browser extension, so it goes out only while that browser is open. list_accounts tells you whether the extension is online; if it is offline the post queues for up to 7 days and you should say so. Write `content` as Markdown: `## ` becomes a section title, `> ` a quotation, `---` a divider, and `![alt](media:<id>)` places an uploaded image at that spot. Plain paragraphs become body text.",
      +  "properties": {
      +    "alignCenter": {
      +      "description": "Center every paragraph and image.",
      +      "type": "boolean"
      +    },
      +    "categoryId": {
      +      "description": "Required. The id of a category on the connected blog. list_accounts returns them under naverBlog.categories. There is no default; without it Naver files the post under the wrong board.",
      +      "type": "string"
      +    },
      +    "draftOnly": {
      +      "description": "Save as a draft in Naver instead of publishing. The user finishes it by hand.",
      +      "type": "boolean"
      +    },
      +    "fontFamily": {
      +      "description": "Body font as Naver's editor font code, e.g. \"nanumbarungothic\", \"nanumgothic\", \"nanummyeongjo\", \"maruburi\". Omit for the editor default.",
      +      "type": "string"
      +    },
      +    "fontSize": {
      +      "description": "Body font size in px, 10-34. Omit for the editor default.",
      +      "type": "number"
      +    },
      +    "openType": {
      +      "description": "Who can see it. public (default), neighbor, mutual (mutual neighbors only), or private.",
      +      "enum": [
      +        "public",
      +        "neighbor",
      +        "mutual",
      +        "private"
      +      ],
      +      "type": "string"
      +    },
      +    "scheduledAt": {
      +      "description": "Schedule the post (ISO 8601, at least 10 minutes from now). The extension sets it in Naver's publish dialog.",
      +      "type": "string"
      +    },
      +    "tags": {
      +      "description": "Up to 30 tags without the # sign and without spaces.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "title": {
      +      "description": "Required. The post title, up to 100 characters.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "title",
      +    "categoryId"
      +  ],
      +  "type": "object"
      +}
  29. Changed1 schema field changed
    • addedInput schema / properties / options / properties / bluesky
      Added value: +{
      +  "description": "Bluesky settings. Optional, but langs is worth setting on every post.",
      +  "properties": {
      +    "langs": {
      +      "description": "The language of the text, 1-3 BCP-47 codes like [\"ko\"] or [\"en\", \"ko\"]. Feed generators filter on this, so without it the post never appears in language-scoped feeds. Bluesky has no post editing, so this cannot be fixed after publishing. Set it to the language the text is actually written in.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
  30. Changed1 schema field changed
    • changedInput schema / properties / options / properties / youtube / properties / privacyStatus / description
      Previous value: -"Defaults to private. Until Google finishes reviewing this app every upload is forced to private no matter what you pass."New value: +"Defaults to private. We pass this through as you set it. Google can still restrict uploads from an API project that is under review, so if the video ends up somewhere else you get a warning on the result saying what YouTube actually applied."
  31. Changed2 schema fields changed
    • addedInput schema / properties / options / properties / facebook
      Added value: +{
      +  "description": "Facebook Page settings. Optional — plain text publishes without it.",
      +  "properties": {
      +    "contentType": {
      +      "description": "What kind of post. Defaults to reel for a single video and feed otherwise. A Facebook story is rejected if you send any text — publish the story with no content, and put the words in a feed post instead. A story also takes exactly one image or video and no first comment.",
      +      "enum": [
      +        "feed",
      +        "story",
      +        "reel"
      +      ],
      +      "type": "string"
      +    },
      +    "firstComment": {
      +      "description": "A comment we post right after publishing. Not on stories, and not on scheduled posts. If it fails the post still goes up, with a warning.",
      +      "type": "string"
      +    },
      +    "link": {
      +      "description": "Makes a link post with a preview card. Cannot be combined with media.",
      +      "type": "string"
      +    },
      +    "scheduledPublishTime": {
      +      "description": "ISO 8601 time to publish a feed post later, 10 minutes to 28 days from now. Feed posts only — not reels or stories. Cannot be combined with firstComment (a scheduled post is not live yet, so nothing to comment on).",
      +      "type": "string"
      +    },
      +    "title": {
      +      "description": "Reel title, separate from the caption.",
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / options / properties / instagram
      Added value: +{
      +  "description": "Instagram settings. Optional — a plain post with media works without it.",
      +  "properties": {
      +    "collaborators": {
      +      "description": "Up to 3 public professional accounts to invite as collaborators. They appear only after accepting. Not on stories.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "contentType": {
      +      "description": "What kind of post. Defaults to reel for a single video and feed otherwise. Stories show no caption and take one image or video.",
      +      "enum": [
      +        "feed",
      +        "story",
      +        "reel"
      +      ],
      +      "type": "string"
      +    },
      +    "coverMediaId": {
      +      "description": "Media id of a JPEG up to 8MB to use as the reel cover. Reels only.",
      +      "type": "string"
      +    },
      +    "firstComment": {
      +      "description": "A comment we post right after publishing, often used for hashtags. Not on stories. If it fails the post still goes up, with a warning.",
      +      "type": "string"
      +    },
      +    "isAiGenerated": {
      +      "description": "Set true to label the media as AI-generated on Instagram.",
      +      "type": "boolean"
      +    },
      +    "shareToFeed": {
      +      "description": "Reels only. false keeps the reel out of the main feed.",
      +      "type": "boolean"
      +    },
      +    "thumbOffsetMs": {
      +      "description": "Reel cover frame in milliseconds. Ignored when coverMediaId is set.",
      +      "type": "number"
      +    },
      +    "userTags": {
      +      "description": "Tag accounts on the media. Photos need x and y between 0 and 1; videos take the username alone. mediaIndex picks the carousel slide.",
      +      "items": {
      +        "properties": {
      +          "mediaIndex": {
      +            "type": "number"
      +          },
      +          "username": {
      +            "type": "string"
      +          },
      +          "x": {
      +            "type": "number"
      +          },
      +          "y": {
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "username"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
  32. Changed2 schema fields changed
    • addedInput schema / properties / options
      Added value: +{
      +  "description": "Per-channel settings. Only the channels you are posting to need an entry.",
      +  "properties": {
      +    "youtube": {
      +      "description": "Required when a YouTube account is in accountIds. The post content becomes the video description.",
      +      "properties": {
      +        "categoryId": {
      +          "description": "YouTube category id. Defaults to 22 (People & Blogs). Leave it out unless the person named a category.",
      +          "type": "string"
      +        },
      +        "containsSyntheticMedia": {
      +          "description": "Set true when the video contains realistic altered or synthetic content, including AI generated footage of real-looking people, places or events.",
      +          "type": "boolean"
      +        },
      +        "madeForKids": {
      +          "description": "Whether this video is directed at children. This is a legal declaration about someone else's channel. Leave it out unless the person tells you, and the channel's own default applies.",
      +          "type": "boolean"
      +        },
      +        "privacyStatus": {
      +          "description": "Defaults to private. Until Google finishes reviewing this app every upload is forced to private no matter what you pass.",
      +          "enum": [
      +            "public",
      +            "unlisted",
      +            "private"
      +          ],
      +          "type": "string"
      +        },
      +        "publishAt": {
      +          "description": "ISO 8601 time to make the video public. Only works with privacyStatus private, and only on a video that was never public.",
      +          "type": "string"
      +        },
      +        "tags": {
      +          "description": "Search tags. 500 characters across all of them; a tag with a space costs two extra for the quotes YouTube adds.",
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "thumbnailMediaId": {
      +          "description": "Media id of a JPEG or PNG up to 2MB to use as the thumbnail. Long-form only: YouTube does not take custom thumbnails on Shorts, and a vertical video of three minutes or less becomes a Short. The channel also has to be verified before YouTube accepts one.",
      +          "type": "string"
      +        },
      +        "title": {
      +          "description": "Video title, up to 100 characters. Required. Cannot contain < or >.",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "title"
      +      ],
      +      "type": "object"
      +    }
      +  },
      +  "type": "object"
      +}
    • changedInput schema / properties / topicTag / description
      Previous value: -"One topic to tag the post with, like a category. Threads takes exactly one and rejects periods and ampersands in it. On a thread it goes on the first piece only. Leave it out unless the person asked for a topic."New value: +"One topic to tag the post with, like a category. Only some channels take one, and those reject periods and ampersands in it. If any channel in accountIds does not take topics the whole call is refused, so publish to it separately. On a thread it goes on the first piece only. Leave it out unless the person asked for a topic."
  33. Changed1 schema field changed
    • addedInput schema / properties / workspaceId
      Added value: +{
      +  "description": "Which workspace this is for. Only needed when the account has more than one — the error tells you the ids when it matters. Leave it out if it is already decided; do not ask the person again.",
      +  "type": "string"
      +}
  34. Changed4 schema fields changed
    • addedInput schema / properties / threadItems
      Added value: +{
      +  "description": "Split a long post into a chain instead of calling publish and then reply. The first item is the root and the rest become replies under it, in order. We handle the ordering and the waiting. Each item obeys the character limit on its own. Pass either content or threadItems, not both. If a later item fails, the ones already up stay up and the response tells you where to resume.",
      +  "items": {
      +    "properties": {
      +      "content": {
      +        "type": "string"
      +      },
      +      "mediaIds": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "content"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / topicTag
      Added value: +{
      +  "description": "One topic to tag the post with, like a category. Threads takes exactly one and rejects periods and ampersands in it. On a thread it goes on the first piece only. Leave it out unless the person asked for a topic.",
      +  "type": "string"
      +}
    • addedInput schema / properties / wait
      Added value: +{
      +  "description": "Hold the response until the post is really out. Text waits up to 10 seconds, posts with media up to 90 seconds. If it is still going after that you get the usual publishing response and should poll get_post. Defaults to false.",
      +  "type": "boolean"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "content",
      -  "accountIds"
      -]New value: +[
      +  "accountIds"
      +]
  35. First observed

TDQS

Score is being calculated.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources