Guides
Schedule a post
Drafts, scheduling to several platforms, choosing accounts, editing and deleting.
Draft or scheduled
POST /posts without scheduledDatetime saves a draft. With a future scheduledDatetime (ISO 8601, ideally with a Z or offset) it is scheduled: one row per platform is queued and published at that time. Nothing is ever published immediately by the API.
{
"caption": "New feature: scheduled posts from your terminal.",
"platforms": ["x", "bluesky", { "platform": "linkedin", "accountId": "0b5f2c1a-..." }],
"scheduledDatetime": "2030-01-15T09:00:00Z",
"tags": ["launch"]
}
A platform given as a plain string uses the most recently connected account of that platform. Pass an object with accountId (from GET /accounts) to choose a specific one.
Rules worth knowing
- The caption must fit each platform (limits). A platform that rejects a post reports a plain-language error in
GET /posts/:id/results. - Instagram, YouTube and Pinterest need an image or video: attach one with
mediaId(upload media). - Blog platforms (Dev.to, Hashnode, WordPress) take articles, not short posts: pass
options.blog.titleand a markdown caption. Do not mix blog and social platforms in one post. - Accounts that need reconnecting are rejected with
needs_reconnectrather than failing later. - Your plan's monthly scheduling limit applies.
GET /usageshows how much is left.
Edit, reschedule, schedule a draft
PATCH /posts/:id changes the caption, title, tags or time. Sending scheduledDatetime for a draft schedules it (optionally with platforms). A scheduled post can be edited until about 90 seconds before it publishes; after that, or once any platform has started, the API answers 409 not_editable.
Delete
DELETE /posts/:id removes a draft or a scheduled post that has not started publishing. Published posts must be deleted on the platform itself.
First comment
options.first_comment posts a reply right after the post goes live (for example the link, so the post itself stays clean). It works on X, Mastodon, Bluesky and Reddit; on other platforms it is skipped. The outcome is in GET /posts/:id/results as first_comment (posted, failed or unsupported). A failed first comment never affects the post itself.