> ## Documentation Index
> Fetch the complete documentation index at: https://apixo.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Seedance 1.5 Pro

> ByteDance video generation API for text-to-video, image-to-video, and video extension workflows

## Overview

Seedance 1.5 Pro is a ByteDance video generation model for short text-to-video, image-to-video, and video extension workflows. Use this page when you are ready to call the API after trying the model in the APIXO playground.

| Capability       | Value                                                                                        |
| ---------------- | -------------------------------------------------------------------------------------------- |
| Model ID         | `seedance-1-5-pro`                                                                           |
| Modes            | `text-to-video`, `image-to-video`, `video-extend`                                            |
| Prompt length    | 3-2500 characters                                                                            |
| Reference images | 1-2 URLs for `image-to-video`; the second image is used as the end frame                     |
| Source video     | Exactly 1 public video URL for `video-extend`                                                |
| Aspect ratios    | `auto`, `1:1`, `3:4`, `4:3`, `9:16`, `16:9`, `21:9` for `text-to-video` and `image-to-video` |
| Resolutions      | `480p`, `720p`, `1080p`                                                                      |
| Duration         | 4-12 seconds; use `4`, `8`, or `12` for predictable tier matching                            |
| Audio            | Required `sound` toggle                                                                      |
| Output           | Generated or extended video URL in `resultJson.resultUrls`                                   |

## Endpoint and authentication

Base URL:

```text theme={null}
https://api.apixo.ai/api/v1
```

| Method | Endpoint                                       | Purpose                               |
| ------ | ---------------------------------------------- | ------------------------------------- |
| `POST` | `/generateTask/seedance-1-5-pro`               | Submit a generation task              |
| `GET`  | `/statusTask/seedance-1-5-pro?taskId={taskId}` | Poll task status and retrieve results |

All requests require your APIXO API key:

```http theme={null}
Authorization: Bearer YOUR_API_KEY
```

Submit requests also require:

```http theme={null}
Content-Type: application/json
```

## Copy-paste async quickstart

This minimal request submits a text-to-video task and returns a `taskId`.

```bash theme={null}
curl -X POST "https://api.apixo.ai/api/v1/generateTask/seedance-1-5-pro" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "request_type": "async",
    "input": {
      "mode": "text-to-video",
      "prompt": "a calm seaside sunrise with gentle camera dolly movement",
      "resolution": "720p",
      "duration": 8,
      "sound": false,
      "aspect_ratio": "auto",
      "camera_fixed": false,
      "seed": 123456,
      "watermark": false
    }
  }'
```

Successful response:

```json theme={null}
{
  "code": 200,
  "message": "success",
  "data": {
    "taskId": "task_12345678"
  }
}
```

Save the `taskId`; you need it to poll for the final result.

## Poll for result

```bash theme={null}
curl -X GET "https://api.apixo.ai/api/v1/statusTask/seedance-1-5-pro?taskId=task_12345678" \
  -H "Authorization: Bearer YOUR_API_KEY"
```

Processing response:

```json theme={null}
{
  "code": 200,
  "message": "success",
  "data": {
    "taskId": "task_12345678",
    "state": "processing",
    "createTime": 1767965610929
  }
}
```

Success response:

```json theme={null}
{
  "code": 200,
  "message": "success",
  "data": {
    "taskId": "task_12345678",
    "state": "success",
    "resultJson": "{\"resultUrls\":[\"https://file.apixo.ai/xxx.mp4\"]}",
    "createTime": 1767965610929,
    "completeTime": 1767965695412,
    "costTime": 84483
  }
}
```

Failed response:

```json theme={null}
{
  "code": 200,
  "message": "success",
  "data": {
    "taskId": "task_12345678",
    "state": "failed",
    "failCode": "SensitiveContent",
    "failMsg": "Content violates upstream policy, please adjust the prompt",
    "createTime": 1767965610929,
    "completeTime": 1767965620132,
    "costTime": 9203
  }
}
```

Parse `resultJson` after `state` becomes `success`:

```javascript theme={null}
const payload = JSON.parse(data.resultJson);
const videoUrls = payload.resultUrls;
```

