Editor
POST
/videos/{id}/scenes/{sceneId}/image

Generates a new still for this scene and attaches it. Charges one image generation. Pass prompt to use a different description for this run; it is saved as the scene's imagePrompt. Without it the scene's stored imagePrompt is used, and a scene with neither is a 400.

The scene's rendered clip and the stitched video are cleared, since both are now stale.

UGC videos (subType: ugc) reuse one character image across every scene, so a per-scene regeneration does not apply and is refused with 409 warning-invalid-input.

Authorization

bearerAuth
AuthorizationBearer <token>

An API key created under Settings > API & Webhooks. Keys start with sf_live_.

In: header

Path Parameters

id*string
sceneId*string

The scene's id, as returned in the scenes array.

Header Parameters

Idempotency-Key?string

Unique key per action (a UUID works well). Reusing it replays the first response instead of running the action again, so a retry after a timeout can never generate, render, publish or charge twice.

Lengthlength <= 255

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/videos/string/scenes/string/image" \  -H "Content-Type: application/json" \  -d '{    "prompt": "A founder closing a laptop at dawn, soft window light, shot on 35mm"  }'
{  "data": {    "id": "n1a2b3",    "imagePrompt": "A founder closing a laptop at dawn, soft window light, shot on 35mm",    "animationPrompt": "Slow push in, dust in the light",    "narration": "Most founders do not burn out from working too much.",    "voiceDescription": "Calm, low, unhurried",    "duration": 6,    "status": "DRAFT",    "imageUrl": "https://cdn.shortfast.com/uploads/scenes/n1a2b3-2.jpg",    "videoUrl": null  }}

Redraw one B-roll's image POST

Draws a new image for this B-roll in the video's style and attaches it, like "Describe this scene" in the editor. Pass `prompt` to say what the scene should show: it is saved as the B-roll's `prompt`. Without it the image is drawn again from the stored `prompt`, or from the line of script the B-roll covers. This charges one AI image (`GET /reference/credit-costs`), so send an `Idempotency-Key` when retrying. A refused or failed drawing leaves the B-roll as it was. Only videos whose `imageStyle` draws every scene can redraw one: `realistic` or a fixed art style, without `animateBRolls`. On `mixed`, `stock_footage` and `animated` videos a still would replace footage or a clip, so they are refused with `409` `warning-invalid-input`, as is a B-roll carrying a talking presenter. The rendered video keeps the old image until it is rendered again.

Replace the b-roll segments PUT

Replaces the whole b-roll timeline. Send a bare JSON array or wrap it as `{ "bRolls": [ ... ] }`. Only the brief fields travel on the wire: `id`, `startMs`, `endMs`, `text`, `prompt`, `keywords` and `mediaType`. The resolved media (the chosen file, its quality variants) and the editor styling (animation, transition, layout, scale, sound effect) are read-only, and are carried over from the stored segment with the same `id`. A segment whose id is unknown is new and starts with no media. Cap: 500 segments per request. Changing what a segment should show does not re-fetch its media on its own: requeue generation with `addBRolls: true` for that.