Skip to content

Image To Video Generation

Image-to-Video API generates desired videos via images and keywords, leveraging the latest models to produce tailored visual outputs effectively.

API documentation

Interface for removing background from the submitted video:

(1)Request parameters (Header)

ParameterParameter TypeDescription
APIKEYstringYour API Key

(2) Payload

ParameterParameter TypeDescription
imageUrlstringImage URL, width and height restrictions: minimum 300 pixels, maximum no more than 6000 pixels, and image size cannot exceed 10MB.
promptstringKeywords (optional). Filling in keywords can make the video closer to the effect you want.

(3) Response data

 {
    "code":0, // 0 indicates success, and the other values are the corresponding error codes
    "data": 700842286474565, 
    "msg":null, // if code is not 0, the error msg of the error
    "time": 1615368038661, // the unix timestamp of server
    "requestId": "6880539bcc69f3e9bd67a5a6fb35d0fc"
 }

Sample Code

bash
curl -X POST "https://www.cutout.pro/api/v2/imageToVideo/generate" \
     -H "APIKEY: The API key of the account" \
     -H "Content-Type: application/json" \
     -d '{
          "imageUrl": "image url",
          "prompt": "prompt"
      }'
python
  import requests
  import json

  url = "https://www.cutout.pro/api/v2/imageToVideo/generate"
  headers = {
      "APIKEY": "The API key of the account",
      "Content-Type": "application/json"
  }
  data = {
      "imageUrl": "image url",
      "prompt": "prompt"
  }

  response = requests.post(url, headers=headers, json=data)
  print(response.text)
php
  <?php
  $url = 'https://www.cutout.pro/api/v2/imageToVideo/generate';
  $data = array(
      'imageUrl' => 'image url',
      'prompt' => 'prompt'
  );

  $options = array(
      'http' => array(
          'method' => 'POST',
          'header' => "APIKEY: The API key of the account\r\n" .
                      "Content-Type: application/json\r\n",
          'content' => json_encode($data)
      )
  );

  $context = stream_context_create($options);
  $result = file_get_contents($url, false, $context);
  echo $result;
  ?>
java
  import org.springframework.http.HttpEntity;
  import org.springframework.http.HttpHeaders;
  import org.springframework.http.MediaType;
  import org.springframework.web.client.RestTemplate;

  public class RequestExample {
      public static void main(String[] args) {
          RestTemplate restTemplate = new RestTemplate();
          String url = "https://www.cutout.pro/api/v2/imageToVideo/generate";
  
          // setting header
          HttpHeaders headers = new HttpHeaders();
          headers.set("APIKEY", "The API key of the account");
          headers.setContentType(MediaType.APPLICATION_JSON);
  
          // request body json
          String jsonBody = "{\"imageUrl\":\"image url\",\"prompt\":\"prompt\"}";
          HttpEntity<String> request = new HttpEntity<>(jsonBody, headers);
  
          // send post request
          String response = restTemplate.postForObject(url, request, String.class);
          System.out.println(response);
      }
  }
nodejs
  const https = require('https');

  const postData = JSON.stringify({
    "imageUrl": "https://example.com/your-image.jpg",
    "prompt": "prompt" 
  });

  const options = {
    hostname: 'www.cutout.pro',
    path: '/api/v2/imageToVideo/generate',
    method: 'POST',
    headers: {
      'APIKEY': 'your_api_key_here',
      'Content-Type': 'application/json',
      'Content-Length': Buffer.byteLength(postData)
    }
  };

  const req = https.request(options, (res) => {
    let responseData = '';
  
    res.on('data', (chunk) => {
      responseData += chunk;
    });
   
    res.on('end', () => {
      console.log('request success:');
      console.log(JSON.parse(responseData));
    });
  });

  req.on('error', (e) => {
    console.error('request error:', e.message);
  });
  
  req.write(postData);
  req.end();

Query generation results:

(1) Request parameters (Header)

ParameterParameter TypeDescription
APIKEYstringYour API key

(2) Query String

ParameterParameter TypeDescription
taskIdlongThe task ID returned by the submission endpoint.

(3) Response data

{
    "code": 0,
    "data": {
        "id": 700842286474565,
        "userId": 528874,
        "imageUrl": "https://example.com/your-image.jpg",
        "originalPrompt": "Request keywords",
        "resultUrl": "The resulting video URL",
        "cover": "The video cover URL of the generated result",
        "width": 1024,
        "height": 1024,
        "status": 1, //0 = process | 1 = success | 2 = failed
        "percentage": 100,
        "waitNumber": 0,
        "createdAt": 1753240476000
    },
    "msg": "",
    "time": 1753241547143,
    "requestId": "688057cb0234b17e58a64906f583ae12"
}

