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"
}
}
SkyReels V4
SkyReels V4 Videogenerierung
- Zwei Modellstufen: Fast (geschwindigkeitsoptimiert) und Std (qualitätsoptimiert)
- Drei Modi mit automatischem Routing nach Anfragefeldern: Text-to-Video (T2V), Image-to-Video (I2V), Multimodale Referenz (Omni)
- Auflösungen 480p / 720p / 1080p, Dauer 3 ~ 15 Sekunden
- Erweiterte Funktionen: Erstes/letztes/Schlüsselbild, Referenzbilder, Referenzvideos, Raster-Collage, Videoverlängerung, Audiosynchronisation
- Asynchroner Verarbeitungsmodus, gibt eine Task-ID für spätere Abfragen zurück
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"
}
}
Autorisierung
string
erforderlich
Alle API-Endpunkte erfordern eine Bearer-Token-AuthentifizierungAPI-Key abrufen:Besuchen Sie die Seite zur API-Key-Verwaltung, um Ihren API-Key zu erhaltenFügen Sie ihn zum Request-Header hinzu:
Authorization: Bearer YOUR_API_KEY
Generierungsmodi
SkyReels V4 wählt den passenden Modus automatisch anhand der Anfragefelder — keinmode-Feld erforderlich:
| Modus | Auslöser | Funktion |
|---|---|---|
| T2V (Text-to-Video) | Nur prompt + allgemeine Felder | Rein textgesteuerte Generierung |
| I2V (Image-to-Video) | Eines von first_frame_image / end_frame_image / mid_frame_images | Steuerung erstes/letztes/Schlüsselbild |
| Omni (Multimodale Referenz) | Eines von ref_images / ref_videos | Subjektreferenz, Raster-Collage, Bewegungsreferenz, Videoverlängerung, Audiosynchronisation |
Strikte gegenseitige Ausschließlichkeit: I2V-Felder (
first_frame_image / end_frame_image / mid_frame_images) und Omni-Felder (ref_images / ref_videos) können nicht zusammen verwendet werden, andernfalls wird 422 zurückgegeben.@tag-Mechanismus: Bei Verwendung von mid_frame_images / ref_images / ref_videos muss jedes Element ein tag deklarieren, das mit @ beginnt (z. B. @image1, @Actor-1, @video1), und dieser tag muss im prompt vorkommen.Stellen Sie sich prompt als „Drehbuch” und tag als „Zeiger auf eine Figur” für bestimmte Assets (Bilder / Videos) vor. Ein Prompt wie "@Actor-1 walks into the scene of @video1" weist das System beispielsweise an, das mit @Actor-1 verknüpfte Referenzbildsubjekt und die mit @video1 verknüpfte Bewegungsreferenz in den Generierungsprozess einzufügen.Anfrageparameter
Allgemeine Felder
string
erforderlich
Zwei Modellstufen stehen zur Verfügung:
| Modell | Positionierung | Anwendungsfälle |
|---|---|---|
skyreels-v4-fast | Geschwindigkeit zuerst | Schnelle Vorschauen, Batch-Generierung, Alltagsinhalte |
skyreels-v4-std | Qualität zuerst (ca. 25~30 % teurer als Fast) | Schlüsselaufnahmen, hohe Detailanforderungen, finale Lieferung |
Das Feld
model muss explizit angegeben werden — kein Standardwert.Der Preis hängt stark von der Auflösung und der Verwendung von
ref_videos ab: 1080p ist deutlich teurer als 480p / 720p; Varianten mit ref_videos (Videoeingabe) kosten ca. das 1,5- bis 2-fache im Vergleich zu denen ohne. Die gleichzeitige Audio- und Videoausgabe wird noch nicht unterstützt.boolean
Standard:"false"
Legt fest, ob der Inhalt vor dem Absenden des Videoauftrags moderiert wird.
true: Prompts und Eingabebilder mitomni-moderation-latestprüfenfalseoder nicht angegeben: keine Moderationsanfrage und damit keine zusätzlichen Moderationskosten oder Verzögerung (Standard)
string
erforderlich
Text-Prompt, maximal 1280 TokensBeschreiben Sie Szenen, Subjekte, Aktionen und Stile detailliert für bessere Generierungsergebnisse.Bei Verwendung von
ref_images / ref_videos / mid_frame_images muss der entsprechende @tag (z. B. @Actor-1, @video1, @image1) im prompt enthalten sein.Beispiel: "@Actor-1 walks through a neon-lit street at night."integer
Standard:"5"
Dauer des Ausgabevideos (Sekunden)
- Bereich:
[3, 15] - Standard:
5
Wenn
ref_videos.type=reference angegeben wird, wird duration durch die Länge des Referenzvideos überschrieben (maximal 10 Sekunden).string
Standard:"1080p"
VideoauflösungOptionen:
480p720p1080p(Standard)
string
Standard:"16:9"
SeitenverhältnisOptionen:
16:9(Standard)4:31:19:163:4
aspect_ratio wird im I2V-Modus ignoriert (das Ausgabeverhältnis wird durch das Eingabebild bestimmt); ebenfalls ignoriert, wenn Omni mit ref_videos kombiniert wird.boolean
Standard:"true"
Soll der Prompt automatisch optimiert werden?Bei Aktivierung optimiert das System Ihren Prompt automatisch für bessere Generierungsergebnisse.
I2V-spezifische Felder
string
URL des ersten Einzelbildes (jpg / jpeg / png / gif / bmp)Wenn angegeben, wird dieses Bild als Anfangsbild des Videos verwendet.
string
URL des letzten Einzelbildes (jpg / jpeg / png / gif / bmp)Wenn angegeben, wird dieses Bild als Endbild des Videos verwendet. Kann mit
first_frame_image für die Steuerung von Erst- und Endbild kombiniert werden.object[]
Liste mittlerer Schlüsselbilder, bis zu 6. Jedes Element hat die folgende Struktur:
Anzeigen mid_frame_images-Element
Anzeigen mid_frame_images-Element
Omni-spezifische Felder
object[]
Liste der Referenzbilder (alle Elemente müssen denselben
type haben). Jedes Element hat die folgende Struktur:Anzeigen ref_images-Element
Anzeigen ref_images-Element
string
erforderlich
Muss mit
@ beginnen und im prompt vorkommen, z. B. @Actor-1string
erforderlich
Referenztyp:
image– Reguläres Referenzbild (Listenlänge 13; Länge jedes5)image_urls1grid– Raster-Collage, d. h. ein einzelnes Bild aus mehreren Kacheln (z. B. 2×2, 3×3); Listenlänge muss = 1 sein,image_urlsmuss 1 Bild enthalten
string[]
erforderlich
Array von Bild-URLs
string
URL einer Sprachaudiodatei (nur bei
type=image unterstützt, Audiodauer ≤ 15 Sekunden)object[]
Liste der Referenzvideos, bis zu 1. Jedes Element hat die folgende Struktur:
Anzeigen ref_videos-Element
Anzeigen ref_videos-Element
string
erforderlich
Muss mit
@ beginnen und im prompt vorkommen, z. B. @video1string
erforderlich
Referenztyp:
reference– Bewegungs-/Subjektreferenz, überschreibtduration(folgt der Länge des Referenzvideos, maximal 10 Sekunden), übernimmt standardmäßig das Audio des Eingabevideos; kann mitref_images.type=imagekombiniert werdenextend– Videoverlängerung, Abrechnung nach angefordertemduration; kann nicht mitref_imageskombiniert werden
string
erforderlich
Video-URL (MP4 / MOV, Dauer ≤ 15 Sekunden)
Unterstützte Szenarien
Die folgenden Szenarien werden sowohl vonskyreels-v4-fast als auch skyreels-v4-std unterstützt:
| Szenario | Modus | Erforderliche Felder | Typischer Anwendungsfall |
|---|---|---|---|
| Text-to-Video | T2V | prompt | Rein textgesteuert, schnelle Konzeptaufnahmen |
| Image-to-Video — Erstes Einzelbild | I2V | first_frame_image | Standbild zu Video mit definiertem Anfangsbild |
| Image-to-Video — Letztes Einzelbild | I2V | end_frame_image | Festlegung des Schlussbildes |
| Image-to-Video — Schlüsselbilder | I2V | mid_frame_images (1~6) | Erstes + letztes + mittlere Schlüsselbilder für präzises Timing |
| Omni Einzel-/Multi-Subjekt | Omni | ref_images (type=image) | Figurenkonsistenz, Multi-Subjekt-Framing |
| Omni Raster-Collage | Omni | ref_images (type=grid, 1 Bild) | Schritt-für-Schritt-Prozessvideos (Tutorials, Rezepte, Demos) |
| Omni Bewegungsreferenz | Omni | ref_videos (type=reference) | Bewegung, Subjekt oder Stil eines Referenzvideos reproduzieren |
| Omni Videoverlängerung | Omni | ref_videos (type=extend) | Vorhandenes Video mit neuem Inhalt fortsetzen |
| Omni Audiosynchronisation | Omni | ref_images (type=image) + audio_url | Digitale Sprecher-Erzählung, audiogesteuerte Lippensynchronisation |
Parameter-Einschränkungen
Bei Verletzung einer der folgenden Bedingungen wird die Anfrage mit einer 422-Antwort abgelehnt, es erfolgt keine Abrechnung:| Parameter | Einschränkung |
|---|---|
prompt | Maximal 1280 Tokens |
duration | [3, 15] Sekunden; bei ref_videos.type=reference durch Länge des Referenzvideos überschrieben (max. 10s) |
resolution | Nur 480p / 720p / 1080p |
aspect_ratio | 16:9 / 4:3 / 1:1 / 9:16 / 3:4; ignoriert in I2V; ignoriert, wenn Omni ref_videos enthält |
mid_frame_images | Bis zu 6; time_stamp muss -1 oder innerhalb (0, duration) sein |
ref_images insgesamt | Alle Elemente müssen denselben type haben; können nicht mit I2V-Feldern koexistieren |
ref_images.type=grid | Listenlänge muss = 1 sein; image_urls muss 1 Bild enthalten |
ref_images.type=image | Listenlänge 1image_urls 1 |
ref_images.audio_url | Nur unterstützt bei type=image, Audio ≤ 15 Sekunden |
ref_videos | Bis zu 1; video_url MP4 / MOV, ≤ 15 Sekunden |
ref_videos.type=reference | Überschreibt angeforderten duration (max. 10s), kann mit ref_images.type=image kombiniert werden, übernimmt standardmäßig das Audio des Eingabevideos |
ref_videos.type=extend | Abrechnung nach angefordertem duration; kann nicht mit ref_images kombiniert werden |
Feld tag | Muss mit @ beginnen und im prompt vorkommen |
| I2V / Omni-Ausschluss | I2V-Felder und Omni-Felder können nicht zusammen verwendet werden |
Antwort
integer
Statuscode der Antwort, 200 bei Erfolg
array
Anfragebeispiele
Fall 1: Text-zu-Video (minimal)
{
"model": "skyreels-v4-fast",
"prompt": "A serene forest at sunset with golden light filtering through the trees."
}
Fall 2: Text-zu-Video (vollständige Parameter)
{
"model": "skyreels-v4-std",
"prompt": "A serene forest at sunset.",
"duration": 5,
"resolution": "720p",
"aspect_ratio": "16:9",
"prompt_optimizer": true
}
Fall 3: Bild-zu-Video — Erstes Einzelbild
{
"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
}
Fall 4: Bild-zu-Video — Erstes/Letztes Einzelbild + mittlere Schlüsselbilder
{
"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 }
]
}
Fall 5: Omni — Einzelne Subjektreferenz
{
"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"] }
]
}
Fall 6: Omni — Mehrere Subjekte + Video-Bewegungsreferenz
{
"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" }
]
}
In diesem Fall wird
ref_videos.type=reference verwendet, daher wird der angeforderte duration durch die tatsächliche Länge des Referenzvideos überschrieben (maximal 10 Sekunden). Auch wenn hier "duration": 5 übergeben wird, richtet sich die endgültige Videolänge nach dem Referenzvideo.Fall 7: Omni — Raster-Collage
{
"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"] }
]
}
Fall 8: Omni — Videoverlängerung (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" }
]
}
Fall 9: Omni — Audiosynchronisation (sprachgesteuert)
{
"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"
}
]
}
Aufgabenergebnisse abfragenDie Videogenerierung ist eine asynchrone Aufgabe, die nach der Übermittlung eine
task_id zurückgibt. Verwenden Sie den Endpunkt Aufgabenstatus abrufen, um den Generierungsfortschritt und die Ergebnisse abzufragen.⌘I