Save drafts. Nothing is sent: schedule_post or publish_post does that.
One account: `text` + `account_id`; `variants` adds up to 3 alternative
versions for that account, each its own draft. Several accounts: `posts`,
one entry per draft, each with its own copy. Entries on different
accounts are one post with a version per account (sent together with
`post_ids`); entries repeating an account are separate posts. The result carries `characterCount` /
`characterLimit` (`overLimit` when the text cannot publish), and, when
they apply: `mediaRequired` (TikTok and YouTube need a video, Instagram
and Pinterest an image or video), `derivedTitle` (YouTube takes the first
100 characters unless `platform_options.title` is set), `settingsRequired`
(TikTok's audience is chosen by the user at `settingsUrl`),
`pinterestBoard`, and `similarRecent`: this account's posts from the last
30 days that read nearly the same, which the user hears about before it
goes out (no need to list posts to check for duplicates).
Args:
text: Post copy. @handle links by itself on X, Threads, Instagram (max 20 per caption), TikTok, YouTube, Bluesky (full handle, e.g. @name.bsky.social), Mastodon (@name on the same server, @name@server elsewhere) and Telegram channels; on Facebook, Pinterest, Discord, Google Business Profile and Slack it stays plain text; on LinkedIn it links only with `user_tags`.
account_id: Social-account id (from list_social_accounts), not a platform name.
hashtags: Appended to the text as #tags, counted in its limit (YouTube: video tags). A list or comma/space-separated string.
goal: e.g. "Educate", "Engage", "Promote", "Entertain".
scheduled_for: ISO 8601. Proposes a time on the draft; only schedule_post schedules. `proposedTimeConflict` in the result means the account's daily cap refuses that time; propose its `nextFreeAt`.
campaign_id: The `campaignId` of a post made with `posts`: this draft becomes one more account's version of it.
user_tags: LinkedIn company: [{company: "<its LinkedIn Page URL>"}] with "@<Company name>" in the text; Antwork finds the Page and links its exact name. LinkedIn people can't be looked up, only the user's own connected accounts. Instagram people on the media: [{username, platform: "instagram", type: "photo_tag", x, y (0-1 from left/top), mediaIndex (carousel photo, 0-based)}]; a photo needs x/y (centre if omitted), a reel takes the username only, a story either. Tagged accounts must be public; `recentTags` in get_post_context lists handles tagged before. The result's `tagChecks` shows each handle as found on Instagram or `unchecked` (personal accounts can't be looked up; still taggable).
pinterest_board_id: Pinterest only, from `boards` in get_post_context. Omitted = the account's first board.
slack_channel: Slack only: a channel id or #name from `slackChannels` in get_post_context. Omitted = the account's last channel (`defaultSlackChannel`); with none the post cannot publish.
platform_options: Only what the user asked for. Instagram: publishType ("timeline" | "story"; a reel is "timeline" with a video), postToGrid, coverUrl (a Reel's cover image, https). Facebook: publishType ("timeline" | "story"; a story is one photo or one video, its text is not shown). Pinterest: pinTitle (≤100), link (the pin's destination URL, https). YouTube: privacyStatus ("public" | "unlisted" | "private"), title (≤100), categoryId (e.g. "22", "28"), madeForKids, containsSyntheticMedia (realistic content made or altered with AI), thumbnailUrl (custom thumbnail, JPEG/PNG under 2 MB, https; needs a phone-verified channel). TikTok settings are set by the user at `settingsUrl`, not here.
variants: Up to 3 alternative versions for the same account.
workspace_id: Workspace ID or name. Optional if user has only one workspace.
media_urls: Media for the draft (every draft, with `posts`): library URLs, or public https links to a file, fetched into the library first as add_media(url=...) does. Saves the add_media call when moving posts in from another tool.
posts: Several drafts in one call, instead of `text` + `account_id`: `[{"account_id": str, "text": str}]`, each entry optionally with `hashtags`, `goal`, `user_tags`, `pinterest_board_id`, `slack_channel`, `platform_options`. Each account's copy is written in its own voice; there is no shared body.