Langsung ke konten utama
POST
/
v1
/
videos
/
generations
curl --request POST \
  --url https://api.apimart.ai/v1/videos/generations \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '{
    "model": "skyreels-v4-fast",
    "prompt": "A serene forest at sunset with golden light filtering through the trees.",
    "duration": 5,
    "resolution": "1080p",
    "aspect_ratio": "16:9",
    "prompt_optimizer": true
  }'
import requests

url = "https://api.apimart.ai/v1/videos/generations"

payload = {
    "model": "skyreels-v4-fast",
    "prompt": "A serene forest at sunset with golden light filtering through the trees.",
    "duration": 5,
    "resolution": "1080p",
    "aspect_ratio": "16:9",
    "prompt_optimizer": True
}

headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
const url = "https://api.apimart.ai/v1/videos/generations";

const payload = {
  model: "skyreels-v4-fast",
  prompt: "A serene forest at sunset with golden light filtering through the trees.",
  duration: 5,
  resolution: "1080p",
  aspect_ratio: "16:9",
  prompt_optimizer: true
};

const headers = {
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
};

fetch(url, {
  method: "POST",
  headers: headers,
  body: JSON.stringify(payload)
})
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Error:', error));
package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    url := "https://api.apimart.ai/v1/videos/generations"

    payload := map[string]interface{}{
        "model":            "skyreels-v4-fast",
        "prompt":           "A serene forest at sunset with golden light filtering through the trees.",
        "duration":         5,
        "resolution":       "1080p",
        "aspect_ratio":     "16:9",
        "prompt_optimizer": true,
    }

    jsonData, _ := json.Marshal(payload)

    req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
    req.Header.Set("Authorization", "Bearer <token>")
    req.Header.Set("Content-Type", "application/json")

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;

public class Main {
    public static void main(String[] args) throws Exception {
        String url = "https://api.apimart.ai/v1/videos/generations";

        String payload = """
        {
          "model": "skyreels-v4-fast",
          "prompt": "A serene forest at sunset with golden light filtering through the trees.",
          "duration": 5,
          "resolution": "1080p",
          "aspect_ratio": "16:9",
          "prompt_optimizer": true
        }
        """;

        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(url))
            .header("Authorization", "Bearer <token>")
            .header("Content-Type", "application/json")
            .POST(HttpRequest.BodyPublishers.ofString(payload))
            .build();

        HttpResponse<String> response = client.send(request,
            HttpResponse.BodyHandlers.ofString());

        System.out.println(response.body());
    }
}
<?php

$url = "https://api.apimart.ai/v1/videos/generations";

$payload = [
    "model" => "skyreels-v4-fast",
    "prompt" => "A serene forest at sunset with golden light filtering through the trees.",
    "duration" => 5,
    "resolution" => "1080p",
    "aspect_ratio" => "16:9",
    "prompt_optimizer" => true
];

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    "Authorization: Bearer <token>",
    "Content-Type: application/json"
]);

$response = curl_exec($ch);
curl_close($ch);

echo $response;
?>
require 'net/http'
require 'json'
require 'uri'

url = URI("https://api.apimart.ai/v1/videos/generations")

payload = {
  model: "skyreels-v4-fast",
  prompt: "A serene forest at sunset with golden light filtering through the trees.",
  duration: 5,
  resolution: "1080p",
  aspect_ratio: "16:9",
  prompt_optimizer: true
}

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = "Bearer <token>"
request["Content-Type"] = "application/json"
request.body = payload.to_json

response = http.request(request)
puts response.body
import Foundation

let url = URL(string: "https://api.apimart.ai/v1/videos/generations")!

let payload: [String: Any] = [
    "model": "skyreels-v4-fast",
    "prompt": "A serene forest at sunset with golden light filtering through the trees.",
    "duration": 5,
    "resolution": "1080p",
    "aspect_ratio": "16:9",
    "prompt_optimizer": true
]

