Tools, not models
You address a tool (ugc-video, text-to-photo, lipsync), and the platform picks
the right model and pipeline. Pass model only when you specifically want to override it.
Read the catalog, don’t hardcode it.
GET /v1/models returns every tool, every
model, and the exact inputs and parameters each accepts. When we add a model, your code
can use it without a change on your side. Narrow with ?tool=ugc-video or
?model=<id>.Video
ugc-video · short-clip · scene-video · motion-control · hook-captionsPhoto
text-to-photo · photo-editAudio
text-to-speech · lipsync · change-voice · add-audio · dialogueGenerating as a creator
Passaccount_id and the run inherits that creator’s look, voice and persona, and the
output lands on their wall in the studio. Without it, the run is workspace-scoped and
generic.
account_id does two things you can override:
boolean
default:"true"
The creator’s avatar is added to the model’s character slot, which is what keeps their
face consistent across runs. Set it to
false when the output must not contain them
— a product shot posted on their account, a scene they are not in.string
Any
voice parameter (voice_id, voice_a, voice_b) defaults to that creator’s own
cloned voice, the same one the studio pins. Pass one explicitly to use a different voice.Voices
Three tools speak:text-to-speech, dialogue and change-voice. Their voice parameters
carry control: "voice" in the catalog and take an id from:
?scope=library searches the public shared library instead of your own and cloned voices,
and takes ?gender= and ?language=. A creator’s cloned voice is on their account as
voice_id.
Inputs and parameters
object
Slot key → asset id(s) or public
https URL(s). A URL is adopted as an asset
automatically, so there is no upload step when your media is already on the internet.
Which slots a model takes — and which are required — is in its catalog entry.object
Model parameters like
aspect_ratio, duration, resolution. Validated against the
model’s schema.Working from a video link
A tool whose catalog entry carriesaccepts_source_url (today short-clip) takes a video
link instead of an uploaded file. Pass source_url or the source asset in
inputs, never both — and one of them is required, so a run cannot be charged for a
source that was never there.
Modes that need a second input
Some parameters unlock an input rather than a value. Seedance’sstoryboard scene mode is
the one to know: "reference" (the default) shoots from your character and reference
images, while "storyboard" analyses a source video into a storyboard sheet, casts
your creator into it, and reshoots it — so it needs inputs.source_video too.
Uploading your own media
Bytes never pass through the API. Three steps, and the asset id is usable the moment thePUT succeeds:
1
Ask for a presigned upload
POST /v1/uploads with content_type and size_bytes. You get upload_url,
headers and the asset_id it will become.2
PUT the bytes
Straight to storage, with the headers you were given.
3
Complete it
POST /v1/uploads/{id}/complete. This starts thumbnailing and transcoding, and hands
you the finished asset. A video or audio upload is also probed here, so the asset
comes back with its real duration_sec and ratio — which is what lets a
source-billed run be priced correctly. The probe reads a few KB over range requests,
not the whole file.--image ./face.png just works.
Cost
read keys, and priced by the same function that performs the
debit — so an estimate cannot disagree with the charge. Credits are taken at kick-off;
a run that terminally fails, including a moderation rejection, is refunded
automatically.
Polling
GET /v1/generations/{id} every few seconds. On succeeded, output[] holds the
assets:
failed, error carries the reason — a moderation rejection reads differently from a
provider failure — and your credits are already back.
Next
Publish it
Turn finished media into a post on your creator’s social accounts.
Full reference
Every field, with a live playground.