Create a post
create_postCreate a post and either publish it now, schedule it, queue it, or save it as a draft. action "now" — and a schedule less than 15 minutes ahead, which is a publish under another name — does NOT publish by itself: the post is saved as a draft that waits for the user, who confirms it with the Publish button on the post card or on Ravenpost (the result says where), and nothing goes out until they do. A schedule further ahead, and the posting queue, go out at their time with no further step. Once it goes out the post is public on the selected networks, and that cannot be undone from here: delete_post removes only Ravenpost's copy, and a post on Instagram, TikTok, Threads and YouTube cannot be taken down through Ravenpost at all. Only a draft stays private. Each call creates a new post, so never repeat a call that succeeded — one waiting for the user's confirmation included. With more than one workspace, ASK THE USER which one to post to and give workspaceId — the connected accounts differ per workspace and posting to the wrong one is not undoable. Accounts, media and queue slots must all come from that same workspace. action="queue" schedules at the workspace's next free posting-queue slot (see list_queue_slots) — no scheduledAt needed; it errors if the workspace has no slots defined. Targets are account ids from list_accounts (cross-posting to several is allowed — but one X account per post: every X account publishes the same text, and X forbids the same post on several accounts). Caption limit is the tightest selected account — each account's captionMax in list_accounts. X's depends on the account: 280 characters, or 25,000 with X Premium, counted as X counts (every link is 23, each emoji or symbol such as → − • … is 2); a caption over it is rejected, naming the account. X refuses two more things a caption can hold, and so does this tool, before anything is written: more than one $cashtag in a post (each reply of a thread is a post of its own — write other tickers without the $), and, in a thread reply, an @mention of anybody the first post did not mention. For media, first upload with upload_media and pass the returned media ids. type is Instagram’s format model (IMAGE/CAROUSEL/REEL/STORY) reused as the shared vocabulary. Instagram honors all four, and Instagram video must be posted as REEL (or STORY) — an IMAGE/CAROUSEL post with a video will be rejected at publish time. Facebook honors STORY (published to Page Stories, which have NO caption — the text is dropped) and treats every other type as a normal feed post. TikTok, X, and Telegram ignore type entirely. See platform_limits.formats for which types each platform honors. thread: extra posts published as replies after the main one, forming a chain. Supported on X, Bluesky, Mastodon, Threads, Telegram and Discord; a platform without a thread model publishes just the caption. The caption is post 1 and carries the media. Limits come from the strictest selected platform (X is tightest at 280 chars per post, or 25,000 for an account on X Premium, and 25 follow-ups) and going over is rejected, not truncated. replyTo (X only): reply to an existing tweet — pass the tweet id or its URL (x.com//status/) and the post is published as a reply under it instead of a standalone tweet (a thread then continues under that reply). X takes a reply from an app only when the post it answers is the account's own, or @mentions the account, or quotes one of its posts; a reply to anybody else's post fails at publish time. Non-X targets ignore it and publish a normal post, so for a pure reply target only the X account. quote (X only): quote-tweet an existing tweet — pass the tweet id or its URL and it is embedded as a card under this post. X takes it on the same terms as a reply: the account's own post, or one that @mentions it — quoting anybody else's post fails at publish time. Can be combined with replyTo. Non-X targets ignore it. Telegram renders a markdown subset in captions (text links, bold, italic, code, strikethrough) as native formatting; every other platform publishes the caption as plain text, so markdown would show literally there — only use it when all targets are Telegram (see platform_limits.captionFormatting). Threads takes text-only posts, one image/video, or a carousel of up to 20 items, and ignores type. Its 500-character limit is the tightest after X, so a mixed X+Threads selection is still capped at 280 (unless the X account has X Premium). LinkedIn publishes the caption as plain text — its reserved characters are escaped for you, so write normal prose; markdown is not rendered and a bare link does NOT produce a preview card. LinkedIn ignores type, allows text-only posts, and takes either one video or up to 20 images. audio attaches a track from Instagram’s catalog to a reel (find one with list_audio). It applies only to type="REEL" on Instagram accounts connected via Facebook — other platforms and other types ignore it, and the worker logs that it was dropped rather than failing. TikTok and Facebook have NO music API at all: for them the audio has to already be part of the video file. reelCover and trialReel are an Instagram reel’s own options: its cover (a library JPEG, or a frame of the video) and a trial — a reel shown to non-followers first. Both apply only to type="REEL" on Instagram, on either connection; anywhere else they are dropped. firstComment is posted as a comment on the Instagram post right after it goes out — Instagram only and never on a STORY; every other network ignores it, and the result warns when it reaches none of the selected accounts. tiktok carries TikTok’s required per-post choices, keyed by account id — most importantly privacyLevel, which TikTok makes mandatory. Leave it out and TikTok targets publish privately. Pinterest needs a board: set board (a board name or an id from list_boards) whenever a Pinterest account is targeted — a pin belongs to a board and there is no default, so without it the post is created but fails to publish. link is the pin’s destination URL, which is the point of a pin, and title is its headline (the caption becomes the description, max 800 chars).
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>",
"accountIds": "<accountIds>",
"action": "<action>"
},
"name": "create_post"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| link | No | The URL this post points at. Facebook publishes it as a link preview card (used when the post has no media); Pinterest makes it the pin's destination, which is the whole point of a pin. Every other platform ignores it. Empty string clears it. | |
| type | No | Instagram format; defaults to IMAGE | |
| audio | No | Instagram reel audio — a catalog track from list_audio. Requires type="REEL" and an Instagram account connected via Facebook; ignored otherwise. | |
| board | No | Pinterest only, and REQUIRED for a Pinterest target: the board this pin goes to — its name (matched case-insensitively) or its id from list_boards. Pinterest has no default board, so a Pinterest post without one fails at publish time. Other platforms ignore it. | |
| quote | No | X quote: tweet id or tweet URL to quote — embedded as a card under this post; combinable with replyTo. X only takes it when that post is the account's own or @mentions it (X targets only; other platforms ignore it) | |
| title | No | Pinterest only: the pin title (max 100 chars), which Pinterest shows above the description. Defaults to the caption’s first line. Other platforms ignore it. | |
| action | Yes | now = publish once the user confirms it (on the post card or on Ravenpost); schedule = at scheduledAt (less than 15 minutes ahead waits for their confirmation too); queue = the next free posting-queue slot; draft = save it, unpublished | |
| thread | No | Thread: follow-up posts replied in order after the caption (X, Bluesky, Mastodon, Threads, Telegram, Discord; limits come from the strictest selected platform — at most 25 entries, each ≤280 chars on X, or 25,000 on X Premium) | |
| tiktok | No | TikTok posting options, keyed by TikTok account id. Omit and TikTok targets publish privately (SELF_ONLY) — TikTok requires the creator to choose a visibility per post, so nothing wider is assumed on their behalf. | |
| caption | Yes | The post caption / text body | |
| replyTo | No | X reply: tweet id or tweet URL to reply to — the post publishes as a reply under that tweet instead of a standalone tweet. X only takes it when that post is the account's own or @mentions it (X targets only; other platforms ignore it) | |
| hashtags | No | Hashtags to append to the caption (with or without a leading #) | |
| mediaIds | No | Ordered media asset ids (from upload_media) | |
| timezone | No | IANA timezone for the schedule | |
| community | No | X only: post into a Community — its id or URL (x.com/i/communities/<id>). Empty string clears it. | |
| reelCover | No | Instagram reel cover — an image OR a frame of the video, not both. Only for type="REEL" on an Instagram account, either connection; other types and platforms ignore it and it is dropped there. Leave it out for Instagram’s default, the first frame. | |
| trialReel | No | Instagram trial reel: shown to non-followers first, and to followers only once it graduates — MANUAL means the user graduates it by hand in the Instagram app, SS_PERFORMANCE that Instagram graduates it if it performs well. Only for type="REEL" on an Instagram account; other types and platforms ignore it. Instagram decides which accounts may post one (public professional accounts it can recommend) and answers only when the reel is published: if it refuses, the post fails — it is never sent as a normal reel instead. Set it only when the user asks for a trial. | |
| accountIds | Yes | Target social account ids (from list_accounts) | |
| scheduledAt | No | ISO 8601 datetime — required when action is "schedule" | |
| workspaceId | No | Which workspace to act in — an id from list_workspaces. Optional with a single workspace; REQUIRED once there are several, where guessing would mean posting one client's content to another client's accounts. Ask the user which one before publishing. | |
| firstComment | No | Instagram only: a comment posted on the Instagram post from the same account right after it goes out — hashtags, or a link the caption should not carry. Feed posts, carousels and reels only: Instagram takes no comment on a STORY, and no other network gets one, so anything X, Threads, LinkedIn or the others should carry belongs in their caption. If Instagram refuses the comment, the post stays published without it and nothing reports that afterwards. preview_post takes the same argument and warns where it would not be posted. | |
| collaborators | No | Instagram only: co-author usernames (max 3). They get an invite, and once they accept the post appears on their profile too. Feed posts and reels only — never a STORY — and ONLY on an Instagram account whose connection is "FACEBOOK_LOGIN" (see list_accounts). On any other Instagram account they are dropped: the post still publishes, without them, and nothing reports it afterwards — so do not promise the user co-authors without checking. preview_post takes the same argument and warns when they would be dropped. | |
| replySettings | No | X only: who may reply to this post. Omit for X's default (everyone). |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| ok | No | ||
| post | No | ||
| preview | No | ||
| awaitingConfirmation | No |