var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("Bearer <token>", forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = try? JSONSerialization.data(withJSONObject: payload)

let task = URLSession.shared.dataTask(with: request) { data, response, error in
    if let error = error {
        print("Error: \(error)")
        return
    }

    if let data = data, let responseString = String(data: data, encoding: .utf8) {
        print(responseString)
    }
}

task.resume()
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var url = "https://api.apimart.ai/v1/videos/generations";

        var payload = @"{
            ""model"": ""skyreels-v4-fast"",
            ""prompt"": ""A serene forest at sunset with golden light filtering through the trees."",
            ""duration"": 5,
            ""resolution"": ""1080p"",
            ""aspect_ratio"": ""16:9"",
            ""prompt_optimizer"": true
        }";

        using var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", "Bearer <token>");

        var content = new StringContent(payload, Encoding.UTF8, "application/json");
        var response = await client.PostAsync(url, content);
        var result = await response.Content.ReadAsStringAsync();

        Console.WriteLine(result);
    }
}
{
  "code": 200,
  "data": [
    {
      "status": "submitted",
      "task_id": "task_01KPEY5H3NQ2W8D7T6VB3F9GR4"
    }
  ]
}
{
  "error": {
    "code": 400,
    "message": "Invalid request parameters",
    "type": "invalid_request_error"
  }
}
{
  "error": {
    "code": 401,
    "message": "Authentication failed, please check your API key",
    "type": "authentication_error"
  }
}
{
  "error": {
    "code": 402,
    "message": "Insufficient account balance, please top up and try again",
    "type": "payment_required"
  }
}
{
  "error": {
    "code": 422,
    "message": "Parameter conflict or invalid value (e.g. I2V and Omni fields passed simultaneously)",
    "type": "invalid_request_error"
  }
}
{
  "error": {
    "code": 429,
    "message": "Too many requests, please try again later",
    "type": "rate_limit_error"
  }
}
{
  "error": {
    "code": 500,
    "message": "Internal server error, please retry later",
    "type": "server_error"
  }
}
curl --request POST \
  --url https://api.apimart.ai/v1/videos/generations \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '{
    "model": "skyreels-v4-fast",
    "prompt": "A serene forest at sunset with golden light filtering through the trees.",
    "duration": 5,
    "resolution": "1080p",
    "aspect_ratio": "16:9",
    "prompt_optimizer": true
  }'
import requests

url = "https://api.apimart.ai/v1/videos/generations"

payload = {
    "model": "skyreels-v4-fast",
    "prompt": "A serene forest at sunset with golden light filtering through the trees.",
    "duration": 5,
    "resolution": "1080p",
    "aspect_ratio": "16:9",
    "prompt_optimizer": True
}

headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
const url = "https://api.apimart.ai/v1/videos/generations";

const payload = {
  model: "skyreels-v4-fast",
  prompt: "A serene forest at sunset with golden light filtering through the trees.",
  duration: 5,
  resolution: "1080p",
  aspect_ratio: "16:9",
  prompt_optimizer: true
};

const headers = {
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
};

fetch(url, {
  method: "POST",
  headers: headers,
  body: JSON.stringify(payload)
})
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Error:', error));
package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    url := "https://api.apimart.ai/v1/videos/generations"

    payload := map[string]interface{}{
        "model":            "skyreels-v4-fast",
        "prompt":           "A serene forest at sunset with golden light filtering through the trees.",
        "duration":         5,
        "resolution":       "1080p",
        "aspect_ratio":     "16:9",
        "prompt_optimizer": true,
    }

    jsonData, _ := json.Marshal(payload)

    req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
    req.Header.Set("Authorization", "Bearer <token>")
    req.Header.Set("Content-Type", "application/json")

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;

