Skip to content

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) when post_by !== 0.
  • variations — optional array of per-channel overrides for caption, media, link.

The endpoint requires authentication, an attached workspace, an active subscription, and clears a quota check before persisting.

Delivery modes (post_by)

ValueMeaning
0Publish immediately — time_posts ignored.
1Schedule with repost (recurrence support — see Scheduling).
2Specific days and times — multiple slots in time_posts.
3Save 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)

ValueState
0Draft
1Pending (in queue)
2Publishing
3Published
4Failed

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.