Probably
Docs

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
/api/v1/tools/prepare_variants

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.

Authorization

apiKey
headerAuthorizationBearer <token>

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

Request Body

application/json
  1. body
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
sourceRunId*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
keptThrough*string
Value in"research""copy""voiceover""images""clips"
variants*array<>
Items1 <= items <= 10

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/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}