public class Main {
    public static void main(String[] args) throws Exception {
        String url = "https://api.apimart.ai/v1/videos/generations";

        String payload = """
        {
          "model": "skyreels-v4-fast",
          "prompt": "A serene forest at sunset with golden light filtering through the trees.",
          "duration": 5,
          "resolution": "1080p",
          "aspect_ratio": "16:9",
          "prompt_optimizer": true
        }
        """;

        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(url))
            .header("Authorization", "Bearer <token>")
            .header("Content-Type", "application/json")
            .POST(HttpRequest.BodyPublishers.ofString(payload))
            .build();

        HttpResponse<String> response = client.send(request,
            HttpResponse.BodyHandlers.ofString());

        System.out.println(response.body());
    }
}
<?php

$url = "https://api.apimart.ai/v1/videos/generations";

$payload = [
    "model" => "skyreels-v4-fast",
    "prompt" => "A serene forest at sunset with golden light filtering through the trees.",
    "duration" => 5,
    "resolution" => "1080p",
    "aspect_ratio" => "16:9",
    "prompt_optimizer" => true
];

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    "Authorization: Bearer <token>",
    "Content-Type: application/json"
]);

$response = curl_exec($ch);
curl_close($ch);

echo $response;
?>
require 'net/http'
require 'json'
require 'uri'

url = URI("https://api.apimart.ai/v1/videos/generations")

payload = {
  model: "skyreels-v4-fast",
  prompt: "A serene forest at sunset with golden light filtering through the trees.",
  duration: 5,
  resolution: "1080p",
  aspect_ratio: "16:9",
  prompt_optimizer: true
}

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = "Bearer <token>"
request["Content-Type"] = "application/json"
request.body = payload.to_json

response = http.request(request)
puts response.body
import Foundation

let url = URL(string: "https://api.apimart.ai/v1/videos/generations")!

let payload: [String: Any] = [
    "model": "skyreels-v4-fast",
    "prompt": "A serene forest at sunset with golden light filtering through the trees.",
    "duration": 5,
    "resolution": "1080p",
    "aspect_ratio": "16:9",
    "prompt_optimizer": true
]

var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("Bearer <token>", forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = try? JSONSerialization.data(withJSONObject: payload)

let task = URLSession.shared.dataTask(with: request) { data, response, error in
    if let error = error {
        print("Error: \(error)")
        return
    }

    if let data = data, let responseString = String(data: data, encoding: .utf8) {
        print(responseString)
    }
}

task.resume()
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var url = "https://api.apimart.ai/v1/videos/generations";

        var payload = @"{
            ""model"": ""skyreels-v4-fast"",
            ""prompt"": ""A serene forest at sunset with golden light filtering through the trees."",
            ""duration"": 5,
            ""resolution"": ""1080p"",
            ""aspect_ratio"": ""16:9"",
            ""prompt_optimizer"": true
        }";

        using var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", "Bearer <token>");

        var content = new StringContent(payload, Encoding.UTF8, "application/json");
        var response = await client.PostAsync(url, content);
        var result = await response.Content.ReadAsStringAsync();

        Console.WriteLine(result);
    }
}
{
  "code": 200,
  "data": [
    {
      "status": "submitted",
      "task_id": "task_01KPEY5H3NQ2W8D7T6VB3F9GR4"
    }
  ]
}
{
  "error": {
    "code": 400,
    "message": "Invalid request parameters",
    "type": "invalid_request_error"
  }
}
{
  "error": {
    "code": 401,
    "message": "Authentication failed, please check your API key",
    "type": "authentication_error"
  }
}
{
  "error": {
    "code": 402,
    "message": "Insufficient account balance, please top up and try again",
    "type": "payment_required"
  }
}
{
  "error": {
    "code": 422,
    "message": "Parameter conflict or invalid value (e.g. I2V and Omni fields passed simultaneously)",
    "type": "invalid_request_error"
  }
}
{
  "error": {
    "code": 429,
    "message": "Too many requests, please try again later",
    "type": "rate_limit_error"
  }
}
{
  "error": {
    "code": 500,
    "message": "Internal server error, please retry later",
    "type": "server_error"
  }
}