Return result parameter:

idThe task id returned when generating.
userIdThe id used by the current APIKEY.
imageUrlThe image URL requested when generating.
originalPromptKeywords requested when generating.
resultUrlGenerate the resulting URL for the video.
coverGenerate video cover.
widthGenerate the width of the video, calculated based on the video cover
heightThe height of the generated video is calculated based on the video cover
statusThe status of the generated video, 0 = generating, 1 = generating successfully, 2 = generating failed
percentageThe progress of processing the video. When the progress is 100, the video generation is complete.
waitNumberThe number of requests currently waiting in queue
createdAtTime when the video was created

(4) Error Reponse

{
    "code": 9011,
    "data": null,
    "msg": "Image contains inappropriate content, cannot be processed.",
    "time": 1753241547143,
    "requestId": "688057cb0234b17e58a64906f583ae12"
}

Error Code:

CodeMsg
9011Image contains inappropriate content, cannot be processed.
1001The server is abnormal. Please contact us.
4002No results were found for the current task ID. Please check whether taskId is correct.

Sample Code

bash
curl -H 'APIKEY: INSERT_YOUR_API_KEY_HERE' \
  'https://www.cutout.pro/api/v2/imageToVideo/getResult?taskId=1111'
python
  import requests

  api_key = "your_api_key_here"
  task_id = "your_task_id_here"
  url = f"https://www.cutout.pro/api/v2/imageToVideo/getResult?taskId={task_id}"
  
  headers = {
      "APIKEY": api_key
  }

  response = requests.get(url, headers=headers)
  print(response.text)
php
  <?php
  $apiKey = "your_api_key_here";
  $taskId = "your_task_id_here";
  $url = "https://www.cutout.pro/api/v2/imageToVideo/getResult?taskId=$taskId";
  
  $headers = array(
      'APIKEY: ' . $apiKey
  );
  
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  
  $response = curl_exec($ch);
  curl_close($ch);
  
  echo $response;
  ?>
java
  import org.springframework.http.HttpEntity;
  import org.springframework.http.HttpHeaders;
  import org.springframework.http.HttpMethod;
  import org.springframework.http.ResponseEntity;
  import org.springframework.web.client.RestTemplate;

  public class Main {
      public static void main(String[] args) {
          RestTemplate restTemplate = new RestTemplate();
          String apiKey = "your_api_key_here";
          String taskId = "your_task_id_here";
          String url = "https://www.cutout.pro/api/v2/imageToVideo/getResult?taskId=" + taskId;
  
          HttpHeaders headers = new HttpHeaders();
          headers.set("APIKEY", apiKey);
  
          HttpEntity<String> entity = new HttpEntity<>(headers);
  
          ResponseEntity<String> response = restTemplate.exchange(
                  url,
                  HttpMethod.GET,
                  entity,
                  String.class
          );
  
          System.out.println(response.getBody());
      }
  }
nodejs
  const https = require('https');

  const apiKey = "your_api_key_here";
  const taskId = "your_task_id_here";
  const options = {
      hostname: 'www.cutout.pro',
      path: `/api/v2/imageToVideo/getResult?taskId=${taskId}`,
      method: 'GET',
      headers: {
          'APIKEY': apiKey
      }
  };

  const req = https.request(options, (res) => {
      let data = '';
  
      res.on('data', (chunk) => {
          data += chunk;
      });
  
      res.on('end', () => {
          console.log(data);
      });
  
  }).on('error', (error) => {
      console.error(error);
  });
  
  req.end();

The cost incurred by the request

Each request will consume 5 video credits.

Seedance 2.0 and Seedance 2.5 Video Generation

The Seedance API supports text-to-video, first-frame, first-and-last-frame, multimodal reference, video editing, and reference-video continuation requests.

Calling sequence

Seedance generation is an asynchronous workflow. Call the APIs in the following order:

  1. Call /seedance2/uploadByUrl once for every image, video, or audio URL used by the task.
  2. Keep the mediaType, assetId, and url returned for each asset.
  3. Put the returned asset objects into the appropriate fields and call /seedance/generate.
  4. Save the task ID returned by the generation API.
  5. Poll /seedance/getResult with the task ID until status becomes 2 or 3.