## Request body

### Text-to-video

```json theme={null}
{
  "request_type": "async",
  "input": {
    "mode": "text-to-video",
    "prompt": "a clean product showcase on a neutral background, subtle lighting shifts, steady camera",
    "resolution": "720p",
    "duration": 8,
    "sound": false,
    "aspect_ratio": "auto",
    "camera_fixed": true,
    "seed": 123456,
    "watermark": false
  }
}
```

### Image-to-video

```json theme={null}
{
  "request_type": "async",
  "input": {
    "mode": "image-to-video",
    "prompt": "animate this landscape with moving clouds and soft wind",
    "image_urls": [
      "https://example.com/start-frame.jpg",
      "https://example.com/end-frame.jpg"
    ],
    "resolution": "480p",
    "duration": 4,
    "sound": true,
    "aspect_ratio": "1:1",
    "camera_fixed": false,
    "seed": 123456,
    "watermark": false
  }
}
```

### Video extend

```json theme={null}
{
  "request_type": "async",
  "input": {
    "mode": "video-extend",
    "prompt": "continue the same shot with a gentle smile and then a smooth ride-away",
    "video_urls": [
      "https://example.com/source.mp4"
    ],
    "resolution": "720p",
    "duration": 8,
    "sound": true,
    "camera_fixed": true,
    "seed": 123456,
    "watermark": false
  }
}
```

## Parameters

<ParamField body="request_type" type="string" required default="async">
  Result delivery mode. Use `async` for polling with `statusTask`, or `callback` for webhook delivery.
</ParamField>

<ParamField body="callback_url" type="string">
  Required when `request_type` is `callback`. Must be a public HTTPS URL that can receive the final task payload. See [Webhooks](/api-reference/webhooks).
</ParamField>

<ParamField body="input" type="object" required>
  Seedance 1.5 Pro input parameters.

  <Expandable title="properties">
    <ParamField body="mode" type="string">
      Generation mode. Supported values: `text-to-video`, `image-to-video`, `video-extend`. If omitted, APIXO infers `image-to-video` when `image_urls` is present and `text-to-video` otherwise. Set `video-extend` explicitly when extending a source video.
    </ParamField>

    <ParamField body="prompt" type="string" required>
      Text prompt describing the desired video or continuation. Supports 3-2500 characters after trimming.
    </ParamField>

    <ParamField body="image_urls" type="string[]">
      Reference image URLs. Required for `image-to-video`. Supports 1-2 URLs; when two are provided, the first is the start frame and the second is the end frame.
    </ParamField>

    <ParamField body="video_urls" type="string[]">
      Source video URLs. Required for `video-extend`; provide exactly 1 public video URL. Do not use `video_urls` for `text-to-video` or `image-to-video`.
    </ParamField>

    <ParamField body="resolution" type="string" required>
      Output video resolution. Supported values: `480p`, `720p`, `1080p`.
    </ParamField>

    <ParamField body="duration" type="integer" required>
      Video duration in seconds. Accepts integer values from `4` to `12`; numeric strings are also accepted by the backend. Use `4`, `8`, or `12` for predictable tier matching.
    </ParamField>

    <ParamField body="sound" type="boolean" required>
      Whether to generate audio with the video. Use `true` for generated sound, or `false` for a silent video.
    </ParamField>

    <ParamField body="aspect_ratio" type="string" default="1:1">
      Output aspect ratio for `text-to-video` and `image-to-video`. Supported values: `auto`, `1:1`, `3:4`, `4:3`, `9:16`, `16:9`, `21:9`.
    </ParamField>

    <ParamField body="camera_fixed" type="boolean">
      Set `true` to request a stable camera view. For `video-extend`, the backend defaults this field to `true` when omitted.
    </ParamField>

    <ParamField body="seed" type="integer">
      Optional random seed for more reproducible results across retries and repeated runs.
    </ParamField>

    <ParamField body="watermark" type="boolean">
      Whether to keep the upstream watermark in the generated video when the selected route supports it.
    </ParamField>
  </Expandable>
</ParamField>

<Tip>
  Legacy `fixed_lens` is still accepted for compatibility, but new integrations should use `camera_fixed`.