Otorisasi

Authorization
string
wajib
Semua endpoint API memerlukan autentikasi Bearer TokenDapatkan API Key Anda:Kunjungi Halaman Manajemen API Key untuk mendapatkan API Key AndaTambahkan ke header permintaan:
Authorization: Bearer YOUR_API_KEY

Mode Pembuatan

SkyReels V4 otomatis merutekan ke mode yang benar berdasarkan field permintaan — tanpa mode field diperlukan:
ModePemicuKemampuan
T2V (Teks-ke-Video)Hanya prompt + field umumPembuatan murni berbasis teks
I2V (Gambar-ke-Video)Salah satu dari first_frame_image / end_frame_image / mid_frame_imagesKontrol frame pertama/akhir/kunci
Omni (Referensi Multimodal)Salah satu dari ref_images / ref_videosSubjek referensi, kolase grid, gerakan referensi, perpanjangan video, sinkronisasi audio
Saling eksklusif secara ketat: Field I2V (first_frame_image / end_frame_image / mid_frame_images) dan field Omni (ref_images / ref_videos) tidak dapat digunakan bersama, jika tidak akan mengembalikan 422.
Mekanisme @tag: Saat menggunakan mid_frame_images / ref_images / ref_videos, setiap elemen harus mendeklarasikan tag yang dimulai dengan @ (misalnya, @image1, @Actor-1, @video1), dan tag harus muncul di prompt.Anggap prompt sebagai “skrip” dan tag sebagai “penunjuk karakter” ke aset tertentu (gambar / video). Misalnya, prompt seperti "@Actor-1 walks into the scene of @video1" menginstruksikan sistem untuk memasukkan gambar referensi subjek yang ditautkan ke @Actor-1 dan gerakan referensi yang ditautkan ke @video1 ke dalam proses pembuatan.

Parameter Permintaan

Field Umum

model
string
wajib
Tersedia dua tingkat model:
ModelPosisiKasus Penggunaan
skyreels-v4-fastPrioritas kecepatanPratinjau cepat, pembuatan batch, konten harian
skyreels-v4-stdPrioritas kualitas (25~30% lebih mahal daripada Cepat)Shot penting, kebutuhan detail tinggi, pengiriman formal
Field model harus disediakan secara eksplisit — tidak ada nilai default.
Harga sangat terkait dengan resolusi dan apakah ref_videos digunakan: 1080p jauh lebih mahal daripada 480p / 720p; tier dengan ref_videos (input video) berbiaya ~1,5 ~ 2× dibandingkan yang tanpa itu. Output audio dan video secara bersamaan belum didukung.
prompt
string
wajib
Prompt teks, maksimum 1280 tokensJelaskan adegan, subjek, aksi, dan gaya secara detail untuk hasil pembuatan yang lebih baik.Saat menggunakan ref_images / ref_videos / mid_frame_images, prompt harus berisi @tag terkait (misalnya, @Actor-1, @video1, @image1).Contoh: "@Actor-1 walks through a neon-lit street at night."
duration
integer
default:"5"
Durasi video output (detik)
  • Rentang: [3, 15]
  • Default: 5
Saat ref_videos.type=reference disediakan, duration ditimpa oleh durasi video referensi (maks. 10 detik).
resolution
string
default:"1080p"
Resolusi videoOpsi:
  • 480p
  • 720p
  • 1080p (default)
aspect_ratio
string
default:"16:9"
Rasio aspekOpsi:
  • 16:9 (default)
  • 4:3
  • 1:1
  • 9:16
  • 3:4
aspect_ratio diabaikan dalam mode I2V (rasio output ditentukan oleh gambar input); juga diabaikan saat Omni dikombinasikan dengan ref_videos.
prompt_optimizer
boolean
default:"true"
Apakah mengoptimalkan prompt secara otomatisJika diaktifkan, sistem otomatis mengoptimalkan prompt Anda untuk hasil pembuatan yang lebih baik.

