publish_scheduled
Schedule a post for future publishing. PREFERRED tool when the user is interacting with you in chat -- skips the Socialync drafts page. If the user has switched on the publish confirmation dialog in Socialync settings (off by default) and their client supports MCP elicitation, Socialync shows the user a confirmation dialog with the exact post and time before it enters the queue: a decline rejects it and comes back as success false with consent "declined" (never retry; ask the user), and no answer within 40 seconds counts as the confirmation the user already gave you in chat. On other clients there is NO dialog: once you call this, the post enters the scheduled queue and will publish automatically at scheduledFor. Either way, before calling, show the user the caption, platforms, media, and the scheduled time, and get their explicit confirmation in chat. Media options: base64Images (user uploaded images to you in chat), imageUrls (public https), videoUrl (ONE public https video URL -- Socialync copies it into its own storage at call time), or mediaId (media already in Socialync, from list_media -- use for "the video I uploaded"). YouTube allowed for VIDEO posts only (and needs title). TikTok takes one video or a photo post of images (a swipeable photo carousel). Returns scheduled post IDs. Same validation as schedule_post_draft. 10/day cap per profile per publish day (UTC date of scheduledFor). ALWAYS run validate_post with these same arguments FIRST and resolve every error it reports before calling this.
Tool call template
Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {
"caption": "<caption>",
"scheduledFor": "<scheduledFor>"
},
"name": "publish_scheduled"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Post title. REQUIRED when youtube is in platforms (it becomes the YouTube video title). | |
| caption | Yes | Post caption/text content. | |
| mediaId | No | Reference to media already in Socialync, from list_media (e.g. "upload:abc123"). Use this when the user uploaded their video/images in the Socialync app. Mutually exclusive with imageUrls/base64Images/videoUrl. Video mediaIds work on ALL platforms including TikTok and YouTube; image mediaIds work everywhere except YouTube. | |
| videoUrl | No | One publicly fetchable https video URL (max 512MB). Socialync copies it into its own storage when you call this tool, so the link only has to work right now (an expiring export link is fine); a link that is already dead fails the call. Large videos take a while to copy; for files you generated yourself prefer create_media_upload + mediaId. No base64 video (if the user attached a video file in chat, have them upload it at socialync.io and use mediaId instead). Mutually exclusive with imageUrls/base64Images/mediaId. Each platform enforces its own format/duration/size limits at publish time (e.g. Bluesky ~60s, X free tier ~2:20). | |
| imageUrls | No | Up to 10 publicly fetchable https image URLs. Socialync copies them into its own storage when you call this tool, so the links only have to work right now. Combined with base64Images cannot exceed 10 total. Mutually exclusive with videoUrl/mediaId. | |
| platforms | No | Platforms to schedule. Any of: facebook, instagram, tiktok, youtube, linkedin, twitter, threads, bluesky. YouTube requires a video (mediaId or videoUrl) and a title. TikTok requires a video or images. Pass platforms OR audienceId, not both. | |
| profileId | No | The Socialync profile to post from. Call list_profiles to see the profiles you can post to. Required only when this connection is authorized for more than one profile; if exactly one is authorized it is used automatically. | |
| audienceId | No | A saved audience id from list_audiences. Expands to the platforms that audience reaches on the target profile; any member it cannot reach (other brand, needs reconnect, secondary account without its primary) is reported back in skippedMembers instead of failing the call. Use INSTEAD of platforms, never together. | |
| base64Images | No | Up to 10 images as base64 strings (data URIs accepted). Use when the user uploaded image(s) to you -- Socialync hosts them so they stay reachable at publish time. Per-image cap: 8MB. Combined with imageUrls cannot exceed 10 total. Mutually exclusive with videoUrl/mediaId. | |
| firstComment | No | Optional "first comment": text Socialync posts as a comment under the post right after it publishes -- the classic home for hashtags and links, keeps the caption clean. One string for all platforms. Supported: instagram, threads, twitter, youtube, linkedin, bluesky. Facebook and TikTok do not support it (they record it as skipped; the post itself is unaffected). Per-platform comment length limits are enforced at draft time: instagram 2200, threads 500, twitter 280, youtube 10000, linkedin 1250, bluesky 300. A failed comment never fails the post. | |
| scheduledFor | Yes | ISO 8601 UTC datetime for when to publish (e.g. 2026-04-15T14:00:00Z). Must be in the future. | |
| exceptPlatforms | No | Only valid together with audienceId: platforms to leave out of the expanded audience for this one post (e.g. exclude tiktok when the post has no video). | |
| instagramTrialReel | No | Optional. Post the Instagram leg of this VIDEO post as an Instagram Trial Reel, shown only to non-followers. MANUAL: stays a trial until the user shares it with followers in the Instagram app. AUTO: Instagram shares it with followers automatically if it performs well. Omit for a regular Reel. One video only: images, carousels and Stories cannot be trial reels. Sharing a trial with followers cannot be done through the API, so never tell the user it will happen for them on MANUAL. An Instagram-only trial reel uses its own daily allowance (10 per UTC day per profile), separate from regular posts, so a trial reel plus a regular post of the same video later does not halve the regular allowance. Same as platformSpecificSettings.instagram = { trialReel: true, graduationStrategy: "MANUAL" | "AUTO" }. | |
| tiktokPrivacyLevel | No | Required when tiktok is in platforms. Who can view the TikTok post (video or photos): PUBLIC_TO_EVERYONE (Everyone), MUTUAL_FOLLOW_FRIENDS (Friends), FOLLOWER_OF_CREATOR (Followers, private TikTok accounts only) or SELF_ONLY (Only me). TikTok requires this to be the user's own choice with no preset value: ask the user and pass their answer. One answer covers every TikTok post the user asks for together (for example "schedule all five, everyone can view"), so ask once per batch, not once per post. Never pick a level yourself or carry one over from posts the user did not say it applies to. When you ask, also tell them: "By posting, you agree to TikTok's Music Usage Confirmation" (https://www.tiktok.com/legal/page/global/music-usage-confirmation/en). Same as platformSpecificSettings.tiktok.privacyLevel. | |
| platformSpecificSettings | No | Per-platform settings keyed by platform. Caption overrides: { "<platform>": { "customCaption": "..." } }. Instagram Trial Reel: { "instagram": { "trialReel": true, "graduationStrategy": "MANUAL" | "AUTO" } } (or use instagramTrialReel). TikTok: { "tiktok": { "privacyLevel": "PUBLIC_TO_EVERYONE" | "MUTUAL_FOLLOW_FRIENDS" | "FOLLOWER_OF_CREATOR" | "SELF_ONLY" } } is required for every TikTok post and must be the user's own choice (or use tiktokPrivacyLevel). TikTok interaction settings default to allowed; pass { "tiktok": { "allowComments": false, "allowDuets": false, "allowStitching": false } } to turn any of them off. TikTok commercial content: { "tiktok": { "brandContent": true } } labels it "Promotional content" (the creator's own business); { "tiktok": { "brandedContent": true } } labels it "Paid partnership" (a third party). A paid partnership cannot be SELF_ONLY. AI label: { "<platform>": { "aiGenerated": true } } on tiktok, youtube or instagram shows that platform's AI-generated label (TikTok video only). Set it when the user says the media was made or substantially changed with AI. YouTube: { "youtube": { "isPrivate": true } } uploads as private; { "youtube": { "isKidsContent": true } } marks it made for kids. Threads topic: { "threads": { "topicTag": "Book Club" } } files the post under that topic (one per post, up to 50 characters, no periods or ampersands). |