Important

All three APIs must be called with the same APIKEY. Assets and generated tasks belong to the API user that created them. Seedance API access is currently available only to authorized API users.

1. Import a Seedance asset by URL

This API downloads a publicly accessible image, video, or audio URL, copies the file to private storage, and creates a Seedance asset.

  • Request URL: https://www.cutout.pro/api/v2/imageToVideo/seedance2/uploadByUrl
  • Request method: POST
  • Content type: application/x-www-form-urlencoded
  • Return type: JSON

Request parameters

ParameterTypeRequiredDescription
APIKEYstringYesYour API key. The API user must be authorized to use Seedance asset upload.

Form parameters

ParameterTypeRequiredDescription
urlstringYesA public HTTP or HTTPS URL that the server can download directly.
mediaTypestringYesAsset type: image, video, or audio. It must match the actual file content.

cURL examples

Import an image:

bash
curl --request POST \
  --url 'https://www.cutout.pro/api/v2/imageToVideo/seedance2/uploadByUrl' \
  --header 'APIKEY: INSERT_YOUR_API_KEY_HERE' \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'url=https://example.com/reference-image.jpg' \
  --data-urlencode 'mediaType=image'

Import a video:

bash
curl --request POST \
  --url 'https://www.cutout.pro/api/v2/imageToVideo/seedance2/uploadByUrl' \
  --header 'APIKEY: INSERT_YOUR_API_KEY_HERE' \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'url=https://example.com/reference-video.mp4' \
  --data-urlencode 'mediaType=video'

Import an audio file:

bash
curl --request POST \
  --url 'https://www.cutout.pro/api/v2/imageToVideo/seedance2/uploadByUrl' \
  --header 'APIKEY: INSERT_YOUR_API_KEY_HERE' \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'url=https://example.com/reference-audio.mp3' \
  --data-urlencode 'mediaType=audio'

Successful response example

json
{
  "code": 0,
  "data": {
    "taskFlag": null,
    "mediaType": "image",
    "url": "https://example-storage.com/upload/reference-image.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Signature=SIGNED_VALUE",
    "firstFrameUrl": null,
    "assetId": "asset-20260831123000-abcd1"
  },
  "msg": "",
  "time": 1788141000000,
  "requestId": "example-request-id"
}

Response fields

FieldTypeDescription
taskFlagstring or nullNot used by URL import and normally returned as null.
mediaTypestringThe verified asset type: image, video, or audio.
urlstringThe private signed URL created by the service. Pass this value to the generation API without modifying it.
firstFrameUrlstring or nullURL import does not extract a video first frame, so this field is normally null. It is not required by the generation API.
assetIdstringThe Seedance asset ID created for this file.

Asset requirements

TypeSupported formatsMaximum sizeAdditional requirements
ImageJPG, JPEG, PNG, WEBP20 MBThe URL content must be a valid image.
VideoMP4, MOV50 MBDuration: 2–15 seconds; width and height: 300–6000 px; total pixels: 409600–927408; aspect ratio: 0.4–2.5; frame rate: 24–60 fps.
AudioMP3, WAV15 MBDuration: 2–15 seconds.

Asset object used by the next API

For the following examples, replace the placeholder values with the complete values returned by this API:

json
{
  "mediaType": "image",
  "assetId": "asset-20260831123000-abcd1",
  "url": "https://example-storage.com/upload/reference-image.jpg?X-Amz-Signature=SIGNED_VALUE",
  "firstFrameUrl": null
}

2. Submit a Seedance generation task

  • Request URL: https://www.cutout.pro/api/v2/imageToVideo/seedance/generate
  • Request method: POST
  • Content type: application/json
  • Return type: JSON

Request parameters

Header

ParameterTypeRequiredDescription
APIKEYstringYesThe same API key used to import the assets.

JSON payload

ParameterTypeRequiredDescription
promptstringYesThe generation or editing instruction. In reference mode, @image1, @video1, and @audio1 refer to assets by their array order.
modelstringYesseedance_2_pro, seedance_2_pro_fast, seedance_2_0_mini, or seedance_2_5.
resolutionstringYesOutput resolution. See the model table below.
ratiostringYesOutput aspect ratio. Use adaptive when the model should infer the ratio from the input.
durationintegerYesRequested duration in seconds. For Seedance 2.5 editing, use -1.
generateAudiobooleanNoWhether the model should generate audio. Defaults to false when omitted.
scenestringNoBusiness scene identifier. The recommended value is ai-video-seedance2.
firstFrameAssetobjectNoThe image asset used as the first frame.
lastFrameAssetobjectNoThe image asset used as the last frame. It cannot be supplied without firstFrameAsset.
referenceImageAssetsarrayNoReference image asset objects.
videoAssetsarrayNoReference or source video asset objects.
audioAssetsarrayNoReference audio asset objects.