Field Khusus I2V

first_frame_image
string
URL gambar frame pertama (jpg / jpeg / png / gif / bmp)Saat disediakan, gambar ini digunakan sebagai frame awal video.
end_frame_image
string
URL gambar frame akhir (jpg / jpeg / png / gif / bmp)Saat disediakan, gambar ini digunakan sebagai frame akhir video. Dapat dikombinasikan dengan first_frame_image untuk kontrol frame pertama dan terakhir.
mid_frame_images
object[]
Daftar keyframe tengah, hingga 6. Setiap elemen memiliki struktur berikut:

Field Khusus Omni

ref_images
object[]
Daftar gambar referensi (semua elemen harus memiliki type). Setiap elemen memiliki struktur berikut:
ref_videos
object[]
Daftar video referensi, hingga 1. Setiap elemen memiliki struktur berikut:

Skenario yang Didukung

Skenario berikut didukung oleh keduanya skyreels-v4-fast dan skyreels-v4-std:
SkenarioModeField WajibKasus Penggunaan Umum
Teks-ke-VideoT2VpromptMurni berbasis teks, shot konsep cepat
Gambar-ke-Video - Frame PertamaI2Vfirst_frame_imageStill-to-video dengan frame awal yang ditentukan
Gambar-ke-Video - Frame AkhirI2Vend_frame_imageMenentukan frame penutup
Gambar-ke-Video - KeyframesI2Vmid_frame_images (1 ~ 6)Frame pertama + akhir + tengah untuk pengaturan tempo yang presisi
Omni Subjek Tunggal/MultiOmniref_images (type=image)Konsistensi karakter, framing multi-subjek
Omni Kolase GridOmniref_images (type=grid, 1 gambar)Video proses langkah demi langkah (tutorial, resep, demo)
Omni Gerakan ReferensiOmniref_videos (type=reference)Mereplikasi gerakan, subjek, atau gaya video referensi
Omni Perpanjangan VideoOmniref_videos (type=extend)Melanjutkan video yang ada dengan konten baru
Omni Sinkronisasi AudioOmniref_images (type=image) + audio_urlNarasi manusia digital, lip-sync berbasis audio

Batasan Parameter

Melanggar salah satu di bawah ini akan menyebabkan permintaan ditolak dengan respons 422, tidak ada biaya yang dikenakan:
ParameterBatasan
promptMaks. 1280 token
duration[3, 15] detik; ditimpa oleh durasi video referensi (maks. 10 dtk) saat ref_videos.type=reference
resolutionHanya 480p / 720p / 1080p
aspect_ratio16:9 / 4:3 / 1:1 / 9:16 / 3:4; diabaikan dalam I2V; diabaikan saat Omni membawa ref_videos
mid_frame_imagesHingga 6; time_stamp harus -1 atau dalam (0, duration)
ref_images secara keseluruhanSemua elemen harus berbagi type yang sama; tidak dapat berdampingan dengan field I2V
ref_images.type=gridPanjang daftar harus = 1; image_urls harus 1 gambar
ref_images.type=imagePanjang daftar 1 ~ 3; panjang setiap image_urls 1 ~ 5
ref_images.audio_urlHanya didukung saat type=image, audio ≤ 15 detik
ref_videosHingga 1; video_url MP4 / MOV, ≤ 15 detik
ref_videos.type=referenceMenimpa duration yang diminta (maks. 10 dtk), dapat dikombinasikan dengan ref_images.type=image, membawa audio video input secara default
ref_videos.type=extendDitagih berdasarkan duration yang diminta; tidak dapat dikombinasikan dengan ref_images
Field tagHarus dimulai dengan @ dan muncul di prompt
Eksklusi I2V / OmniField I2V dan field Omni tidak dapat digunakan bersama

Respons

code
integer
Kode status respons, 200 jika berhasil
data
array
Array data respons

