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-edit",
"prompt": "Replace the cloudy sky in @video_1 with the sunset sky from @image_1, keep everything else unchanged.",
"video_urls": [
"https://cdn.example.com/source-clip.mp4"
],
"image_urls": [
"https://cdn.example.com/kling-ref-1.jpg"
],
"resolution": "1080p",
"keep_original_sound": true
}'import os
import requests
payload = {
"model": "kling-3.0-omni-edit",
"prompt": "Replace the cloudy sky in @video_1 with the sunset sky from @image_1, keep everything else unchanged.",
"video_urls": [
"https://cdn.example.com/source-clip.mp4"
],
"image_urls": [
"https://cdn.example.com/kling-ref-1.jpg"
],
"resolution": "1080p",
"keep_original_sound": True
}
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())package main
import (
"bytes"
"fmt"
"io"
"net/http"
"os"
)
func main() {
body := []byte(`{
"model": "kling-3.0-omni-edit",
"prompt": "Replace the cloudy sky in @video_1 with the sunset sky from @image_1, keep everything else unchanged.",
"video_urls": [
"https://cdn.example.com/source-clip.mp4"
],
"image_urls": [
"https://cdn.example.com/kling-ref-1.jpg"
],
"resolution": "1080p",
"keep_original_sound": true
}`)
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))
}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-edit",
"prompt": "Replace the cloudy sky in @video_1 with the sunset sky from @image_1, keep everything else unchanged.",
"video_urls": [
"https://cdn.example.com/source-clip.mp4"
],
"image_urls": [
"https://cdn.example.com/kling-ref-1.jpg"
],
"resolution": "1080p",
"keep_original_sound": true
});
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(())
}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-edit",
"prompt": "Replace the cloudy sky in @video_1 with the sunset sky from @image_1, keep everything else unchanged.",
"video_urls": [
"https://cdn.example.com/source-clip.mp4"
],
"image_urls": [
"https://cdn.example.com/kling-ref-1.jpg"
],
"resolution": "1080p",
"keep_original_sound": true
}),
});
if (!response.ok) {
throw new Error(`APIPod request failed: ${response.status} ${await response.text()}`);
}
console.log(await response.json());{
"code": 200,
"message": "success",
"data": {
"task_id": "vid_task_01JEXAMPLE"
}
}Kling 3.0 Omni Video Edit
Kling 3.0 Omni Edit is APIPod’s video editing mode for Kling 3.0 Omni, rewriting a source video from a text instruction with up to 4 optional reference images.
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-edit",
"prompt": "Replace the cloudy sky in @video_1 with the sunset sky from @image_1, keep everything else unchanged.",
"video_urls": [
"https://cdn.example.com/source-clip.mp4"
],
"image_urls": [
"https://cdn.example.com/kling-ref-1.jpg"
],
"resolution": "1080p",
"keep_original_sound": true
}'import os
import requests
payload = {
"model": "kling-3.0-omni-edit",
"prompt": "Replace the cloudy sky in @video_1 with the sunset sky from @image_1, keep everything else unchanged.",
"video_urls": [
"https://cdn.example.com/source-clip.mp4"
],
"image_urls": [
"https://cdn.example.com/kling-ref-1.jpg"
],
"resolution": "1080p",
"keep_original_sound": True
}
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())package main
import (
"bytes"
"fmt"
"io"
"net/http"
"os"
)
func main() {
body := []byte(`{
"model": "kling-3.0-omni-edit",
"prompt": "Replace the cloudy sky in @video_1 with the sunset sky from @image_1, keep everything else unchanged.",
"video_urls": [
"https://cdn.example.com/source-clip.mp4"
],
"image_urls": [
"https://cdn.example.com/kling-ref-1.jpg"
],
"resolution": "1080p",
"keep_original_sound": true
}`)
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))
}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-edit",
"prompt": "Replace the cloudy sky in @video_1 with the sunset sky from @image_1, keep everything else unchanged.",
"video_urls": [
"https://cdn.example.com/source-clip.mp4"
],
"image_urls": [
"https://cdn.example.com/kling-ref-1.jpg"
],
"resolution": "1080p",
"keep_original_sound": true
});
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(())
}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-edit",
"prompt": "Replace the cloudy sky in @video_1 with the sunset sky from @image_1, keep everything else unchanged.",
"video_urls": [
"https://cdn.example.com/source-clip.mp4"
],
"image_urls": [
"https://cdn.example.com/kling-ref-1.jpg"
],
"resolution": "1080p",
"keep_original_sound": true
}),
});
if (!response.ok) {
throw new Error(`APIPod request failed: ${response.status} ${await response.text()}`);
}
console.log(await response.json());{
"code": 200,
"message": "success",
"data": {
"task_id": "vid_task_01JEXAMPLE"
}
}Usage notes
- Source video: pass exactly one MP4/MOV video (3-15.5 seconds) in
video_urls, plus up to 4 optional reference images. Output duration and aspect ratio follow the source video, sodurationandaspect_ratioare not accepted. Setkeep_original_soundtotrueto keep the original audio. - Referencing inputs: images are numbered
image_1..image_Nin order and the video isvideo_1. Use@image_1/@video_1in the prompt to point at a specific input. - Not supported:
negative_prompt(write exclusions into the prompt),audio_urls, andvideo_url(usevideo_urls).
Billing
Billed per second of the source video duration (rounded up to whole seconds), using the enhanced tier for 720p/1080p (or the 4K tier). 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.Task flow
The create call returnsdata.task_id. Poll 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.Authorizations
Use your APIPod API key as a Bearer token in the Authorization header.
Body
Public APIPod model ID.
"kling-3.0-omni-edit"Required editing instruction, up to 2,500 characters. 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.
2500Exactly one source video URL to edit (MP4 or MOV, 3-15.5 seconds). The output duration and aspect ratio follow this video.
1 elementOptional reference image URLs (up to 4).
4Output resolution. Defaults to 720p. The per-second rate depends on the resolution tier.
720p, 1080p, 4k Keep the audio track of the source video. Defaults to false (the output has no original audio).
When true, an additional watermarked copy is generated and the watermarked copy is returned as the result.
HTTPS URL that receives the task's terminal state.
Was this page helpful?