</Tip>

## Response format

### Submit task response

`POST /generateTask/seedance-1-5-pro` returns a task ID when the task is accepted:

<ResponseField name="code" type="integer">
  API status code. `200` means the task was accepted.
</ResponseField>

<ResponseField name="message" type="string">
  Human-readable status message.
</ResponseField>

<ResponseField name="data.taskId" type="string">
  Unique task identifier used with the status endpoint.
</ResponseField>

### Status response fields

<ResponseField name="taskId" type="string">
  Unique task identifier.
</ResponseField>

<ResponseField name="state" type="string">
  Current task state: `pending`, `processing`, `success`, or `failed`.
</ResponseField>

<ResponseField name="resultJson" type="string">
  JSON string containing the generated or extended video URLs. Present when `state` is `success`.
</ResponseField>

<ResponseField name="failCode" type="string">
  Machine-readable failure code. Present when `state` is `failed`.
</ResponseField>

<ResponseField name="failMsg" type="string">
  Human-readable failure message. Present when `state` is `failed`.
</ResponseField>

<ResponseField name="createTime" type="integer">
  Task creation timestamp in Unix milliseconds.
</ResponseField>

<ResponseField name="completeTime" type="integer">
  Task completion timestamp in Unix milliseconds. Present after completion.
</ResponseField>

<ResponseField name="costTime" type="integer">
  Processing duration in milliseconds. Present after completion when available.
</ResponseField>

## Webhook callback mode

Use callback mode when your backend should receive the final result automatically instead of polling.

```bash theme={null}
curl -X POST "https://api.apixo.ai/api/v1/generateTask/seedance-1-5-pro" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "request_type": "callback",
    "callback_url": "https://your-server.com/webhooks/apixo",
    "input": {
      "mode": "video-extend",
      "prompt": "continue the same scene with a smooth smile, then leave the frame naturally",
      "video_urls": [
        "https://example.com/source.mp4"
      ],
      "resolution": "720p",
      "duration": 8,
      "sound": true,
      "camera_fixed": true,
      "seed": 123456,
      "watermark": false
    }
  }'
```

The callback payload uses the same unified response shape as the status endpoint when the task reaches a final state. See [Webhooks](/api-reference/webhooks) for delivery requirements and retry behavior.

## Billing

Seedance 1.5 Pro is billed per second. The selected `resolution`, `duration`, and `sound` value determine the total cost for all supported modes, including `video-extend`.

| Resolution | `sound` | Price             |
| ---------- | ------- | ----------------- |
| `480p`     | `false` | `$0.012 / second` |
| `480p`     | `true`  | `$0.024 / second` |
| `720p`     | `false` | `$0.024 / second` |
| `720p`     | `true`  | `$0.048 / second` |
| `1080p`    | `false` | `$0.052 / second` |
| `1080p`    | `true`  | `$0.104 / second` |

Total cost is the per-second price multiplied by the billable duration. For example, `720p` with `sound: false` for 8 seconds costs `$0.192`.

