Skip to main content
Zero runtime dependencies, Node 20+. Grammar is always crl <command> <subcommand>.

The three-line version

Commands

generate aliases gen, creators aliases accounts, clips aliases posts.

Global flags

Both spellings of every flag work. --aspect-ratio and --aspect_ratio are the same flag. Model parameters are snake_case and CLI convention is kebab-case; guessing wrong should not be a failure mode.

The model’s flags are the model’s schema

crl gen create fetches the model’s schema first, then interprets the remaining flags against it. The CLI hardcodes no model parameters, so a new model works the day it ships:
A wrong flag tells you the fix:
crl models get <id> prints the whole schema: each input’s modality and cap, each parameter’s allowed values or numeric bounds, what opaque values like caption styles mean, whether a prompt is required, and the model’s take length.

Media flags take a path or an id

--image ./face.png uploads the file and uses it. --image <asset-id> reuses an existing asset. --image https://… passes the URL through. No separate upload step — though crl upload <file> exists when you want to pin an id. Prompts can come from stdin:

Run flags that are not model parameters

Price a source-billed run with its media. lipsync, motion-control, scene-video, change-voice and short-clip are billed per second of the source. crl gen cost passes along any asset id, URL or --source-url you give it and prints the length it billed, so the quote matches the charge.

Pick a creator once

Every later gen create and posts create runs as that creator. --account-id overrides it for one command.

Post flags

crl posts create builds a post; --publish now|schedule|queue chains the send. The format follows the media — one video is a video, two or more stills are a carousel — so most posts need only --asset and --caption.
--draft, --made-with-ai, --device and --device-only are switches. The bare flag turns one on, and --device true and --device=true say the same thing. Leaving a switch off sends nothing at all rather than an explicit false.
Phone posting is enabled per workspace, on request, and the creator has to be bound to a device in the studio. Without both, --device and --device-only come back as an error saying which one is missing. --device cannot be combined with --draft: the phone posts directly and has no draft inbox. See Publishing for the detail.
crl posts publish asks for confirmation on a terminal when it would go live; a draft handoff says so instead of warning about a public post. Pass --yes in scripts.

Scripting and agents

Results go to stdout, progress and errors to stderr, so pipes stay clean:
With --wait, crl gen create prints the media URL. Without it, the generation id. Parallel fan-out is just shell job control — --wait blocks per process:
Exit codes: 0 success · 1 usage or runtime error · 2 not authenticated · 3 out of credits.

Configuration

Precedence: flags → environment → config file. CI wants the environment variable — there is no interactive login there.