Each asset object accepts these fields:

FieldTypeDescription
mediaTypestringimage, video, or audio.
assetIdstringThe assetId returned by /seedance2/uploadByUrl.
urlstringThe complete signed url returned by /seedance2/uploadByUrl.
firstFrameUrlstring or nullOptional. It may be left as null for assets imported by URL.

Supported models

ModelSupported resolutionDuration
seedance_2_pro480p, 720p, 1080pA positive duration supported by the model.
seedance_2_pro_fast480p, 720pA positive duration supported by the model.
seedance_2_0_mini480p, 720pA positive duration supported by the model.
seedance_2_5480p, 720p, 1080p4–30 seconds; use -1 only for video editing.

Seedance pricing

Seedance is billed per generated second. The price depends on the selected model and resolution.

The service uses image credits first. If the account does not have enough image credits, it uses video credits at the conversion rate of 2 image credits = 1 video credit.

ModelResolutionImage credits per secondVideo credits per second
seedance_2_pro480p31.5
seedance_2_pro720p52.5
seedance_2_pro1080p105
seedance_2_pro_fast480p21
seedance_2_pro_fast720p42
seedance_2_0_mini480p21
seedance_2_0_mini720p42
seedance_2_5480p105
seedance_2_5720p168
seedance_2_51080p6030

For normal generation, calculate the estimated cost as follows:

text
Image-credit cost = image credits per second × requested duration
Video-credit cost = video credits per second × requested duration

Examples:

  • seedance_2_pro, 720p, 5 seconds: 5 × 5 = 25 image credits, or 2.5 × 5 = 12.5 video credits.
  • seedance_2_5, 720p, 10 seconds: 16 × 10 = 160 image credits, or 8 × 10 = 80 video credits.

Seedance 2.5 editing billing

When seedance_2_5 video editing uses duration: -1, the service initially reserves the cost of 30 seconds. After successful completion, it uses the actual output duration reported by the model and refunds the unused portion.

For example, a 720p editing request initially reserves 16 × 30 = 480 image credits, or 8 × 30 = 240 video credits. If the actual output is 8 seconds, the final cost is 16 × 8 = 128 image credits, or 8 × 8 = 64 video credits, and the unused amount is returned.

Billing notes

  • Reference images, reference videos, reference audio, first/last frames, and generateAudio do not independently change the price. Billing is determined by model, resolution, and billable duration.
  • A failed generation task returns the credits charged for that task according to the service's failure-refund processing.
  • Billing and refund details are intentionally not included in /seedance/getResult; that endpoint only returns task progress and output information.

Generation mode examples

The examples below use placeholder asset values. Import every source file first and replace both assetId and url with the corresponding upload response.

A. Multimodal reference mode

Reference images, videos, and audio can be combined in one request. Array numbering starts at 1, so the first entries correspond to @image1, @video1, and @audio1 in the prompt.

bash
curl --request POST \
  --url 'https://www.cutout.pro/api/v2/imageToVideo/seedance/generate' \
  --header 'APIKEY: INSERT_YOUR_API_KEY_HERE' \
  --header 'Content-Type: application/json' \
  --data-raw '{
    "scene": "ai-video-seedance2",
    "model": "seedance_2_pro",
    "prompt": "Let the person in @image1 enter the scene in @video1 and move to the rhythm of @audio1.",
    "referenceImageAssets": [
      {
        "mediaType": "image",
        "assetId": "asset-image-001",
        "url": "https://example-storage.com/reference-image.jpg?X-Amz-Signature=SIGNED_VALUE",
        "firstFrameUrl": null
      }
    ],
    "videoAssets": [
      {
        "mediaType": "video",
        "assetId": "asset-video-001",
        "url": "https://example-storage.com/reference-video.mp4?X-Amz-Signature=SIGNED_VALUE",
        "firstFrameUrl": null
      }
    ],
    "audioAssets": [
      {
        "mediaType": "audio",
        "assetId": "asset-audio-001",
        "url": "https://example-storage.com/reference-audio.mp3?X-Amz-Signature=SIGNED_VALUE",
        "firstFrameUrl": null
      }
    ],
    "firstFrameAsset": null,
    "lastFrameAsset": null,
    "resolution": "720p",
    "ratio": "adaptive",
    "duration": 5,
    "generateAudio": true
  }'