For current route and market comparison pricing, see [Pricing](https://apixo.ai/pricing).

## Latency and polling

Actual latency may vary by prompt complexity, input media, mode, route selection, and current queue load. `video-extend` includes source clip analysis and final stitching, so it can take longer than direct text-to-video or image-to-video generation.

| Mode                              | Duration     | Typical generation time | Recommended first poll  | Poll interval |
| --------------------------------- | ------------ | ----------------------- | ----------------------- | ------------- |
| `text-to-video`, `image-to-video` | `4` seconds  | 40s-60s                 | 40s after task creation | 5s-10s        |
| `text-to-video`, `image-to-video` | `8` seconds  | 60s-90s                 | 60s after task creation | 5s-10s        |
| `text-to-video`, `image-to-video` | `12` seconds | 90s-120s                | 90s after task creation | 5s-10s        |
| `video-extend`                    | `4` seconds  | 45s-75s                 | 45s after task creation | 5s-10s        |
| `video-extend`                    | `8` seconds  | 60s-110s                | 60s after task creation | 5s-10s        |
| `video-extend`                    | `12` seconds | 90s-150s                | 90s after task creation | 5s-10s        |

<Tip>
  Video generation can take time. For production workloads, use callback mode to avoid frequent polling.
</Tip>

Rate limits and concurrency can vary by account, API key, and route. If you receive `429`, slow down requests and retry with backoff. For account-level details, see [System APIs](/api-reference/system).

## Errors and troubleshooting

### HTTP errors

| Code  | Meaning                                                                                                                                                        | What to do                                        |
| ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------- |
| `400` | Invalid request body, missing required field, unsupported mode, unsupported resolution, invalid duration, malformed source URL array, or rejected prompt/media | Fix the request before retrying                   |
| `401` | Missing or invalid API key                                                                                                                                     | Check the `Authorization` header                  |
| `402` | Insufficient balance or quota                                                                                                                                  | Add balance or switch account/key                 |
| `403` | Key or route cannot access the model                                                                                                                           | Check permissions and route strategy              |
| `429` | Rate limit or concurrency limit reached                                                                                                                        | Retry with exponential backoff                    |
| `500` | Server error or unmapped upstream error                                                                                                                        | Retry with backoff; contact support if it repeats |
| `502` | Upstream error                                                                                                                                                 | Retry with backoff                                |
| `504` | Upstream timeout                                                                                                                                               | Retry or use callback mode for long-running jobs  |

### Task failure codes

| Fail code                 | Meaning                                                                                          | What to do                                                                                           |
| ------------------------- | ------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------- |
| `MISSING_REQUIRED_PARAM`  | A required field such as `prompt`, `video_urls`, `resolution`, `duration`, or `sound` is missing | Fix the request before retrying                                                                      |
| `INVALID_PARAMETER`       | One or more fields use an unsupported value or type                                              | Check `mode`, media URLs, `resolution`, `duration`, `sound`, `camera_fixed`, `seed`, and `watermark` |
| `API_SERVICE_UNAVAILABLE` | Video extension processing or generation is temporarily unavailable                              | Retry later                                                                                          |
| `PromptInvalid`           | The prompt was rejected or malformed                                                             | Rewrite the prompt and retry                                                                         |
| `SensitiveContent`        | The prompt or generated content violated upstream policy                                         | Change the prompt or reference media                                                                 |
| `ImageFormatIncorrect`    | A reference image could not be accepted                                                          | Use a public JPG, PNG, or WebP image URL                                                             |
| `RateLimited`             | The upstream route rate limited the task                                                         | Retry later with backoff                                                                             |
| `Timeout`                 | The workflow did not finish in time                                                              | Retry, simplify the prompt, or use callback mode                                                     |
| `InsufficientBalance`     | The route could not continue because of balance or quota                                         | Add balance before retrying                                                                          |
| `Unknown error`           | The failure did not match a known public mapping                                                 | Retry or contact support with the `taskId`                                                           |

### Common validation fixes

| Symptom                                    | Fix                                                                       |
| ------------------------------------------ | ------------------------------------------------------------------------- |
| `mode` is rejected                         | Use `text-to-video`, `image-to-video`, or `video-extend`                  |
| `image_urls` is missing for image-to-video | Provide 1-2 public image URLs                                             |
| `video_urls` is missing for video-extend   | Set `input.mode` to `video-extend` and provide exactly 1 public video URL |
| `resolution` is rejected                   | Use `480p`, `720p`, or `1080p`                                            |
| `duration` is rejected                     | Send an integer from `4` to `12`                                          |
| `sound` is rejected                        | Send a boolean: `true` or `false`                                         |
| Prompt length error                        | Keep the trimmed prompt within 3-2500 characters                          |

See [Error Codes](/api-reference/errors) for the full error reference.

## Related links

* [Generation API Overview](/models)
* [Generate Task](/api-reference/generate-task)
* [Status Task](/api-reference/status-task)
* [Webhooks](/api-reference/webhooks)
* [Error Codes](/api-reference/errors)
* [Parameter Specification](/api-reference/parameters)
* [Routing Strategies](/concepts/routing-strategies)
* [Pricing](https://apixo.ai/pricing)
