Skip to main content
Publishing is two calls: build the post, then send it. They are separate on purpose — the split is where a human fits, if you want one.
1

Create the post

The post is created at pending_review. Nothing is public yet — it shows up in the studio’s review queue like any other post.channels defaults to that creator’s connected channels, so most calls need only account_id, asset_ids and caption. The format (photo, carousel or video) is derived from the media and validated against every target platform before the post is written — a carousel that a platform cannot take is a 400, not a failed publish an hour later.
2

Send it

3

Watch it land

The review gate

POST /v1/clips/{id}/publish is the only call in this API that reaches a real audience, and it is not undoable. Treat it the way you would treat a deploy to production.
The states a post moves through:
Three rules hold regardless of who is calling:
  • A post enters at pending_review. The API cannot create one in any other state.
  • scheduled is reachable only from pending_review. Asking to publish an already published post is a 400 that says so.
  • published is written only after the platform confirms. If the hand-off fails, the post stays scheduled with the reason recorded, and you can retry — it is never falsely marked live.
Want a human in the loop? Create posts and never call publish. They queue up in the studio’s review screen, where an operator approves them exactly as they would a post the platform generated. The API gives you the operator’s authority; it does not force you to use it.
Every publish writes an audit entry naming the API key that triggered it, so “who posted this?” always has an answer.

Requirements

Channels are connected in the studio, per creator. A creator with none gets a 400 telling you so — the API cannot connect accounts on your behalf.
Use asset ids from a succeeded generation, or from a completed upload. An asset that is still uploading is rejected.
One video, or up to ten stills for a carousel. Platform-specific carousel limits are checked at creation.

From the CLI

crl posts create alone leaves the post in review. --publish now|schedule|queue chains the second call. Publishing from a terminal asks for confirmation; pass --yes in scripts.