Prepare variants
prepare_variants, 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
Prepare variants of a video from one of its runs (sourceRunId, get_video's run): each keeps that run's accepted stages through keptThrough and remakes the rest with its own direction. Nothing is spent until it is confirmed. 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.
apiKeyheader
AuthorizationBearer <token>An API key (prb_…) from Settings → Connections.
application/json- body
videoId*stringMatch
^([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)$Format
uuidsourceRunId*stringMatch
^([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)$Format
uuidkeptThrough*stringValue in
"research""copy""voiceover""images""clips"variants*array<>Items
1 <= items <= 10The tool's answer.
application/json- response
videoId*stringMatch
^([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)$Format
uuidconfirmationId*stringMatch
^([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)$Format
uuidexpiresAt*stringpreview*||||||confirmUrl*|nullcurl -X POST 'https://studio.probably.co/api/v1/tools/prepare_variants' \ -H "Authorization: Bearer $PROBABLY_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "videoId": "9c3d5e2f-8a14-4b67-b0d9-6e1f2a3c4d5e", "sourceRunId": "6f7a8b9c-0d1e-4f2a-9b4c-5d6e7f809102", "keptThrough": "copy", "variants": [ { "name": "Gym", "direction": "Shot at a gym, the same script" }, { "name": "Beach", "direction": "Shot on a beach run at sunrise" } ]}'{ "videoId": "9c3d5e2f-8a14-4b67-b0d9-6e1f2a3c4d5e", "confirmationId": "e7a1b2c3-d4e5-4f60-8172-93a4b5c6d7e8", "expiresAt": "2026-10-25T09:15:00.000Z", "preview": { "kind": "variants", "count": 2, "availableCredits": 1840, "quote": { "priceCredits": 1234, "mostCredits": 3234, "pricingVersion": "2026-10-26.1", "lines": [ { "line": "stills", "credits": 288 }, { "line": "voice", "credits": 56 }, { "line": "clips", "credits": 716 }, { "line": "finish", "credits": 174 } ], "corrections": { "rounds": [ { "line": "stills", "credits": 30 }, { "line": "voice", "credits": 25 }, { "line": "clips", "credits": 270 }, { "line": "finish", "credits": 25 } ], "maxRoundsPerStage": 3, "maxRounds": 10, "maxCredits": 2000 } }, "estimatedCredits": null, "sandbox": false }, "confirmUrl": null}