curl --request POST \
--url https://api.apimart.ai/v1/videos/generations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "viduq3-pro",
"prompt": "A cat playing piano, camera slowly zooms in",
"duration": 8,
"resolution": "1080p",
"aspect_ratio": "16:9"
}'
import requests
url = "https://api.apimart.ai/v1/videos/generations"
payload = {
"model": "viduq3-pro",
"prompt": "A cat playing piano, camera slowly zooms in",
"duration": 8,
"resolution": "1080p",
"aspect_ratio": "16:9"
}
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: "viduq3-pro",
prompt: "A cat playing piano, camera slowly zooms in",
duration: 8,
resolution: "1080p",
aspect_ratio: "16:9"
};
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": "viduq3-pro",
"prompt": "A cat playing piano, camera slowly zooms in",
"duration": 8,
"resolution": "1080p",
"aspect_ratio": "16:9",
}
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": "viduq3-pro",
"prompt": "A cat playing piano, camera slowly zooms in",
"duration": 8,
"resolution": "1080p",
"aspect_ratio": "16:9"
}
""";
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" => "viduq3-pro",
"prompt" => "A cat playing piano, camera slowly zooms in",
"duration" => 8,
"resolution" => "1080p",
"aspect_ratio" => "16:9"
];
$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: "viduq3-pro",
prompt: "A cat playing piano, camera slowly zooms in",
duration: 8,
resolution: "1080p",
aspect_ratio: "16:9"
}
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": "viduq3-pro",
"prompt": "A cat playing piano, camera slowly zooms in",
"duration": 8,
"resolution": "1080p",
"aspect_ratio": "16:9"
]
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"": ""viduq3-pro"",
""prompt"": ""A cat playing piano, camera slowly zooms in"",
""duration"": 8,
""resolution"": ""1080p"",
""aspect_ratio"": ""16:9""
}";
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_xxxxxxxxxx"
}
]
}
{
"error": {
"code": 400,
"message": "Invalid request parameters",
"type": "invalid_request_error"
}
}
{
"error": {
"code": 401,
"message": "Invalid authentication credentials",
"type": "authentication_error"
}
}
{
"error": {
"code": 402,
"message": "Insufficient balance. Please top up your account",
"type": "payment_required"
}
}
{
"error": {
"code": 429,
"message": "Rate limit exceeded. Please try again later",
"type": "rate_limit_error"
}
}
{
"error": {
"code": 500,
"message": "Internal server error. Please try again later",
"type": "server_error"
}
}
Vidu Q3(pro/turbo)
Generación de video Vidu Q3 (pro/turbo)
- Modo de procesamiento asíncrono, devuelve un ID de tarea para consultas posteriores
- Admite text-to-video, image-to-video y generación de video con primer-último frame
- Admite resolución 540p / 720p / 1080p
- Rango de duración 1-16 segundos, audio activado por defecto
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": "viduq3-pro",
"prompt": "A cat playing piano, camera slowly zooms in",
"duration": 8,
"resolution": "1080p",
"aspect_ratio": "16:9"
}'
import requests
url = "https://api.apimart.ai/v1/videos/generations"
payload = {
"model": "viduq3-pro",
"prompt": "A cat playing piano, camera slowly zooms in",
"duration": 8,
"resolution": "1080p",
"aspect_ratio": "16:9"
}
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: "viduq3-pro",
prompt: "A cat playing piano, camera slowly zooms in",
duration: 8,
resolution: "1080p",
aspect_ratio: "16:9"
};
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": "viduq3-pro",
"prompt": "A cat playing piano, camera slowly zooms in",
"duration": 8,
"resolution": "1080p",
"aspect_ratio": "16:9",
}
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": "viduq3-pro",
"prompt": "A cat playing piano, camera slowly zooms in",
"duration": 8,
"resolution": "1080p",
"aspect_ratio": "16:9"
}
""";
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" => "viduq3-pro",
"prompt" => "A cat playing piano, camera slowly zooms in",
"duration" => 8,
"resolution" => "1080p",
"aspect_ratio" => "16:9"
];
$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: "viduq3-pro",
prompt: "A cat playing piano, camera slowly zooms in",
duration: 8,
resolution: "1080p",
aspect_ratio: "16:9"
}
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": "viduq3-pro",
"prompt": "A cat playing piano, camera slowly zooms in",
"duration": 8,
"resolution": "1080p",
"aspect_ratio": "16:9"
]
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"": ""viduq3-pro"",
""prompt"": ""A cat playing piano, camera slowly zooms in"",
""duration"": 8,
""resolution"": ""1080p"",
""aspect_ratio"": ""16:9""
}";
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_xxxxxxxxxx"
}
]
}
{
"error": {
"code": 400,
"message": "Invalid request parameters",
"type": "invalid_request_error"
}
}
{
"error": {
"code": 401,
"message": "Invalid authentication credentials",
"type": "authentication_error"
}
}
{
"error": {
"code": 402,
"message": "Insufficient balance. Please top up your account",
"type": "payment_required"
}
}
{
"error": {
"code": 429,
"message": "Rate limit exceeded. Please try again later",
"type": "rate_limit_error"
}
}
{
"error": {
"code": 500,
"message": "Internal server error. Please try again 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": "viduq3-pro",
"prompt": "A cat playing piano, camera slowly zooms in",
"duration": 8,
"resolution": "1080p",
"aspect_ratio": "16:9"
}'
import requests
url = "https://api.apimart.ai/v1/videos/generations"
payload = {
"model": "viduq3-pro",
"prompt": "A cat playing piano, camera slowly zooms in",
"duration": 8,
"resolution": "1080p",
"aspect_ratio": "16:9"
}
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: "viduq3-pro",
prompt: "A cat playing piano, camera slowly zooms in",
duration: 8,
resolution: "1080p",
aspect_ratio: "16:9"
};
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": "viduq3-pro",
"prompt": "A cat playing piano, camera slowly zooms in",
"duration": 8,
"resolution": "1080p",
"aspect_ratio": "16:9",
}
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": "viduq3-pro",
"prompt": "A cat playing piano, camera slowly zooms in",
"duration": 8,
"resolution": "1080p",
"aspect_ratio": "16:9"
}
""";
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" => "viduq3-pro",
"prompt" => "A cat playing piano, camera slowly zooms in",
"duration" => 8,
"resolution" => "1080p",
"aspect_ratio" => "16:9"
];
$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: "viduq3-pro",
prompt: "A cat playing piano, camera slowly zooms in",
duration: 8,
resolution: "1080p",
aspect_ratio: "16:9"
}
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": "viduq3-pro",
"prompt": "A cat playing piano, camera slowly zooms in",
"duration": 8,
"resolution": "1080p",
"aspect_ratio": "16:9"
]
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"": ""viduq3-pro"",
""prompt"": ""A cat playing piano, camera slowly zooms in"",
""duration"": 8,
""resolution"": ""1080p"",
""aspect_ratio"": ""16:9""
}";
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_xxxxxxxxxx"
}
]
}
{
"error": {
"code": 400,
"message": "Invalid request parameters",
"type": "invalid_request_error"
}
}
{
"error": {
"code": 401,
"message": "Invalid authentication credentials",
"type": "authentication_error"
}
}
{
"error": {
"code": 402,
"message": "Insufficient balance. Please top up your account",
"type": "payment_required"
}
}
{
"error": {
"code": 429,
"message": "Rate limit exceeded. Please try again later",
"type": "rate_limit_error"
}
}
{
"error": {
"code": 500,
"message": "Internal server error. Please try again later",
"type": "server_error"
}
}
Autorización
Todos los endpoints de la API requieren autenticación mediante Bearer TokenObtenga su API Key:Visite la página de gestión de API Keys para obtener su API KeyAñádala al encabezado de la solicitud:
Authorization: Bearer YOUR_API_KEY
Parámetros de la solicitud
Nombre del modelo de generación de videoModelos compatibles:
viduq3-pro- Vidu Q3 Providuq3-turbo- Vidu Q3 Turbo
Prompt de texto, máximo 2000 caracteresObligatorio para text-to-video. Opcional para los modos image-to-video y primer-último frame.Ejemplo:
"A cat playing piano, camera slowly zooms in"Duración del video (segundos)Rango:
1 a 16Predeterminado: 5Resolución del videoOpciones:
540p- Definición estándar720p- HD (predeterminado)1080p- Full HD
720pRelación de aspecto del video (solo para el modo text-to-video)Opciones:
16:9- Horizontal9:16- Vertical4:3- Tradicional3:4- Vertical tradicional1:1- Cuadrado
Este parámetro solo está disponible en el modo text-to-video (cuando no se proporciona
image_urls).Array de URLs de imágenes para la generación image-to-videoEl sistema determina automáticamente el modo de generación según el número de imágenes:
- 0 imágenes (no proporcionadas): Modo text-to-video
- 1 imagen: Modo image-to-video (la imagen se usa como frame inicial)
- 2 imágenes: Modo primer-último frame (la primera imagen = primer frame, la segunda imagen = último frame)
["https://example.com/photo.jpg"]- Se admiten hasta 2 imágenes
- Para el modo primer-último frame, deben proporcionarse exactamente 2 imágenes
- Cuando se proporciona
image_urls(ya sea 1 o 2 imágenes), el parámetroaspect_rationo puede usarse — la relación de aspecto del video se determinará automáticamente según la imagen
Define si se genera audio (diálogo, efectos de sonido)Predeterminado:
trueEstablezca el valor en false si necesita un video silencioso.Semilla entera para controlar la aleatoriedad del contenido generadoRango: entero entre
-1 y 2^32-1- Con la misma solicitud, valores de semilla diferentes (incluyendo no especificada o
-1, que usa un número aleatorio) producirán resultados diferentes - Con la misma solicitud, el mismo valor de semilla producirá resultados similares, pero no se garantiza una reproducibilidad exacta
Enrutamiento automático
El sistema determina automáticamente el modo de generación según el número de imágenes enimage_urls:
| Cantidad de imágenes | Modo | Descripción |
|---|---|---|
| 0 (no proporcionadas) | Text-to-Video | Generar solo a partir de la descripción de texto |
| 1 | Image-to-Video | Usa la imagen como frame inicial |
| 2 | Primer-último frame | Primera imagen = primer frame, segunda imagen = último frame |
Matriz de compatibilidad de parámetros
| Parámetro | Text-to-Video | Image-to-Video | Primer-último frame |
|---|---|---|---|
model | ✅ Obligatorio | ✅ Obligatorio | ✅ Obligatorio |
prompt | ✅ Obligatorio | Opcional | Opcional |
image_urls | - | ✅ 1 imagen | ✅ 2 imágenes |
duration | ✅ 1-16s | ✅ 1-16s | ✅ 1-16s |
resolution | ✅ | ✅ | ✅ |
aspect_ratio | ✅ | - | - |
audio | ✅ | ✅ | ✅ |
seed | ✅ | ✅ | ✅ |
Respuesta
Código de estado de la respuesta, 200 en caso de éxito
Casos de uso
Caso 1: Texto a video
{
"model": "viduq3-pro",
"prompt": "A cat playing piano, camera slowly zooms in",
"duration": 8,
"resolution": "1080p",
"aspect_ratio": "16:9"
}
Caso 2: Imagen a video (Imagen única)
{
"model": "viduq3-pro",
"prompt": "The person slowly turns and smiles",
"image_urls": ["https://example.com/photo.jpg"],
"duration": 5,
"resolution": "720p"
}
Caso 3: Video primer-último frame
{
"model": "viduq3-pro",
"prompt": "The person gradually sits down from standing",
"image_urls": [
"https://example.com/first.jpg",
"https://example.com/last.jpg"
],
"duration": 8
}
Caso 4: Video silencioso (audio desactivado)
{
"model": "viduq3-pro",
"prompt": "Sunset seascape timelapse photography",
"duration": 10,
"resolution": "1080p",
"audio": false
}
Consultar los resultados de la tareaLa generación de video es una tarea asíncrona que devuelve un
task_id al enviarse. Use el endpoint Obtener estado de la tarea para consultar el progreso y los resultados de la generación.⌘I