# Wan 2.2 Reframe — API Reference Model ID: `model_wan-2-2-vace-fun-a14b-reframe` --- ## Authentication - **API_KEY** and **API_SECRET** are found in your [Scenario Project Settings](https://app.scenario.com/team&tab=project_api_keys) under API Keys. - Set them as environment variables `SCENARIO_SDK_API_KEY` and `SCENARIO_SDK_API_SECRET` — both SDKs pick them up by default. - For raw HTTP (cURL), use Basic Auth: `Authorization: Basic base64(":")`. ### Install the SDK - JavaScript / TypeScript: `npm install @scenario-labs/sdk` - Python: `pip install scenario-sdk` --- ## Generate **Endpoint:** `POST https://api.cloud.scenario.com/v1/generate/custom/model_wan-2-2-vace-fun-a14b-reframe` ### Parameters | Parameter | Type | Required | Default | Description | |-----------|------|----------|---------|-------------| | `videoUrl` | assetId | yes | - | Input video for reframe | | `prompt` | string | - | - | Text prompt for video generation | | `negativePrompt` | string | - | - | Text negative prompt for video generation | | `matchInputNumFrames` | boolean | - | `false` | Match the number of frames from input video | | `numFrames` | number | - | `81` | Number of frames to generate | | `matchInputFramesPerSecond` | boolean | - | `false` | If true, the frames per second of the generated video will match the input video. If false, the frames per second will be determined by the Frames Per Seconds parameter. | | `framesPerSecond` | number | - | `16` | Frames per second of the generated video. Ignored if match_input_frames_per_second is true. Default value: 16 | | `resolution` | string | - | `720p` | Output video resolution | | `aspectRatio` | string | - | `auto` | Aspect ratio for output video | | `numInferenceSteps` | number | - | `30` | Number of inference steps | | `guidanceScale` | number | - | `5` | Guidance scale for generation | | `enablePromptExpansion` | boolean | - | `false` | Enable prompt expansion | | `acceleration` | string | - | `regular` | Processing acceleration mode | | `videoQuality` | string | - | `high` | Output video quality | | `videoWriteMode` | string | - | `balanced` | Video writing mode | | `numInterpolatedFrames` | number | - | `1` | Number of frames to interpolate between the original frames. A value of 0 means no interpolation | | `interpolatorModel` | string | - | `film` | Interpolator model to use | | `zoomFactor` | number | - | `0` | Zoom factor for the video. When this value is greater than 0, the video will be zoomed in by this factor (in relation to the canvas size,) cutting off the edges of the video. A value of 0 means no zoom. | | `trimBorders` | boolean | - | `true` | Whether to trim borders from the video. | | `temporalDownsampleFactor` | number | - | `0` | Temporal downsample factor for the video. This is an integer value that determines how many frames to skip in the video. A value of 0 means no downsampling. For each downsample factor, one upsample factor will automatically be applied. | | `seed` | number | - | - | Random seed for reproducibility. If None, a random seed is chosen. | ### Example Requests **cURL** ```bash curl -X POST "https://api.cloud.scenario.com/v1/generate/custom/model_wan-2-2-vace-fun-a14b-reframe" \ -H "Authorization: Basic $(echo -n ':' | base64)" \ -H "Content-Type: application/json" \ --data-binary @- <<'EOF' { "videoUrl": "", "matchInputNumFrames": false, "numFrames": 81, "matchInputFramesPerSecond": false, "framesPerSecond": 16, "resolution": "720p", "aspectRatio": "auto", "numInferenceSteps": 30, "guidanceScale": 5, "enablePromptExpansion": false, "acceleration": "regular", "videoQuality": "high", "videoWriteMode": "balanced", "numInterpolatedFrames": 1, "interpolatorModel": "film", "zoomFactor": 0, "trimBorders": true, "temporalDownsampleFactor": 0 } EOF ``` **Python** ```python import os from scenario_sdk import Scenario client = Scenario( api_key=os.environ.get("SCENARIO_SDK_API_KEY"), api_secret=os.environ.get("SCENARIO_SDK_API_SECRET"), ) body = { "videoUrl": "", "matchInputNumFrames": False, "numFrames": 81, "matchInputFramesPerSecond": False, "framesPerSecond": 16, "resolution": "720p", "aspectRatio": "auto", "numInferenceSteps": 30, "guidanceScale": 5, "enablePromptExpansion": False, "acceleration": "regular", "videoQuality": "high", "videoWriteMode": "balanced", "numInterpolatedFrames": 1, "interpolatorModel": "film", "zoomFactor": 0, "trimBorders": True, "temporalDownsampleFactor": 0 } response = client.generate.run_model( model_id="model_wan-2-2-vace-fun-a14b-reframe", body=body, ) print(response) ``` **JavaScript** ```javascript import Scenario from "@scenario-labs/sdk"; const client = new Scenario({ apiKey: process.env["SCENARIO_SDK_API_KEY"], apiSecret: process.env["SCENARIO_SDK_API_SECRET"], }); const body = { "videoUrl": "", "matchInputNumFrames": false, "numFrames": 81, "matchInputFramesPerSecond": false, "framesPerSecond": 16, "resolution": "720p", "aspectRatio": "auto", "numInferenceSteps": 30, "guidanceScale": 5, "enablePromptExpansion": false, "acceleration": "regular", "videoQuality": "high", "videoWriteMode": "balanced", "numInterpolatedFrames": 1, "interpolatorModel": "film", "zoomFactor": 0, "trimBorders": true, "temporalDownsampleFactor": 0 }; const response = await client.generate.runModel("model_wan-2-2-vace-fun-a14b-reframe", { body }); console.info(response); ``` --- ## Retrieve Results After submitting a generation request, you receive a `jobId`. Poll the job until `job.status` is `"success"`. The generated asset IDs are in `job.metadata.assetIds`. **Endpoint:** `GET https://api.cloud.scenario.com/v1/jobs/{jobId}` ### Example Requests **cURL** ```bash curl -X GET "https://api.cloud.scenario.com/v1/jobs/" \ -H "Authorization: Basic $(echo -n ':' | base64)" ``` **Python** ```python job = client.jobs.retrieve(job_id="") print(job.status) print(job.metadata.asset_ids) ``` **JavaScript** ```javascript // Option 1 — wait on the response from runModel using the SDK helper const completed = await response.job.wait(); console.info(completed.status); console.info(completed.metadata?.assetIds); // Option 2 — retrieve a job by its ID const job = await client.jobs.retrieve(""); console.info(job.status); console.info(job.metadata?.assetIds); ``` **Example response:** ```json { "job": { "jobId": "job_abc123", "status": "success", "metadata": { "assetIds": [ "asset_abc123" ] } } } ``` > **Important:** Generated asset URLs are **temporary** and expire after a short period. Download and store any images you wish to keep before the URL expires. More info: [Content Delivery Network (CDN)](https://docs.scenario.com/get-started/documentation/content-delivery-network-cdn). --- *Generated by [Scenario](https://app.scenario.com)*