Creating and scheduling posts
Drafts, scheduled times, the queue, per-account captions and options, editing and deleting.
A post has one caption, its media, and one target per account it goes to. Each target picks a content type that its account supports, and can change the caption, media and options for that account.
{ "caption": "Grand opening Sabtu ini! 🎉", "mediaIds": ["m_1", "m_2"], "targets": [ { "socialAccountId": "acc_ig", "contentType": "ig_carousel", "options": { "firstComment": "#bali #grandopening" } }, { "socialAccountId": "acc_th", "contentType": "th_carousel", "captionOverride": "Grand opening Sabtu ini, mampir ya!" }, { "socialAccountId": "acc_tt", "contentType": "tt_photo", "options": { "tiktok": { "privacyLevel": "PUBLIC_TO_EVERYONE" } } } ], "tagIds": ["tag_promo"], "action": "schedule", "scheduledAt": "2026-11-07T10:00:00+08:00"}Actions
Section titled “Actions”action |
What happens |
|---|---|
draft |
Saved, nothing publishes. Pre-flight doesn’t run, so a draft can be incomplete. Add scheduledAt to show it on the calendar. |
schedule |
Checked, then published at scheduledAt. |
now |
Checked, then published right away. |
submit |
Saved as a draft waiting for the owner’s approval. See Approvals. |
Check a post without saving it with POST /posts/validate: same body, action optional. It
returns every account’s errors and warnings.
Send ISO 8601 with an offset or Z, such as 2026-11-07T10:00:00+08:00. A time without an offset is rejected, so there’s no guessing
about time zones. GET /me returns the workspace’s time zone, which the calendar and queue use.
Queue slots
Section titled “Queue slots”Set weekly posting times in the calendar menu under Queue slots, or with PUT /queue. Send "useNextSlot": true instead of scheduledAt and PostFlow
picks the next free slot (at least 10 minutes ahead, and not within 30 minutes of another post). GET /queue/next shows that slot first.
Options per account
Section titled “Options per account”| Option | For |
|---|---|
firstComment |
A comment posted right after the post (hashtags, links). Instagram, Facebook, Threads. |
followUps |
Up to 5 comments, or a Threads thread, each delayMinutes after the one before. |
link |
Link posts on Facebook. |
shareToFeed |
Instagram Reels: also show in the feed. |
instagram.collaborators |
Up to 3 usernames to invite as collaborators. |
tiktok.privacyLevel |
Who can see it, e.g. PUBLIC_TO_EVERYONE, SELF_ONLY. Plus disableComment, disableDuet, disableStitch, brandContent, brandOrganic. |
youtube.title, privacy, madeForKids, tags, categoryId, thumbnailMediaId |
YouTube uploads. |
cover.offsetMs / cover.mediaId |
Video cover from a moment in the video or an image, where the platform allows it. |
Repeating posts
Section titled “Repeating posts”repeatDays publishes the post again every 1, 2, 3, 7, 14 or 30 days. null stops it.
Editing
Section titled “Editing”PUT /posts/{id} replaces the post: send every field, as when creating. Accounts it already published to are kept as they are.
Send the version you read as expectedVersion and you’ll get 409 CONFLICT instead of overwriting a change someone made in the app.
To change only the time, use POST /posts/{id}/reschedule with { "scheduledAt": "…" }.
To publish a draft or scheduled post right away, use POST /posts/{id}/publish.
Deleting
Section titled “Deleting”DELETE /posts/{id} removes the post from PostFlow. Anything already live on a platform stays there. A post that’s publishing at that
moment returns 409; try again a minute later. POST /posts/delete deletes up to 50 at once and
reports the ones it skipped.
Seeing what’s planned
Section titled “Seeing what’s planned”GET /calendar?from=…&to=…: every post in a range of up to 92 days, plus the queue slots still free.GET /posts?status=…:scheduled,published,failed,attentionordrafts, filtered byaccountIdortagId. See Post statuses.
TikTok
Section titled “TikTok”Before posting to a personal TikTok account, read its settings with
GET /accounts/{id}/tiktok-creator-info and pick options.tiktok.privacyLevel
from privacyLevelOptions. TikTok requires the creator to choose it; there’s no default. See TikTok.