Contoh Permintaan

Kasus 1: Teks-ke-Video (Minimal)

{
  "model": "skyreels-v4-fast",
  "prompt": "A serene forest at sunset with golden light filtering through the trees."
}

Kasus 2: Teks-ke-Video (Parameter Lengkap)

{
  "model": "skyreels-v4-std",
  "prompt": "A serene forest at sunset.",
  "duration": 5,
  "resolution": "720p",
  "aspect_ratio": "16:9",
  "prompt_optimizer": true
}

Kasus 3: Gambar-ke-Video - Frame Pertama

{
  "model": "skyreels-v4-fast",
  "prompt": "Slowly pull the camera back to reveal the entire scene.",
  "first_frame_image": "https://example.com/start.png",
  "duration": 5
}

Kasus 4: Gambar-ke-Video - Frame Pertama/Akhir + Keyframe Tengah

{
  "model": "skyreels-v4-std",
  "prompt": "The King summons a flying dragon. @image1 The dragon lowers. The King mounts and flies away.",
  "duration": 8,
  "resolution": "1080p",
  "first_frame_image": "https://example.com/k2v_0.png",
  "end_frame_image":   "https://example.com/k2v_2.png",
  "mid_frame_images": [
    { "tag": "@image1", "image_url": "https://example.com/k2v_1.png", "time_stamp": 3 }
  ]
}

Kasus 5: Omni - Subjek Referensi Tunggal

{
  "model": "skyreels-v4-fast",
  "prompt": "@Actor-1 walks through a neon-lit street at night.",
  "ref_images": [
    { "tag": "@Actor-1", "type": "image", "image_urls": ["https://example.com/actor.jpg"] }
  ]
}

Kasus 6: Omni - Multi-Subjek + Video Gerakan Referensi

{
  "model": "skyreels-v4-fast",
  "prompt": "The man from @image_1 imitates the move on the left in @video_1. The woman from @image_2 imitates the right side.",
  "duration": 5,
  "ref_images": [
    { "tag": "@image_1", "type": "image", "image_urls": ["https://example.com/a.png"] },
    { "tag": "@image_2", "type": "image", "image_urls": ["https://example.com/b.png"] }
  ],
  "ref_videos": [
    { "tag": "@video_1", "type": "reference", "video_url": "https://example.com/motion.mp4" }
  ]
}
Kasus ini menggunakan ref_videos.type=reference, sehingga ** duration akan ditimpa oleh durasi aktual video referensi** (maks. 10 detik). Meskipun "duration": 5 dikirim di sini, durasi video final mengikuti video referensi.

Kasus 7: Omni - Kolase Grid

{
  "model": "skyreels-v4-fast",
  "prompt": "Create a video showing how to make tomato and egg noodles based on @image1.",
  "ref_images": [
    { "tag": "@image1", "type": "grid", "image_urls": ["https://example.com/recipe_grid.png"] }
  ]
}

Kasus 8: Omni - Perpanjangan Video (extend)

{
  "model": "skyreels-v4-fast",
  "prompt": "Video extended @video1, someone walks over and sits on the sofa.",
  "duration": 8,
  "ref_videos": [
    { "tag": "@video1", "type": "extend", "video_url": "https://example.com/source.mp4" }
  ]
}

Kasus 9: Omni - Sinkronisasi Audio (Berbasis Suara)

{
  "model": "skyreels-v4-std",
  "prompt": "@Actor-1 speaks with a calm tone.",
  "ref_images": [
    {
      "tag": "@Actor-1",
      "type": "image",
      "image_urls": ["https://example.com/actor.jpg"],
      "audio_url":  "https://example.com/voice.mp3"
    }
  ]
}
Kueri Hasil TugasPembuatan video adalah tugas asinkron yang mengembalikan task_id saat dikirim. Gunakan endpoint Dapatkan Status Tugas untuk mengueri progres dan hasil pembuatan.