# PixVerse V6

PixVerse V6 is PixVerse's video model. One model ID covers five modes: text to video, image to video, a transition between a first and a last frame, multi-image reference, and extending a clip you already made. The mode follows the fields you send. Clips are 1–15 seconds at 360p, 540p, 720p or 1080p, with optional native audio. Send the request, keep the returned task ID, and read the finished video from the task. Images go in as URLs.

## Model IDs

| Model ID      | Inputs                                                                                    | Resolutions                     | Length       |
| ------------- | ----------------------------------------------------------------------------------------- | ------------------------------- | ------------ |
| `pixverse-v6` | text, one image, first + last frame, 1–7 reference images, a completed `pixverse-v6` task | `360p`, `540p`, `720p`, `1080p` | 1–15 seconds |

See the [model page](https://seedrouter.ai/models/pixverse-v6#pricing) for current prices. For a single higher-detail shot from text or one image, see [PixVerse V6 Max](https://seedrouter.ai/docs/pixverse-v6-max).

## Quick example

```bash
curl https://api.seedrouter.ai/v1/videos/generations \
  -H "Authorization: Bearer $SEEDROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "pixverse-v6",
    "prompt": "A red paper boat drifting on a calm pond at sunrise, soft mist, slow push-in. No text, no logos.",
    "resolution": "540p",
    "duration": 5,
    "size": "16:9"
  }'
```

```python
import os
import requests

response = requests.post(
    "https://api.seedrouter.ai/v1/videos/generations",
    headers={"Authorization": f"Bearer {os.environ['SEEDROUTER_API_KEY']}"},
    json={
        "model": "pixverse-v6",
        "prompt": "A red paper boat drifting on a calm pond at sunrise, soft mist, slow push-in. No text, no logos.",
        "resolution": "540p",
        "duration": 5,
        "size": "16:9",
    },
    timeout=60,
)
response.raise_for_status()
task_id = response.json()["id"]
```

```javascript
const response = await fetch('https://api.seedrouter.ai/v1/videos/generations', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SEEDROUTER_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    model: 'pixverse-v6',
    prompt: 'A red paper boat drifting on a calm pond at sunrise, soft mist, slow push-in. No text, no logos.',
    resolution: '540p',
    duration: 5,
    size: '16:9',
  }),
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const { id: taskId } = await response.json();
```

```go
package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "os"
    "strings"
    "time"
)

func main() {
    body := strings.NewReader(`{
      "model": "pixverse-v6",
      "prompt": "A red paper boat drifting on a calm pond at sunrise, soft mist, slow push-in. No text, no logos.",
      "resolution": "540p",
      "duration": 5,
      "size": "16:9"
    }`)
    req, err := http.NewRequest("POST", "https://api.seedrouter.ai/v1/videos/generations", body)
    if err != nil { panic(err) }
    req.Header.Set("Authorization", "Bearer " + os.Getenv("SEEDROUTER_API_KEY"))
    req.Header.Set("Content-Type", "application/json")
    client := &http.Client{Timeout: 60 * time.Second}
    res, err := client.Do(req)
    if err != nil { panic(err) }
    defer res.Body.Close()
    if res.StatusCode != http.StatusOK { panic(res.Status) }
    var task struct { ID string `json:"id"` }
    if err := json.NewDecoder(res.Body).Decode(&task); err != nil { panic(err) }
    fmt.Println(task.ID)
}
```

## Endpoint

```text
POST https://api.seedrouter.ai/v1/videos/generations
```

| Header        | Value                 |
| ------------- | --------------------- |
| Authorization | `Bearer YOUR_API_KEY` |
| Content-Type  | `application/json`    |

The response is a task (`{"id": "task_...", "status": "processing"}`), not the finished video. Poll `GET /v1/tasks/{task_id}` for the result. Keep API keys in server-side code.

## Parameters

| Field                        | Type     | Default  | Notes                                                                                                                                          |
| ---------------------------- | -------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| `model`                      | string   | required | `pixverse-v6`                                                                                                                                  |
| `prompt`                     | string   | required | Up to 5,000 characters. Required in every mode.                                                                                                |
| `resolution`                 | enum     | `540p`   | `360p`, `540p`, `720p` or `1080p`.                                                                                                             |
| `duration`                   | integer  | `5`      | 1–15 seconds. A first/last frame transition takes only `5` or `8`.                                                                             |
| `size`                       | enum     | `16:9`   | `16:9`, `4:3`, `1:1`, `3:4`, `9:16`, `2:3`, `3:2` or `21:9`. Used by text to video and multi-image reference; other modes follow their images. |
| `audio`                      | boolean  | `false`  | Generate native audio. Billed at the audio rate.                                                                                               |
| `seed`                       | integer  | none     | 0–2147483647. The same request and seed give similar results.                                                                                  |
| `negative_prompt`            | string   | none     | What to keep out of the clip. Up to 2,048 characters.                                                                                          |
| `watermark`                  | boolean  | `false`  | Add a watermark.                                                                                                                               |
| `motion_mode`                | enum     | `normal` | Only `normal` is supported.                                                                                                                    |
| `generate_multi_clip_switch` | boolean  | `false`  | Multi-clip generation. Text and image to video only.                                                                                           |
| `image_urls`                 | URL list | none     | Image to video. The first image is used.                                                                                                       |
| `first_frame_image`          | URL      | none     | Transition: the first frame. Send it with `last_frame_image`.                                                                                  |
| `last_frame_image`           | URL      | none     | Transition: the last frame. Send it with `first_frame_image`.                                                                                  |
| `img_references`             | URL list | none     | Multi-image reference: 1–7 images.                                                                                                             |
| `extend_from_task_id`        | string   | none     | Extend: the ID of one of your completed `pixverse-v6` tasks.                                                                                   |

The schema is strict: unknown fields are rejected rather than ignored. `callback_url` is not available; poll the task instead.

## Modes

The fields you send pick the mode. Send the fields of one mode per request.

| Mode                  | Send                                     | Notes                                                                          |
| --------------------- | ---------------------------------------- | ------------------------------------------------------------------------------ |
| Text to video         | no image or extend fields                | `size` sets the shape.                                                         |
| Image to video        | `image_urls`                             | The clip starts from the first image.                                          |
| Transition            | `first_frame_image` + `last_frame_image` | 5 or 8 seconds.                                                                |
| Multi-image reference | `img_references` (1–7 URLs)              | Combines characters, objects or scenes from the images; `size` sets the shape. |
| Extend                | `extend_from_task_id`                    | Continues a completed `pixverse-v6` task of yours.                             |

```json
{
  "model": "pixverse-v6",
  "prompt": "The puppy slowly turns into a kitten, soft studio light.",
  "first_frame_image": "https://example.com/puppy.jpg",
  "last_frame_image": "https://example.com/kitten.jpg",
  "duration": 5
}
```

```json
{
  "model": "pixverse-v6",
  "prompt": "The paper boat drifts on toward a lily pad.",
  "extend_from_task_id": "task_...",
  "resolution": "540p",
  "duration": 5
}
```

An extend returns the source clip followed by the new segment, and bills only the new segment's `duration`. In our test, a 1-second extend of a 1-second clip came back 2.1 seconds long and was billed for 1 second.

## Media inputs

Images are public HTTP(S) URLs. Base64 data URIs are not accepted: upload the file to your own storage and pass its URL. Use JPG, PNG or WebP images of 20 MB or less.

## Pricing dimensions

Check the [model pricing section](https://seedrouter.ai/models/pixverse-v6#pricing) for current rates. PixVerse V6 is billed per second of video, at a rate set by the resolution and by whether audio is generated:

```text
cost = duration × rate per second for the resolution and audio setting
```

Every mode costs the same per second; an extend bills only the new segment. The duration is known when the request is accepted, so the amount reserved is the amount charged. View final charges in your account usage history. Failed tasks are not charged.

## Output schema

Submission returns the task:

```json
{"id": "task_...", "model": "pixverse-v6", "status": "processing", "created_at": 1789689600}
```

### Get the task

```text
GET https://api.seedrouter.ai/v1/tasks/{task_id}
```

Poll every 10–20 seconds until `status` is `completed` or `failed`. A network timeout while polling does not mean generation failed: keep the task ID and resume checking it. Do not create another task to check progress.

### Completed task

```json
{
  "id": "task_...",
  "model": "pixverse-v6",
  "status": "completed",
  "created_at": 1789689600,
  "finished_at": 1789689640,
  "output": {
    "video_url": "https://static.seedrouter.ai/media/tasks/task_example/0.mp4"
  }
}
```

In our tests 1-second `360p` `16:9` clips came back as MP4 (H.264) at 640 × 360, 36–45 seconds after submission.

## Errors

Requests rejected before a task is created return an HTTP error with an `error` object and are not charged. A task that fails after acceptance returns HTTP 200 when queried, with `status: "failed"` and an `error` object.

See the [shared error catalog](https://seedrouter.ai/docs/api/errors) for codes, HTTP statuses, and retry guidance.

```json
{
  "id": "task_...",
  "model": "pixverse-v6",
  "status": "failed",
  "error": {
    "code": 60001,
    "message": "The request was rejected by the content policy. Please revise the prompt or input images."
  }
}
```

If submission itself times out, check your tasks before submitting again: the first request may have been accepted.

## Tips

* Describe subject, place, camera move and light in the prompt; name the sounds you want when `audio` is on.
* Draft at `360p` or `540p`, then render the final shot at `1080p` with the same request and `seed`.
* For vertical video, send `size: "9:16"` with text to video, or a portrait image.
* Add `no text, no logos` to keep invented marks out.

## Related

* [PixVerse V6 Playground and pricing](https://seedrouter.ai/models/pixverse-v6)
* [PixVerse V6 Max API reference](https://seedrouter.ai/docs/pixverse-v6-max)
* [Download OpenAPI](https://seedrouter.ai/docs/pixverse-v6.openapi.json)
* [Copyable Markdown](https://seedrouter.ai/docs/pixverse-v6.md)