If a media type is not needed, omit its array or send an empty array. Do not put an image asset into videoAssets or an audio asset into referenceImageAssets.

B. First-and-last-frame mode

Use two image assets to define the beginning and end of the generated video.

bash
curl --request POST \
  --url 'https://www.cutout.pro/api/v2/imageToVideo/seedance/generate' \
  --header 'APIKEY: INSERT_YOUR_API_KEY_HERE' \
  --header 'Content-Type: application/json' \
  --data-raw '{
    "scene": "ai-video-seedance2",
    "model": "seedance_2_5",
    "prompt": "Create a natural transition from the first frame to the last frame while preserving the character identity and visual style.",
    "firstFrameAsset": {
      "mediaType": "image",
      "assetId": "asset-first-frame-001",
      "url": "https://example-storage.com/first-frame.jpg?X-Amz-Signature=SIGNED_VALUE",
      "firstFrameUrl": null
    },
    "lastFrameAsset": {
      "mediaType": "image",
      "assetId": "asset-last-frame-001",
      "url": "https://example-storage.com/last-frame.jpg?X-Amz-Signature=SIGNED_VALUE",
      "firstFrameUrl": null
    },
    "referenceImageAssets": [],
    "videoAssets": [],
    "audioAssets": [],
    "resolution": "720p",
    "ratio": "adaptive",
    "duration": 5,
    "generateAudio": true
  }'

For first-frame-only generation, keep firstFrameAsset and set lastFrameAsset to null. Supplying a last frame without a first frame is rejected.

C. Video editing mode

Video editing is available with seedance_2_5. Set duration to -1 and provide at least one source video in videoAssets. The completed response reports the actual output duration.

bash
curl --request POST \
  --url 'https://www.cutout.pro/api/v2/imageToVideo/seedance/generate' \
  --header 'APIKEY: INSERT_YOUR_API_KEY_HERE' \
  --header 'Content-Type: application/json' \
  --data-raw '{
    "scene": "ai-video-seedance2",
    "model": "seedance_2_5",
    "prompt": "Replace the sky with a warm sunset while preserving the original subject, camera movement, and composition.",
    "videoAssets": [
      {
        "mediaType": "video",
        "assetId": "asset-edit-video-001",
        "url": "https://example-storage.com/source-video.mp4?X-Amz-Signature=SIGNED_VALUE",
        "firstFrameUrl": null
      }
    ],
    "referenceImageAssets": [],
    "audioAssets": [],
    "firstFrameAsset": null,
    "lastFrameAsset": null,
    "resolution": "720p",
    "ratio": "adaptive",
    "duration": -1,
    "generateAudio": true
  }'

D. Reference-video continuation mode

To request a continuation, provide a reference video, use a positive output duration, and explicitly describe the continuation in the prompt.

bash
curl --request POST \
  --url 'https://www.cutout.pro/api/v2/imageToVideo/seedance/generate' \
  --header 'APIKEY: INSERT_YOUR_API_KEY_HERE' \
  --header 'Content-Type: application/json' \
  --data-raw '{
    "scene": "ai-video-seedance2",
    "model": "seedance_2_5",
    "prompt": "Continue naturally from the final frame of the source video. The character keeps running forward with consistent appearance, lighting, scene style, and camera motion.",
    "videoAssets": [
      {
        "mediaType": "video",
        "assetId": "asset-continuation-video-001",
        "url": "https://example-storage.com/source-video.mp4?X-Amz-Signature=SIGNED_VALUE",
        "firstFrameUrl": null
      }
    ],
    "referenceImageAssets": [],
    "audioAssets": [],
    "firstFrameAsset": null,
    "lastFrameAsset": null,
    "resolution": "720p",
    "ratio": "adaptive",
    "duration": 10,
    "generateAudio": true
  }'

Continuation behavior

The current request contract does not expose a separate extend flag. A positive-duration request containing only a reference video is submitted as reference-video generation. Clearly describe the continuation in the prompt. Frame-perfect continuation depends on the selected model's current capability and is not guaranteed by a separate API mode switch.

Successful generation response

