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

# Kling 3.0 Omni Image to Video

> Kling 3.0 Omni I2V is APIPod's first/last-frame image-to-video mode for Kling 3.0 Omni, the unified Kling 3.0 model with up to 4K output.

## Usage notes

* **First / last frame**: `image_urls[0]` is the first frame and the optional `image_urls[1]` is the last frame. The output aspect ratio follows the first frame.
* **Referencing inputs**: images are numbered `image_1`..`image_N` in order and the video is `video_1`. Use `@image_1` / `@video_1` in the prompt to point at a specific input.
* **Multi-shot**: set `multi_shot` to `true` without `multi_prompt` to let the model split the prompt into shots automatically, or describe up to 6 shots in `multi_prompt` (`{prompt, duration}`, up to 512 characters each) whose durations add up to exactly `duration`.
* **Not supported**: `negative_prompt` (write exclusions into the prompt), `audio_urls`, and `video_url` (use `video_urls`).

## Billing

Billed per second of output video. The per-second rate depends on the tier: 720p basic, 720p enhanced, 1080p basic, 1080p enhanced, or 4K. The enhanced tier applies when native audio is enabled or any video input is provided. Current prices are shown on the [model page](https://www.apipod.ai/models).

## Task flow

The create call returns `data.task_id`. Poll [Query video task](/query-video-task) until `status` is `completed` (outputs in `data.result`) or `failed`, or pass `callback_url` to be notified when the task reaches a terminal state.


## OpenAPI

````yaml api-reference/openapi/kling-3.0--kling-3.0-omni-i2v.yaml POST /v1/videos/generations
openapi: 3.1.0
info:
  title: Kling 3.0 Omni Image to Video API
  version: 1.0.0
  description: >-
    Kling 3.0 Omni I2V is APIPod's first/last-frame image-to-video mode for
    Kling 3.0 Omni, the unified Kling 3.0 model with up to 4K output. In APIPod,
    the public model ID is kling-3.0-omni-i2v. It requires a first frame,
    accepts an optional last frame, and returns results through asynchronous
    video tasks.
servers:
  - url: https://api.apipod.ai
    description: Production
security: []
paths:
  /v1/videos/generations:
    post:
      tags:
        - Kling 3.0 Omni Image to Video
      summary: Create Generation Task
      description: >-
        Kling 3.0 Omni I2V is APIPod's first/last-frame image-to-video mode for
        Kling 3.0 Omni, the unified Kling 3.0 model with up to 4K output. In
        APIPod, the public model ID is kling-3.0-omni-i2v. It requires a first
        frame, accepts an optional last frame, and returns results through
        asynchronous video tasks.
      operationId: create-kling-3.0-kling-3.0-omni-i2v
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              title: Kling 3.0 Omni Image to Video
              properties:
                model:
                  type: string
                  title: Model ID
                  description: Public APIPod model ID.
                  const: kling-3.0-omni-i2v
                prompt:
                  type: string
                  title: Prompt
                  description: >-
                    Text prompt, up to 2,500 characters; required unless
                    `multi_prompt` is provided. Inputs are numbered
                    automatically: images become `image_1`..`image_N` in order
                    and the video becomes `video_1`; reference them in the
                    prompt as `@image_1` or `@video_1`.
                  maxLength: 2500
                image_urls:
                  type: array
                  title: Image Urls
                  description: >-
                    First frame URL, optionally followed by a last frame URL
                    (1-2 images). `first_frame_image` / `last_frame_image` are
                    accepted as aliases. The aspect ratio follows the first
                    frame.
                  minItems: 1
                  maxItems: 2
                  items:
                    type: string
                duration:
                  type: integer
                  title: Duration
                  description: >-
                    Output duration in seconds (3-15). Defaults to 5. With
                    `multi_prompt`, the shot durations must add up to exactly
                    this value; when omitted it defaults to the sum of the shot
                    durations.
                  minimum: 3
                  maximum: 15
                  default: 5
                resolution:
                  type: string
                  title: Resolution
                  description: >-
                    Output resolution. Defaults to 720p. The per-second rate
                    depends on the resolution tier.
                  enum:
                    - 720p
                    - 1080p
                    - 4k
                  default: 720p
                generate_audio:
                  type: boolean
                  title: Generate Audio
                  description: >-
                    Generate native audio (alias `audio`). Defaults to false.
                    Enabling it uses the enhanced billing tier.
                  default: false
                multi_shot:
                  type: boolean
                  title: Multi Shot
                  description: >-
                    Enable multi-shot generation (alias `multi_shots`). Without
                    `multi_prompt`, the model splits the prompt into shots
                    automatically.
                multi_prompt:
                  type: array
                  title: Multi Prompt
                  description: >-
                    Shot list for multi-shot generation, up to 6 shots. Each
                    shot is `{prompt, duration}` with a prompt of up to 512
                    characters; the shot durations must add up to `duration`
                    (3-15 seconds).
                  maxItems: 6
                  items:
                    type: object
                    properties:
                      prompt:
                        type: string
                        description: Shot description, up to 512 characters.
                        maxLength: 512
                      duration:
                        type: integer
                        description: Shot duration in seconds (1-15).
                        minimum: 1
                        maximum: 15
                    required:
                      - prompt
                      - duration
                watermark:
                  type: boolean
                  title: Watermark
                  description: >-
                    When true, an additional watermarked copy is generated and
                    the watermarked copy is returned as the result.
                  default: false
                callback_url:
                  type: string
                  title: Callback URL
                  description: HTTPS URL that receives the task's terminal state.
                  default: ''
              required:
                - model
                - image_urls
            examples:
              basic:
                summary: First and last frame
                value:
                  model: kling-3.0-omni-i2v
                  prompt: >-
                    The flower bud in @image_1 slowly blooms into the open
                    flower in @image_2, macro lens.
                  image_urls:
                    - https://cdn.example.com/first-frame.jpg
                    - https://cdn.example.com/last-frame.jpg
                  duration: 5
                  resolution: 1080p
              multi_shot:
                summary: Multi-shot from a first frame
                value:
                  model: kling-3.0-omni-i2v
                  image_urls:
                    - https://cdn.example.com/first-frame.jpg
                  multi_shot: true
                  multi_prompt:
                    - prompt: >-
                        Wide shot: a lighthouse on a rocky cliff at dawn, waves
                        crashing below.
                      duration: 2
                    - prompt: >-
                        Medium shot: the keeper climbs the spiral staircase
                        holding a lantern.
                      duration: 3
                    - prompt: >-
                        Close-up: the lamp turns on and sweeps light across the
                        fog.
                      duration: 3
                  duration: 8
                  resolution: 720p
      responses:
        '200':
          description: Task accepted
          content:
            application/json:
              schema:
                type: object
                title: Task Submit Response
                description: Standard response for task submission
                properties:
                  code:
                    type: integer
                  data:
                    type: object
                    title: Task Submit Data
                    description: Data content for task submission
                    properties:
                      task_id:
                        type: string
                        description: Task ID used to query the task status.
                  message:
                    type: string
                required:
                  - code
                  - message
                  - data
              example:
                code: 200
                message: success
                data:
                  task_id: vid_task_01JEXAMPLE
      security:
        - bearerAuth: []
      x-codeSamples:
        - lang: Shell
          label: cURL
          source: |-
            curl https://api.apipod.ai/v1/videos/generations \
              -H "Authorization: Bearer $APIPOD_API_KEY" \
              -H "Content-Type: application/json" \
              -d '{
              "model": "kling-3.0-omni-i2v",
              "prompt": "The flower bud in @image_1 slowly blooms into the open flower in @image_2, macro lens.",
              "image_urls": [
                "https://cdn.example.com/first-frame.jpg",
                "https://cdn.example.com/last-frame.jpg"
              ],
              "duration": 5,
              "resolution": "1080p"
            }'
        - lang: Python
          label: Python
          source: |-
            import os
            import requests

            payload = {
              "model": "kling-3.0-omni-i2v",
              "prompt": "The flower bud in @image_1 slowly blooms into the open flower in @image_2, macro lens.",
              "image_urls": [
                "https://cdn.example.com/first-frame.jpg",
                "https://cdn.example.com/last-frame.jpg"
              ],
              "duration": 5,
              "resolution": "1080p"
            }

            response = requests.post(
                "https://api.apipod.ai/v1/videos/generations",
                headers={
                    "Authorization": f"Bearer {os.environ['APIPOD_API_KEY']}",
                    "Content-Type": "application/json",
                },
                json=payload,
                timeout=60,
            )
            response.raise_for_status()
            print(response.json())
        - lang: Go
          label: Go
          source: |-
            package main

            import (
                "bytes"
                "fmt"
                "io"
                "net/http"
                "os"
            )

            func main() {
                body := []byte(`{
              "model": "kling-3.0-omni-i2v",
              "prompt": "The flower bud in @image_1 slowly blooms into the open flower in @image_2, macro lens.",
              "image_urls": [
                "https://cdn.example.com/first-frame.jpg",
                "https://cdn.example.com/last-frame.jpg"
              ],
              "duration": 5,
              "resolution": "1080p"
            }`)

                req, err := http.NewRequest(http.MethodPost, "https://api.apipod.ai/v1/videos/generations", bytes.NewReader(body))
                if err != nil {
                    panic(err)
                }
                req.Header.Set("Authorization", "Bearer "+os.Getenv("APIPOD_API_KEY"))
                req.Header.Set("Content-Type", "application/json")

                resp, err := http.DefaultClient.Do(req)
                if err != nil {
                    panic(err)
                }
                defer resp.Body.Close()
                out, _ := io.ReadAll(resp.Body)
                fmt.Println(resp.Status, string(out))
            }
        - lang: Rust
          label: Rust
          source: |-
            use reqwest::Client;
            use serde_json::json;
            use std::env;

            #[tokio::main]
            async fn main() -> Result<(), Box<dyn std::error::Error>> {
                let payload = json!({
                  "model": "kling-3.0-omni-i2v",
                  "prompt": "The flower bud in @image_1 slowly blooms into the open flower in @image_2, macro lens.",
                  "image_urls": [
                    "https://cdn.example.com/first-frame.jpg",
                    "https://cdn.example.com/last-frame.jpg"
                  ],
                  "duration": 5,
                  "resolution": "1080p"
                });
                let response = Client::new()
                    .post("https://api.apipod.ai/v1/videos/generations")
                    .bearer_auth(env::var("APIPOD_API_KEY")?)
                    .json(&payload)
                    .send()
                    .await?
                    .error_for_status()?;

                println!("{}", response.text().await?);
                Ok(())
            }
        - lang: JavaScript
          label: JavaScript
          source: >-
            const response = await
            fetch("https://api.apipod.ai/v1/videos/generations", {
              method: "POST",
              headers: {
                Authorization: `Bearer ${process.env.APIPOD_API_KEY}`,
                "Content-Type": "application/json",
              },
              body: JSON.stringify({
                "model": "kling-3.0-omni-i2v",
                "prompt": "The flower bud in @image_1 slowly blooms into the open flower in @image_2, macro lens.",
                "image_urls": [
                  "https://cdn.example.com/first-frame.jpg",
                  "https://cdn.example.com/last-frame.jpg"
                ],
                "duration": 5,
                "resolution": "1080p"
              }),
            });


            if (!response.ok) {
              throw new Error(`APIPod request failed: ${response.status} ${await response.text()}`);
            }


            console.log(await response.json());
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: APIPod API key
      description: Use your APIPod API key as a Bearer token in the Authorization header.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.