save_draft
Save text you already have as a new draft, word for word, with no AI. Use when the user provides explicit text they want saved. If YOU wrote the copy rather than the user, call get_brand_voice first and match it (or use draft_post instead): nothing on this path applies the user's voice or the workspace's brand for you. IMPORTANT: This tool ONLY saves. Do NOT call queue_post or schedule_post unless explicitly asked. For YouTube, the post must have a video attached (via images with a video MIME type) before it can be scheduled or published. When saving a post that belongs to someone else on the workspace (for example moving a teammate's posts in), pass their name as author so it is filed under them. Pass tags to label the post the way it was labelled in the tool it came from. When the workspace has more than one account on a platform (two LinkedIn profiles, a profile and a company page), pass platform_account_ids so the draft publishes from the right one; it is kept on the draft and used when it is scheduled, queued or published. Pass first_comment to have a comment posted under the post once it is live (LinkedIn, Facebook, Instagram), or first_comments for several, each from its own profile. To give one channel different text (an X version of a LinkedIn post), pass channel_copies on the same post; don't save a second post. Pass penciled_at to pencil it in at a date and time. Drafts never post. A penciled time only holds the slot.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Tag names for the post, as they appear on the Content page (e.g. ["Launch", "Case study"]). Matched to the workspace's existing tags ignoring case; a name that doesn't exist yet is created if the user may manage tags, otherwise nothing is saved and the reply lists the tags that exist. | |
| author | No | Optional: whose post this is. A teammate's name, or 'me'. Omit to save it as yours. Only people who can see everyone's posts may save as someone else. | |
| images | No | Images, a video, or one PDF to attach. For ANY image beyond a thumbnail, call upload_image FIRST to get a presigned S3 URL, upload via the returned curl command, then pass the s3_key here. Inline `data` is only for tiny images (≤50 KB); `file_path` is dev-only. A PDF posts as a LinkedIn document (a swipeable carousel): LinkedIn only, one per post, never alongside images or video. | |
| content | Yes | The post content to save | |
| youtube | No | YouTube-specific options. Required platform inputs: a video must be attached via `images` (the upload tool accepts video MIME types). If `title` is omitted, it is derived from the first line of content (truncated to 100 chars). | |
| platforms | No | Target platforms. Instagram needs an image or video on the post: upload one with `upload_image` (or make one with `generate_image`) and pass its s3_key in `images`. | |
| penciled_at | No | Optional: pencil the draft in at a date and time, ISO 8601 (e.g. '2026-10-20T09:00'; no offset means the workspace's posting zone). Drafts never post. A penciled time only holds the slot. It stays a draft: nothing is scheduled or queued, and the queue skips that slot. A date with no time is refused. schedule_post with no `scheduled_at` books it at that time. | |
| first_comment | No | Optional: a comment DemandBird posts under the post, from the same profile, once the post is live (often a link or a call to action kept out of the post itself). LinkedIn, Facebook and Instagram only here. Stored verbatim. Pass {"text": ""} to remove it. Omit to leave it as it is. | |
| channel_copies | No | Optional: a channel's own text, keyed by platform, e.g. {"twitter": "..."} for an X version of a LinkedIn post. That text publishes on that channel instead of the shared `content`; every other channel keeps what it had. Stored verbatim. A channel named here is added to the post's platforms. Pass "" for a channel to remove its copy (it then publishes the shared content). Use this, never a second post, to give one channel different text. | |
| first_comments | No | Optional: up to 5 comments DemandBird posts under the post once it is live, in order, each on its own delay and, if `comment_as` is set, from its own profile or page (a teammate adding their thoughts). Replaces every first comment on the platforms it covers; [] removes them all. Stored verbatim. Use this or `first_comment`, not both. Omit to leave the comments as they are. | |
| platform_account_ids | No | Optional map of platform => connected_account_id (numeric id from `list_connected_accounts`): which account each platform publishes from. Example: {"linkedin": 42}. A platform named here is added to `platforms`. Each id must be a channel of this workspace and match the platform, or nothing is saved. |