Create and schedule a post. Provide the text, the target accountIds (from list_accounts), and an ISO-8601 scheduledTime (UTC, e.g. 2026-07-23T09:00:00.000Z; a past time publishes within a minute). The text and hashtags are copied into each selected account's own platform fields (x_text, facebook_description, …) with a content type derived from the media; that per-account copy is what publishes. Override any account via platformSpecificContent, e.g. {"<accountId>": {"x_text": "..."}}; prefixes x_, linkedin_, bluesky_, threads_, facebook_, tiktok_, youtube_, instagram_, pinterest_, googlebusiness_, mastodon_, telegram_, discord_, slack_, devto_, hashnode_, reddit_, dribbble_, tumblr_, whop_, twitch_, kick_, lemmy_, nostr_, listmonk_, ghost_, pixelfed_, wordpress_. What you set is kept; only gaps are filled. TikTok needs tiktok_privacyStatus (PUBLIC_TO_EVERYONE, FOLLOWER_OF_CREATOR, MUTUAL_FOLLOW_FRIENDS, SELF_ONLY); TikTok's rules make it the creator's own choice, and without it the call is refused. Exception: a video on a TikTok Business account may pass null (the account's own setting); a narrower one is refused unless the account can keep it. YouTube needs youtube_title (at most 100 characters, no < or >) and youtube_privacyStatus (public, unlisted or private), both the user's own: ask the user for each. Schedchie never makes a title up from the text and never picks a visibility, so without either the call is refused. MEDIA: `media` takes the descriptors upload_media returns, one per file (or their "uploads/…" names). Every file goes to every account; a video descriptor may carry a `cover` (see that field). Refused here, by account name: text+hashtags over that platform's caption limit (X 280, Bluesky 300, Threads 500); a file count no platform shape allows; media-less Instagram/TikTok/YouTube/Pinterest; Pinterest without pinterest_boardId (lookup_platform_options, kind pinterest_boards). Sizes, ratios, durations (IG Story video: 60 s max; facebook_contentType "story": 1 image or 1 video, 60 s max) are checked by the publish pipeline. Each call is a new post; one left unanswered hands out the idempotencyKey to repeat it with. A member who needs approval gets the post held as pending_approval. Plain X posts are included under fair use, per X account. A post whose text contains a link uses 10 credits, and before the first paid month every X post uses credits. Call get_x_usage before scheduling X posts with links or many X posts: a post that will not go out on X is saved, and the result's `warnings` carry x_fair_use_reached, x_starts_with_plan, x_link_needs_credits or x_needs_credits. AI-content labels, true|false per account: youtube_containsSyntheticMedia (YouTube's "altered or synthetic content" disclosure), instagram_is_ai_generated (Instagram's AI info label, every content type), x_made_with_ai (X's made-with-AI disclosure) and tiktok_is_aigc (TikTok's AI-generated label). They disclose realistic content made or altered with AI. tiktok_is_aigc labels VIDEO posts only: TikTok has no AI label for photo posts, so it is ignored there and the result's notes say so. Threads has no AI label in its API. A Discord account is one connected channel, and the post goes to that channel: discord_text with up to 2000 characters including hashtags, up to 10 files at 20 MiB each and 25 MiB in all. discord_options: threadName (a forum channel's post title, up to 100 characters; the text's first line otherwise), silent (true sends it without a notification), allowMentions (true lets the text ping; off otherwise), poll ({question up to 300 characters, answers: 2-10 up to 55 characters each, durationHours 1-768, allowMultiselect}, sent only with discord_contentType "POLL" and no files). A Slack account is one channel in a workspace, and the post goes to that channel as the Schedchie app: slack_text with up to 4000 characters including hashtags, up to 10 files at 1 GB each with the text as their message. slack_options: unfurlLinks (false posts links without a preview; on otherwise). Dev.to and Hashnode publish articles. Each needs its title: devto_title (up to 128 characters) or hashnode_title (up to 250); Schedchie never takes one from the text. The text is the article body in markdown, up to 100000 characters, sent as written except that single line breaks are kept as line breaks (plain markdown would join the two lines). hashtags become the article's tags (devto_tags, hashnode_tags) and are never added to the body: Dev.to takes up to 4, letters and digits only, each up to 30 characters (lowercased at publish, so Next.js becomes nextjs), Hashnode up to 5. The first image is the cover: at most 1 image, no video. Dev.to also takes devto_description (a short summary of the article), devto_canonical_url (the http(s) address where it first appeared) and devto_series (the name of the series it belongs to). Hashnode also takes hashnode_subtitle (up to 250 characters, shown under the title) and hashnode_canonical_url. A Hashnode account is one blog, and Hashnode publishes through its API only on a Pro blog. A WordPress account is one site (list_accounts gives wordpressKind and wordpressSiteUrl), and the post goes out there as a published post at the scheduled time: wordpress_title (optional, up to 300 characters; the text's first line otherwise, cut at a word near 100 characters when longer), wordpress_text sent as HTML (blank lines make paragraphs, line breaks stay, bare links become links), wordpress_hashtags become tags and are never added to the body, wordpress_categories and wordpress_tags take names (matched to the site's own, created when missing; up to 20 each, hashtags counted with the tags), wordpress_excerpt (up to 1000 characters), and up to 10 images, no video: the first is the featured image, the rest follow the text. A Reddit account is one Reddit user. Each post goes to ONE subreddit, named in reddit_subreddit without r/; a second subreddit is a separate post (another call), never one call sending a link to many subreddits. reddit_title is required (up to 300 characters). reddit_contentType: TEXT (body in reddit_text, up to 40000 characters including hashtags), LINK (reddit_url, no files), IMAGE (one image) or VIDEO (one video); the body goes out on TEXT posts only. reddit_flair_id and reddit_flair_text (text only where the flair is editable): a subreddit may require flair, and the publish is refused without it. reddit_nsfw, reddit_spoiler, reddit_sendreplies (true|false), reddit_first_comment (up to 10000 characters, posted by the same user under the post). A Dribbble account is one Dribbble user; a team is a per-post choice: dribbble_teamId, the id of one of the account's dribbbleTeams in list_accounts, posts the shot to that team, and without it the shot goes out as the user. A shot needs dribbble_title, its title; Schedchie never takes one from the text. The text is the shot's description, plain text up to 10000 characters, and hashtags become its tags (dribbble_tags, up to 12 once a leading # is dropped and a repeat in any case counts once), never added to the description. dribbble_lowProfile true asks Dribbble to mark the shot low profile; accounts without Dribbble Pro have been seen to ignore it. A shot is exactly 1 image: GIF, JPG or PNG of exactly 800x600 or 400x300 pixels and at most 8 MB, no video. It is never resized, so crop it to 800x600 first. Each shot is scheduled on its own with schedule_post; schedule_posts refuses Dribbble. A Tumblr account is one blog: tumblr_text up to 40960 characters including tags (sent as text blocks of 4096), tumblr_hashtags as Tumblr tags (no #, spaces allowed, no commas), up to 30 images or one video (never both), tumblr_alt_texts with one alt text per image in media order. tumblr_options: state ("published", the default, or "draft" to save it as a draft on the blog), sourceUrl (an http or https URL). Tumblr does not allow the same post on several blogs, so each blog needs its own text. A Whop account is one Whop company you own or administer; a post goes to one of its forums, named by whop_options.experienceId (the forum's exp_ id, required; no forum is the default: copy it from an earlier post to that forum via get_post, or pick the forum in the Schedchie composer). whop_text is the body, in Markdown, up to 50000 characters including hashtags; up to 10 images or videos; a body or a file is needed. whop_options: title (optional headline, up to 255 characters), pinned (true pins it to the top of the forum), forumName (display only). whop_first_comment is posted as a reply under the post. A Twitch account is one channel: the broadcaster who connected it. twitch_contentType "CHAT" (the default) sends twitch_text as a chat message in the channel, "ANNOUNCEMENT" as an announcement in its chat, and "SCHEDULE" adds a stream to the channel's schedule. twitch_text takes up to 500 characters including hashtags; on a SCHEDULE post it is the stream's title, optional, up to 140 characters, hashtags not added. twitch_options: announcementColor for an announcement (primary, blue, green, orange, purple; primary, the channel's own accent colour, is the default). A SCHEDULE post needs scheduleStartTime (RFC 3339, after the post's scheduledTime; a start already past at publish is refused then), scheduleTimezone (an IANA name such as Europe/Bratislava) and scheduleDurationMinutes (a whole number from 30 to 1380); scheduleRecurring true repeats it every week, and a one-time stream needs an affiliate or partner channel; scheduleCategoryId (the category's Twitch id) or scheduleCategoryName (matched by name, ignoring case, when it publishes) sets its category. Text only: Twitch refuses a post with files. A Kick account is one channel: the broadcaster who connected it. kick_text goes out as a chat message in the channel, up to 500 characters including hashtags, counted as a reader sees them (an emoji is one), and at most 2,048 bytes of UTF-8. Text only: Kick refuses a post with files. A Lemmy account is one user on one instance; the community is chosen per post in lemmy_community: its name (technology) for one on the account's own instance, or name@instance (technology@lemmy.world); !name@instance and an https://instance/c/name link work too. lemmy_title is required (3 to 200 characters). lemmy_text is the Markdown body, up to 50000 characters including hashtags. lemmy_url makes it a link post and one image an image post (no video, never a link and an image together); lemmy_contentType (TEXT, LINK or IMAGE) follows from them. lemmy_nsfw (true|false); lemmy_first_comment (up to 10000 characters) is posted by the same user under the post. Each post goes to ONE community: a second community is a separate post (another call). A Nostr account is one npub, connected through the user's own remote signer (NIP-46). Schedchie never holds the private key: every note is signed by that signer at publish time, so it must be online then; if it is not, the post fails and can be retried. A post is a kind 1 text note, up to 8,000 characters, links inline. No images or video. A first comment is posted as a reply note. A Listmonk account is one self-hosted listmonk instance. Each post is one email campaign to the lists in listmonk_listIds (ids from list_accounts), with listmonk_subject as the subject; it is started at the scheduled time and mails every subscriber of those lists once. listmonk_subject is required, up to 200 characters. listmonk_listIds is required: 1 to 20 ids from the account's listmonkLists. listmonk_text is the body, up to 100000 characters; without it the text is used. listmonk_format is markdown (the default, sent as written) or richtext (blank lines make paragraphs, bare links become links). Hashtags are never put into the email. Up to 10 images, no video; they go after the text. The instance's default template and from address are used. A Ghost account is one Ghost site (5.0 or later, self-hosted or Ghost(Pro); list_accounts gives ghostSiteUrl and ghostNewsletters), and the post is published there at the scheduled time: ghost_title (optional, up to 255 characters; the text's first line otherwise; a post needs a title or text), ghost_text sent as HTML (blank lines make paragraphs, line breaks stay, bare links become links), ghost_excerpt (up to 300 characters), ghost_tags take names (matched to the site's own, created when missing) and ghost_hashtags become tags too, never added to the body: up to 20 in all, each up to 191 characters. ghost_visibility is public (the default), members (members only) or paid (paying members only). Up to 10 images, no video: the first is the feature image, the rest follow the text. ghost_newsletter (a slug from ghostNewsletters) also emails the post to that newsletter's members: ghost_emailSegment picks who gets it (all, the default; status:free; status:-free), and ghost_emailOnly true mails it without putting it on the site; both need ghost_newsletter. A newsletter is sent once and never resent, and deleting the post on the site never unsends the email. A Pixelfed account is one user on one Pixelfed server (name@host). A post is photos or a video with a caption: one photo, one video, or an album of several, up to the server's limit (20 files on pixelfed.social, often fewer elsewhere). Text-only posts are refused: every Pixelfed post needs at least one photo or video. pixelfed_text is the caption, up to 2000 characters including hashtags on pixelfed.social; each server sets its own limits and refuses past them. pixelfed_visibility is public (the default), unlisted or private (followers only). pixelfed_sensitive (true|false) puts the media behind a warning, and pixelfed_spoiler_text (up to 140 characters) is the warning's text, sent only with pixelfed_sensitive true. pixelfed_comments_disabled (true|false) turns comments off. pixelfed_alt_text, or pixelfed_alt_texts with one per file, describes the media. pixelfed_first_comment (up to 2000 characters on pixelfed.social) is posted by the same user as a reply under the post, and is refused when comments are off. pixelfed_contentType (PHOTO, ALBUM or VIDEO) follows from the files. Publish options, per account, alongside that platform's other fields: instagram (beta): instagram_first_comment (text posted as a comment on the new post the moment it publishes. Skipped for instagram_contentType "STORY" (an Instagram story has no comment edge). Needs instagram_business_manage_comments (instagram_manage_comments on a Facebook-connected account) on the account's connection: without it the comment is skipped and the post still publishes); instagram_audio_name (REEL only: names the reel's original audio (the sound already in the uploaded video). Instagram allows exactly one rename per audio. Ignored when instagram_audio_id is set: attached music replaces the original audio); instagram_audio_id (REEL only: an audio_id from lookup_platform_options (kind instagram_audio); the reel publishes with that song attached. Facebook-connected Instagram accounts only: on an account connected with Instagram sign-in the post is refused (400) with the fix. A song Instagram no longer offers at publish time is left off and the reel publishes without it, reported as a partial publish. Refused on any other content type); instagram_audio_title (display-only carry of the chosen track's title, so the composer can re-show the choice); instagram_audio_artist (display-only carry of the chosen track's artist); instagram_audio_volume (0-100: the attached track's volume (default 100). Only meaningful with instagram_audio_id); instagram_video_volume (0-100: the video's own sound level under an attached track; 0 mutes it. Only meaningful with instagram_audio_id); instagram_trial_reel (REEL only: true publishes a TRIAL reel: Instagram shows it to non-followers first and promotes it to everyone automatically once it performs (graduation strategy SS_PERFORMANCE). The same test a creator would run by hand in the app. Instagram only offers it to accounts with at least 1,000 followers; below that the reel publishes as a regular reel and the publish is reported as partial with that reason); instagram_collaborators (up to 3 Instagram usernames, comma-separated (with or without @), invited as collaborators on a feed image, reel or carousel; the post appears on their profile once they accept. Not for instagram_contentType "STORY". A username Instagram cannot resolve is dropped (reported as a publish step) rather than failing the post); instagram_user_tags (BETA. up to 20 Instagram usernames, comma-separated (with or without @), tagged on the media as people tags (clickable). Works on instagram_contentType "STORY", "POST", "REEL" and "CAROUSEL" (tagged on every carousel item). Only PUBLIC Instagram accounts can be tagged. No positions: feed images get default spots, stories and reels tag by username. If Instagram refuses the tags the post publishes without them (reported as a publish step) rather than failing) | tiktok (beta, except tiktok_first_comment): tiktok_title (PHOTO posts only: a title published with the photos, up to 90 characters (never shortened). TikTok videos have no title; their caption is the text); tiktok_auto_add_music (photo posts only: when true TikTok automatically adds recommended music to the published photos. The track is TikTok's pick; tiktok_music_id chooses one instead); tiktok_music_id (video or photo: an id from lookup_platform_options (kind tiktok_music); the post publishes with that track. Only for accounts whose get_tiktok_creator_info says musicSelectable, and not on a Followers/Friends/Only me video (refused with the fix)); tiktok_music_title (display-only carry of the chosen track's title); tiktok_music_artist (display-only carry of the chosen track's artist); tiktok_music_cover (display-only carry of the chosen track's coverUrl); tiktok_music_volume (VIDEO only, 0-100: the track's volume (default 100)); tiktok_original_volume (VIDEO only, 0-100: the video's own sound under the track; 0 mutes it (default 100)); tiktok_music_start_ms (VIDEO only: ms into the track where it starts (default 0)); tiktok_upload_to_draft (video or photo: true sends the post to the account's TikTok app inbox as a draft instead of publishing it; the creator finishes and posts it in the TikTok app. A draft carries no music, and a video draft no caption. Its publishResults entry then carries inboxFallback and draft: delivered, not published); tiktok_first_comment (text posted as the account's own comment on the new post once TikTok makes it public, up to 1,200 characters. Public posts only: never on Followers/Friends/Only me, an inbox draft, or with comments turned off. Needs the account's TikTok Business connection with the comment permission; without it the post publishes and the comment is skipped with that reason) | facebook (beta): facebook_first_comment (text posted as the Page, as a comment on the new post, the moment it publishes. Skipped for facebook_contentType "story" (a Page story has no comments). Needs pages_manage_engagement on the account's connection: without it the comment is skipped and the post still publishes) | threads: threads_reply_control (who may reply: one of everyone | accounts_you_follow | mentioned_only | parent_post_author_only | followers_only, LOWERCASE (Threads hands this back UPPERCASE when a post is read, and refuses that same value on the way in). Threads accepts it only when the post is created, never afterwards. Omit the field to keep the account's own Threads setting); threads_location_id (a Threads place id, published as the post's location: an `id` from lookup_platform_options (kind threads_locations) (schedchie:library) or one the user supplies; place ids are Threads' own and cannot be derived from a name); threads_location_name (the label Schedchie displays for that place. Display only: it is never sent to Threads, which offers no way to read a published post's location back); threads_crossreshare_to_ig (true|false: also share the Thread to Instagram as a STORY, not a feed post. It needs a linked Instagram account; without one Threads refuses it and the cross-post is dropped so the Thread still publishes on its own); threads_enable_reply_approvals (true|false: hold replies for approval: every reply to the Thread stays hidden from everyone else until it is approved or ignored in the Schedchie dashboard, in the post's Comments tab (Live view)); threads_first_comment (text posted as the account's own reply on the new Thread the moment it publishes, up to 500 characters. Needs threads_manage_replies: an account connected before 2026-10-18 skips it until reconnected. On a post that went out as a thread it replies to the last part); threads_thread (true|false: a threads_text over 500 characters goes out as a thread: the first part is the post with its media, each next part a reply to the one before, split between paragraphs, then sentences, then words, at most 20 parts and 9,000 characters. On unless false (false refuses a text over 500). true also splits at lines holding only ---. Needs threads_manage_replies: an account connected before 2026-10-18 must reconnect first, or a long post fails before anything is published); threads_thread_numbering (true|false: when a post goes out as a thread, end each part with its number, as 1/3. Off unless true) | youtube: youtube_first_comment (text posted as the channel's own comment on the new video right after it uploads, up to 10,000 characters. Skipped on a private or made-for-kids video, and on a channel that must reconnect to allow comments, until it is reconnected) | linkedin: linkedin_first_comment (text posted as the account's own comment on the new post the moment it publishes, up to 1,250 characters) | bluesky: bluesky_first_comment (text posted as the account's own reply in the new post's thread the moment it publishes, up to 300 characters, counted as Bluesky counts a post) | mastodon: mastodon_first_comment (text posted as the account's own reply to the new status the moment it publishes, up to the instance's character limit (500 on mastodon.social)) | slack: slack_first_comment (text posted as the Schedchie app's reply in the new message's thread the moment it publishes. Skipped on a file post when Slack does not return the message in time; the post's publish steps then say so) | whop: whop_first_comment (text posted as the account's own reply under the new forum post the moment it publishes, up to 50,000 characters) | nostr: nostr_first_comment (text posted as the account's own reply note to the new note the moment it publishes, signed by the same remote signer, up to 8,000 characters). Some need a permission the connected account may not have been granted; an ungranted option is dropped at publish with the reason logged, and the rest of the post still goes out. Invalid values are refused here by account name.