Composer Overview
The composer is the entry point for every post. It opens from /app/publishing (the Schedules tab), the dashboard quick-action, or any campaign or label detail page. A single submission targets one or many channels and the backend fans out at publish time.
Request shape
Submitting the composer issues a POST /api/v1/posts. The validated body fields:
accounts— array of channel IDs (min 1).caption— string, min 1 character.link— optional URL appended to the caption.media— array of Files Library asset IDs (optional).type—"text"or"media".labels— array of label IDs (optional).campaign— optional campaign ID.post_by— integer 0–3 (delivery mode, see below).time_posts— array of ISO-8601 timestamps (one per channel) whenpost_by !== 0.variations— optional array of per-channel overrides forcaption,media,link.
The endpoint requires authentication, an attached workspace, an active subscription, and clears a quota check before persisting.
Delivery modes (post_by)
| Value | Meaning |
|---|---|
0 | Publish immediately — time_posts ignored. |
1 | Schedule with repost (recurrence support — see Scheduling). |
2 | Specific days and times — multiple slots in time_posts. |
3 | Save as draft. |
Scheduled timestamps must be at least 1 minute in the future; the API rejects past-dated schedules with a 400.
Lifecycle states (status)
| Value | State |
|---|---|
0 | Draft |
1 | Pending (in queue) |
2 | Publishing |
3 | Published |
4 | Failed |
A post in failed state surfaces the platform's error message inline; you can edit and retry from the same composer.
Multi-channel fan-out
One POST /api/v1/posts request can target many channels. The backend treats each channel as a fan-out leg at publish time — one channel's failure never affects another's. Use the variations array to override caption / media / link per channel when the platforms have different conventions (e.g. shorter copy on X, hashtags on Instagram).
Approval flow
Posts have an approval_status field (draft, pending_review, approved, rejected). Editors with the Submit for review action call POST /api/v1/posts/:id/submit-review to send a draft into pending_review. Admins approve from the same page; rejected posts land back in drafts with reviewer comments.