json
{
  "code": 0,
  "data": 701234567890123,
  "msg": "",
  "time": 1788141300000,
  "requestId": "example-request-id"
}

The numeric value in data is the task ID. Generation is asynchronous; this response means that the task was accepted, not that the video has finished.

3. Query the Seedance task result

  • Request URL: https://www.cutout.pro/api/v2/imageToVideo/seedance/getResult
  • Request method: GET
  • Return type: JSON

Request parameters

Header

ParameterTypeRequiredDescription
APIKEYstringYesThe same API key that submitted the generation task.

Query string

ParameterTypeRequiredDescription
taskIdlongYesThe task ID returned in data by /seedance/generate.

cURL example

bash
curl --request GET \
  --url 'https://www.cutout.pro/api/v2/imageToVideo/seedance/getResult?taskId=701234567890123' \
  --header 'APIKEY: INSERT_YOUR_API_KEY_HERE'

Processing response example

json
{
  "code": 0,
  "data": {
    "id": 701234567890123,
    "status": 1,
    "percentage": 46,
    "resultUrl": null,
    "duration": 5,
    "width": null,
    "height": null,
    "failReason": null,
    "runningTime": null,
    "totalTime": null,
    "createdAt": 1788141300000
  },
  "msg": "",
  "time": 1788141330000,
  "requestId": "example-request-id"
}

Successful response example

json
{
  "code": 0,
  "data": {
    "id": 701234567890123,
    "status": 2,
    "percentage": 100,
    "resultUrl": "https://example-storage.com/result/video.mov?X-Amz-Signature=SIGNED_VALUE",
    "duration": 5,
    "width": 1280,
    "height": 720,
    "failReason": null,
    "runningTime": 82340,
    "totalTime": 90125,
    "createdAt": 1788141300000
  },
  "msg": "",
  "time": 1788141391000,
  "requestId": "example-request-id"
}

Failed response example

json
{
  "code": 0,
  "data": {
    "id": 701234567890123,
    "status": 3,
    "percentage": 38,
    "resultUrl": null,
    "duration": 5,
    "width": null,
    "height": null,
    "failReason": "generate video failed",
    "runningTime": 30120,
    "totalTime": 35640,
    "createdAt": 1788141300000
  },
  "msg": "",
  "time": 1788141336000,
  "requestId": "example-request-id"
}

Result fields

FieldTypeDescription
idlongTask ID.
statusinteger0: pending; 1: processing; 2: succeeded; 3: failed. Stop polling when the value is 2 or 3.
percentageintegerGeneration progress from 0 to 100. Use status, rather than progress alone, to determine the final state.
resultUrlstring or nullSigned output video URL. Available when the task succeeds.
durationintegerVideo duration in seconds. For completed Seedance 2.5 editing tasks, this is updated to the actual output duration when provided by the model.
widthinteger or nullOutput video width, available after successful generation.
heightinteger or nullOutput video height, available after successful generation.
failReasonstring or nullUser-facing failure reason when status is 3.
runningTimelong or nullModel processing time in milliseconds.
totalTimelong or nullTotal backend processing time in milliseconds.
createdAtlongTask creation time as a Unix timestamp in milliseconds.

Important notes

  • Import every source URL with /seedance2/uploadByUrl before generating. Do not use an asset created by a different API user.
  • Preserve the complete signed asset URL, including its query string. Do not decode, shorten, or remove signature parameters.
  • Pass both assetId and url from the upload response. This keeps the request compatible with the supported Seedance 2.0 and 2.5 models.
  • Use firstFrameAsset, lastFrameAsset, referenceImageAssets, videoAssets, and audioAssets according to the actual media type. Do not put the same upload response into an unrelated field.
  • If an asset array is present and non-empty, it takes priority over its legacy raw-URL field. Avoid mixing referenceImageAssets with referenceImages, videoAssets with referenceVideos, or audioAssets with referenceAudios in the same request.
  • lastFrameAsset requires firstFrameAsset.
  • Seedance 2.5 edit mode requires duration: -1 and at least one video asset. Other generation modes must use a positive duration.
  • generateAudio is false when omitted. Set it explicitly when audio generation is required.
  • Poll every few seconds rather than sending continuous requests. Stop polling on status: 2 or status: 3.
  • The result response intentionally does not expose credits, refund details, prompts, reference assets, or internal generation parameters.
  • resultUrl is a signed URL. Download or copy the result promptly, and query the result API again if a refreshed URL is needed.