Probably
Docs

Prepare a clip

generate_clip, in Changes: A connection or key that may make changes. None spends credits; prepare_* and stage tools (research, brainstorm, write_script, review, generate_clip, voice, storyboard) prepare paid work for confirm_spend.

POST
/api/v1/tools/generate_clip

Prepare one clip of your scene on the studio's video routes: your prompt as written, optionally starting from a still or made from up to 9 reference images of the library, and saying a line on camera. The clip critics judge it against the brief, the scene and the line; if they ask for changes it is remade once with their requests. The line is voiced by the video model and isn't checked against what's heard. A clip with references that a route refuses on safety grounds goes to the next route that can make it, at the same price. route: test runs on a cheaper, lower-quality model for testing an integration. It runs on a video of the Space (videoId, using that video's brief) or on a new draft made from brief, never both. Charged by its seconds at its route's rate, held for the clip and one remake, plus up to 55 credits for the critics: the preview's clip shows the take's price, what it usually comes to without a remake, and the cap, and the docs' pricing page lists the rates. A refused or failed take is charged nothing. On a connection made with raw generation it is made raw: no critics and no remake, held and charged for its units alone (the preview says raw); pass raw: false for the reviewed path. Read it with get_stage, which links to the clip. Show the person the preview. If the connection may spend, call confirm_spend with the confirmationId once they agree; otherwise send them the confirmUrl to confirm it in the studio. It expires in 15 minutes. Pass a new requestKey; repeating one returns the same confirmation.

Authorization

apiKey
headerAuthorizationBearer <token>

An API key (prb_…) from Settings → Connections.

Request Body

application/json
  1. body
spaceId*string
Match^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
Formatuuid
videoId?string

A video of the Space to run on, with its current brief. Don't pass brief, name or attachments with it

Match^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
Formatuuid
brief?string

The brief for a new draft video, when no videoId is given

Length10 <= length <= 20000
name?string
Length1 <= length <= 120
attachments?array<||>
Itemsitems <= 45
requestKey*string
Match^[\w.:-]+$
Length8 <= length <= 64
prompt*string

The scene as the clip should show it, sent as written: who, where, what happens, and the camera

Length1 <= length <= 4000
still?

A ready image version of the library (list_assets) the clip starts from, as its first frame

references?array<>

Up to 9 ready image versions of the library the clip is made from (people, products, places); with a still, the still is the first of them

Itemsitems <= 9
Default[]
line?string

What the person says on camera, in the clip's own voice

Length1 <= length <= 300
format?string
Default"portrait"
Value in"portrait""square""landscape"
resolution?string
Default"480p"
Value in"480p""720p""1080p"
durationSeconds?integer

How long the clip runs, 4 to 15 whole seconds

Range4 <= value <= 15
Default5
route?string

standard (Seedance 2.5), or test: Seedance 2.0 Mini, a cheaper, lower-quality model for testing an integration, 480p and 720p only

Default"standard"
Value in"standard""test"
raw?boolean

Whether it is made raw (no critics, no remake, charged for its units alone). Defaults to how the connection was made; false asks a raw connection for the reviewed path. Only a connection made with raw generation may pass true

Response Body

The tool's answer.

application/json
  1. response
videoId*string
Match^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
Formatuuid
confirmationId*string
Match^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
Formatuuid
expiresAt*string
preview*||||||
confirmUrl*|null
curl -X POST 'https://studio.probably.co/api/v1/tools/generate_clip' \  -H "Authorization: Bearer $PROBABLY_API_KEY" \  -H 'Content-Type: application/json' \  -d '{  "spaceId": "5b0e7c1a-3f52-4d8e-9a61-2c4f8e9d7b30",  "videoId": "9c3d5e2f-8a14-4b67-b0d9-6e1f2a3c4d5e",  "attachments": [],  "requestKey": "clip-trailguard-1",  "prompt": "A trail runner at a trailhead at sunrise rubs sunscreen on her cheek and grins at the camera, handheld selfie, natural light",  "still": {    "assetId": "8e9f0a1b-2c3d-4e5f-8a6b-7c8d9e0f1a2b",    "versionId": "9f0a1b2c-3d4e-4f5a-9b7c-8d9e0f1a2b3c"  },  "references": [],  "line": "Mile six and still no sting.",  "format": "portrait",  "resolution": "480p",  "durationSeconds": 5,  "route": "standard"}'
{  "videoId": "9c3d5e2f-8a14-4b67-b0d9-6e1f2a3c4d5e",  "confirmationId": "e7a1b2c3-d4e5-4f60-8172-93a4b5c6d7e8",  "expiresAt": "2026-10-25T09:15:00.000Z",  "preview": {    "kind": "stage",    "stage": "generate_clip",    "capCredits": 280,    "availableCredits": 1840,    "fits": true,    "clip": {      "seconds": 5,      "takeCredits": 112.5,      "takes": 2,      "reviewCapCredits": 55,      "withoutRemakeCredits": 167.5    },    "voice": null,    "raw": false,    "storyboard": null,    "sandbox": false  },  "confirmUrl": null}