# Kling 3.0 Turbo

Kling 3.0 Turbo is a video model in Kuaishou's Kling 3.0 family. One request makes a 3–15 second clip with sound from a prompt, or from a prompt plus a first frame, at 720p or 1080p. 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       |
| ----------------- | ----------------- | --------------- | ------------ |
| `kling-3-0-turbo` | text, first frame | `720p`, `1080p` | 3–15 seconds |

See the [model page](https://seedrouter.ai/models/kling-3-0-turbo#pricing) for current prices.

## Quick example

```bash
curl https://api.seedrouter.ai/v1/videos/generations \
  -H "Authorization: Bearer $SEEDROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "kling-3-0-turbo",
    "prompt": "A red paper boat drifting on a calm pond at sunrise, soft mist, slow push-in. No text, no logos.",
    "resolution": "720p",
    "duration": 5,
    "aspect_ratio": "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": "kling-3-0-turbo",
        "prompt": "A red paper boat drifting on a calm pond at sunrise, soft mist, slow push-in. No text, no logos.",
        "resolution": "720p",
        "duration": 5,
        "aspect_ratio": "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: 'kling-3-0-turbo',
    prompt: 'A red paper boat drifting on a calm pond at sunrise, soft mist, slow push-in. No text, no logos.',
    resolution: '720p',
    duration: 5,
    aspect_ratio: '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": "kling-3-0-turbo",
      "prompt": "A red paper boat drifting on a calm pond at sunrise, soft mist, slow push-in. No text, no logos.",
      "resolution": "720p",
      "duration": 5,
      "aspect_ratio": "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 | `kling-3-0-turbo`                                                                          |
| `prompt`            | string  | required | Up to 3,072 characters, or 2,500 with a first frame. Required with a first frame too.      |
| `first_frame_image` | URL     | none     | The clip's first frame. Without it the clip is text to video.                              |
| `resolution`        | enum    | `720p`   | `720p` or `1080p`.                                                                         |
| `duration`          | integer | `5`      | 3–15 seconds.                                                                              |
| `aspect_ratio`      | enum    | `16:9`   | `16:9`, `9:16` or `1:1`. Text to video only: with a first frame, the frame sets the shape. |
| `watermark`         | boolean | none     | `true` adds a watermark. Left out, the clip has none.                                      |

Every clip comes with sound; there is no sound setting. The schema is strict: unknown fields are rejected rather than ignored. `callback_url` is not available; poll the task instead.

## Image to video

Pass a first frame in `first_frame_image` and describe what happens next in `prompt`. The clip opens on the frame and takes its shape, so `aspect_ratio` is not used.

```json
{
  "model": "kling-3-0-turbo",
  "prompt": "The subject slowly turns toward the camera, soft natural light, gentle breeze.",
  "first_frame_image": "https://example.com/frame.png",
  "resolution": "1080p",
  "duration": 5
}
```

## Media inputs

The first frame is a public HTTP(S) URL. Base64 data URIs are not accepted: upload the file to your own storage and pass its URL. Use a JPG or PNG image of 10 MB or less.

## Pricing dimensions

Check the [model pricing section](https://seedrouter.ai/models/kling-3-0-turbo#pricing) for current rates. Kling 3.0 Turbo is billed per second of video, at a rate set by the resolution:

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

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": "kling-3-0-turbo", "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": "kling-3-0-turbo",
  "status": "completed",
  "created_at": 1789689600,
  "finished_at": 1789689710,
  "output": {
    "video_url": "https://static.seedrouter.ai/media/tasks/task_example/0.mp4"
  }
}
```

In our tests 3-second `720p` clips came back as MP4 (H.264) at 1280 × 720 and 5-second `1080p` clips at 1920 × 1080, all with a stereo audio track, between 54 seconds and about 5 minutes 20 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": "kling-3-0-turbo",
  "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 one sentence each; camera language such as "slow push-in" and "low angle" is followed.
* Draft at `720p`, then render the final shot at `1080p` with the same request.
* With a first frame, describe only what moves: the frame already sets the scene.
* Add `no text, no logos` to keep invented marks out.

## Related

* [Kling 3.0 Turbo Playground and pricing](https://seedrouter.ai/models/kling-3-0-turbo)
* [Kling 3.0 API reference](https://seedrouter.ai/docs/kling-3-0)
* [Download OpenAPI](https://seedrouter.ai/docs/kling-3-0-turbo.openapi.json)
* [Copyable Markdown](https://seedrouter.ai/docs/kling-3-0-turbo.md)
