curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "vidu_q4",
"params": {
"prompt": "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
"type": "frame",
"image_url": ["https://example.com/first-frame.jpg"],
"resolution": "720p",
"video_length": 5,
"generate_audio": true
},
"out_task_id": "vidu_q4_frame_123456"
}'
curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "vidu_q4",
"params": {
"prompt": "The girl in reference image 1 walks through the street in reference image 2, saying in the voice of reference audio 1: The weather is so nice today",
"type": "reference",
"image_url": ["https://example.com/girl.jpg", "https://example.com/street.jpg"],
"audio_url": ["https://example.com/voice.mp3"],
"resolution": "1080p",
"aspect_ratio": "9:16",
"video_length": 8,
"generate_audio": true
},
"out_task_id": "vidu_q4_ref_123456"
}'
import requests
url = "https://aireiter.com/api/openapi/submit"
payload = {
"model": "vidu_q4",
"params": {
"prompt": "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
"type": "frame",
"image_url": ["https://example.com/first-frame.jpg"],
"resolution": "720p",
"video_length": 5,
"generate_audio": True
},
"out_task_id": "vidu_q4_frame_123456"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())
const url = "https://aireiter.com/api/openapi/submit";
const payload = {
model: "vidu_q4",
params: {
prompt: "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
type: "frame",
image_url: ["https://example.com/first-frame.jpg"],
resolution: "720p",
video_length: 5,
generate_audio: true
},
out_task_id: "vidu_q4_frame_123456"
};
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://aireiter.com/api/openapi/submit"
payload := map[string]interface{}{
"model": "vidu_q4",
"params": map[string]interface{}{
"prompt": "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
"type": "frame",
"image_url": []string{"https://example.com/first-frame.jpg"},
"resolution": "720p",
"video_length": 5,
"generate_audio": true,
},
"out_task_id": "vidu_q4_frame_123456",
}
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://aireiter.com/api/openapi/submit";
String payload = """
{
"model": "vidu_q4",
"params": {
"prompt": "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
"type": "frame",
"image_url": ["https://example.com/first-frame.jpg"],
"resolution": "720p",
"video_length": 5,
"generate_audio": true
},
"out_task_id": "vidu_q4_frame_123456"
}
""";
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://aireiter.com/api/openapi/submit";
$payload = [
"model" => "vidu_q4",
"params" => [
"prompt" => "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
"type" => "frame",
"image_url" => ["https://example.com/first-frame.jpg"],
"resolution" => "720p",
"video_length" => 5,
"generate_audio" => true
],
"out_task_id" => "vidu_q4_frame_123456"
];
$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://aireiter.com/api/openapi/submit")
payload = {
model: "vidu_q4",
params: {
prompt: "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
type: "frame",
image_url: ["https://example.com/first-frame.jpg"],
resolution: "720p",
video_length: 5,
generate_audio: true
},
out_task_id: "vidu_q4_frame_123456"
}
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://aireiter.com/api/openapi/submit")!
let payload: [String: Any] = [
"model": "vidu_q4",
"params": [
"prompt": "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
"type": "frame",
"image_url": ["https://example.com/first-frame.jpg"],
"resolution": "720p",
"video_length": 5,
"generate_audio": true
],
"out_task_id": "vidu_q4_frame_123456"
]
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://aireiter.com/api/openapi/submit";
var payload = @"
{
""model"": ""vidu_q4"",
""params"": {
""prompt"": ""A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text"",
""type"": ""frame"",
""image_url"": [""https://example.com/first-frame.jpg""],
""resolution"": ""720p"",
""video_length"": 5,
""generate_audio"": true
},
""out_task_id"": ""vidu_q4_frame_123456""
}";
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);
}
}
#include <stdio.h>
#include <curl/curl.h>
int main(void) {
CURL *curl;
CURLcode res;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl) {
const char *url = "https://aireiter.com/api/openapi/submit";
const char *payload = "{\"model\":\"vidu_q4\",\"params\":{\"prompt\":\"A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text\",\"type\":\"frame\",\"image_url\":[\"https://example.com/first-frame.jpg\"],\"resolution\":\"720p\",\"video_length\":5,\"generate_audio\":true},\"out_task_id\":\"vidu_q4_frame_123456\"}";
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Authorization: Bearer <token>");
headers = curl_slist_append(headers, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, payload);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
res = curl_easy_perform(curl);
if(res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
}
curl_global_cleanup();
return 0;
}
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSURL *url = [NSURL URLWithString:@"https://aireiter.com/api/openapi/submit"];
NSDictionary *payload = @{
@"model": @"vidu_q4",
@"params": @{
@"prompt": @"A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
@"type": @"frame",
@"image_url": @[@"https://example.com/first-frame.jpg"],
@"resolution": @"720p",
@"video_length": @5,
@"generate_audio": @YES
},
@"out_task_id": @"vidu_q4_frame_123456"
};
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:payload
options:0
error:&error];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:@"Bearer <token>" forHTTPHeaderField:@"Authorization"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:jsonData];
NSURLSessionDataTask *task = [[NSURLSession sharedSession]
dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"Error: %@", error);
return;
}
NSString *result = [[NSString alloc] initWithData:data
encoding:NSUTF8StringEncoding];
NSLog(@"%@", result);
}];
[task resume];
[[NSRunLoop mainRunLoop] run];
}
return 0;
}
(* Requires cohttp and yojson libraries *)
open Lwt
open Cohttp
open Cohttp_lwt_unix
let url = "https://aireiter.com/api/openapi/submit"
let payload = {|{
"model": "vidu_q4",
"params": {
"prompt": "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
"type": "frame",
"image_url": ["https://example.com/first-frame.jpg"],
"resolution": "720p",
"video_length": 5,
"generate_audio": true
},
"out_task_id": "vidu_q4_frame_123456"
}|}
let () =
let headers = Header.init ()
|> fun h -> Header.add h "Authorization" "Bearer <token>"
|> fun h -> Header.add h "Content-Type" "application/json"
in
let body = Cohttp_lwt.Body.of_string payload in
let response = Client.post ~headers ~body (Uri.of_string url) >>= fun (resp, body) ->
body |> Cohttp_lwt.Body.to_string >|= fun body_str ->
print_endline body_str
in
Lwt_main.run response
import 'dart:convert';
import 'package:http/http.dart' as http;
void main() async {
final url = Uri.parse('https://aireiter.com/api/openapi/submit');
final payload = {
"model": "vidu_q4",
"params": {
"prompt": "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
"type": "frame",
"image_url": ["https://example.com/first-frame.jpg"],
"resolution": "720p",
"video_length": 5,
"generate_audio": true
},
"out_task_id": "vidu_q4_frame_123456"
};
final response = await http.post(
url,
headers: {
'Authorization': 'Bearer <token>',
'Content-Type': 'application/json'
},
body: jsonEncode(payload),
);
print(response.body);
}
library(httr)
library(jsonlite)
url <- "https://aireiter.com/api/openapi/submit"
payload <- list(
model = "vidu_q4",
params = list(
prompt = "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
type = "frame",
image_url = I("https://example.com/first-frame.jpg"),
resolution = "720p",
video_length = 5,
generate_audio = TRUE
),
out_task_id = "vidu_q4_frame_123456"
)
response <- POST(
url,
add_headers(
Authorization = "Bearer <token>",
`Content-Type` = "application/json"
),
body = toJSON(payload, auto_unbox = TRUE),
encode = "raw"
)
cat(content(response, "text"))
{
"statusCode": 200,
"message": "",
"data": {
"out_task_id": "vidu_q4_frame_123456",
"status": "pending",
"created_at": "2026-10-16T07:56:45.511Z"
}
}
{
"statusCode": 400,
"message": "Missing required field: image_url",
"ok": false
}
{
"error": {
"code": 401,
"message": "Authentication failed, please check your API key"
}
}
{
"error": {
"code": 433,
"message": "Insufficient account balance, please recharge and try again"
}
}
{
"error": {
"code": 500,
"message": "Internal server error, please try again later"
}
}
Vidu Q4
Vidu Q4 Video Generation
- Shengshu Technology Vidu Q4 video generation model
- Asynchronous processing mode, returns a task ID for subsequent queries
- Supports two modes: first-frame image-to-video and reference-image (with optional reference audio) to video
- Supports 540p / 720p / 1080p / 2K / 4K output, video duration of 3-16 seconds, and generates synchronized dialogue and sound effects by default
POST
/
api
/
openapi
/
submit
curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "vidu_q4",
"params": {
"prompt": "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
"type": "frame",
"image_url": ["https://example.com/first-frame.jpg"],
"resolution": "720p",
"video_length": 5,
"generate_audio": true
},
"out_task_id": "vidu_q4_frame_123456"
}'
curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "vidu_q4",
"params": {
"prompt": "The girl in reference image 1 walks through the street in reference image 2, saying in the voice of reference audio 1: The weather is so nice today",
"type": "reference",
"image_url": ["https://example.com/girl.jpg", "https://example.com/street.jpg"],
"audio_url": ["https://example.com/voice.mp3"],
"resolution": "1080p",
"aspect_ratio": "9:16",
"video_length": 8,
"generate_audio": true
},
"out_task_id": "vidu_q4_ref_123456"
}'
import requests
url = "https://aireiter.com/api/openapi/submit"
payload = {
"model": "vidu_q4",
"params": {
"prompt": "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
"type": "frame",
"image_url": ["https://example.com/first-frame.jpg"],
"resolution": "720p",
"video_length": 5,
"generate_audio": True
},
"out_task_id": "vidu_q4_frame_123456"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())
const url = "https://aireiter.com/api/openapi/submit";
const payload = {
model: "vidu_q4",
params: {
prompt: "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
type: "frame",
image_url: ["https://example.com/first-frame.jpg"],
resolution: "720p",
video_length: 5,
generate_audio: true
},
out_task_id: "vidu_q4_frame_123456"
};
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://aireiter.com/api/openapi/submit"
payload := map[string]interface{}{
"model": "vidu_q4",
"params": map[string]interface{}{
"prompt": "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
"type": "frame",
"image_url": []string{"https://example.com/first-frame.jpg"},
"resolution": "720p",
"video_length": 5,
"generate_audio": true,
},
"out_task_id": "vidu_q4_frame_123456",
}
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://aireiter.com/api/openapi/submit";
String payload = """
{
"model": "vidu_q4",
"params": {
"prompt": "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
"type": "frame",
"image_url": ["https://example.com/first-frame.jpg"],
"resolution": "720p",
"video_length": 5,
"generate_audio": true
},
"out_task_id": "vidu_q4_frame_123456"
}
""";
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://aireiter.com/api/openapi/submit";
$payload = [
"model" => "vidu_q4",
"params" => [
"prompt" => "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
"type" => "frame",
"image_url" => ["https://example.com/first-frame.jpg"],
"resolution" => "720p",
"video_length" => 5,
"generate_audio" => true
],
"out_task_id" => "vidu_q4_frame_123456"
];
$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://aireiter.com/api/openapi/submit")
payload = {
model: "vidu_q4",
params: {
prompt: "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
type: "frame",
image_url: ["https://example.com/first-frame.jpg"],
resolution: "720p",
video_length: 5,
generate_audio: true
},
out_task_id: "vidu_q4_frame_123456"
}
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://aireiter.com/api/openapi/submit")!
let payload: [String: Any] = [
"model": "vidu_q4",
"params": [
"prompt": "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
"type": "frame",
"image_url": ["https://example.com/first-frame.jpg"],
"resolution": "720p",
"video_length": 5,
"generate_audio": true
],
"out_task_id": "vidu_q4_frame_123456"
]
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://aireiter.com/api/openapi/submit";
var payload = @"
{
""model"": ""vidu_q4"",
""params"": {
""prompt"": ""A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text"",
""type"": ""frame"",
""image_url"": [""https://example.com/first-frame.jpg""],
""resolution"": ""720p"",
""video_length"": 5,
""generate_audio"": true
},
""out_task_id"": ""vidu_q4_frame_123456""
}";
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);
}
}
#include <stdio.h>
#include <curl/curl.h>
int main(void) {
CURL *curl;
CURLcode res;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl) {
const char *url = "https://aireiter.com/api/openapi/submit";
const char *payload = "{\"model\":\"vidu_q4\",\"params\":{\"prompt\":\"A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text\",\"type\":\"frame\",\"image_url\":[\"https://example.com/first-frame.jpg\"],\"resolution\":\"720p\",\"video_length\":5,\"generate_audio\":true},\"out_task_id\":\"vidu_q4_frame_123456\"}";
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Authorization: Bearer <token>");
headers = curl_slist_append(headers, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, payload);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
res = curl_easy_perform(curl);
if(res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
}
curl_global_cleanup();
return 0;
}
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSURL *url = [NSURL URLWithString:@"https://aireiter.com/api/openapi/submit"];
NSDictionary *payload = @{
@"model": @"vidu_q4",
@"params": @{
@"prompt": @"A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
@"type": @"frame",
@"image_url": @[@"https://example.com/first-frame.jpg"],
@"resolution": @"720p",
@"video_length": @5,
@"generate_audio": @YES
},
@"out_task_id": @"vidu_q4_frame_123456"
};
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:payload
options:0
error:&error];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:@"Bearer <token>" forHTTPHeaderField:@"Authorization"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:jsonData];
NSURLSessionDataTask *task = [[NSURLSession sharedSession]
dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"Error: %@", error);
return;
}
NSString *result = [[NSString alloc] initWithData:data
encoding:NSUTF8StringEncoding];
NSLog(@"%@", result);
}];
[task resume];
[[NSRunLoop mainRunLoop] run];
}
return 0;
}
(* Requires cohttp and yojson libraries *)
open Lwt
open Cohttp
open Cohttp_lwt_unix
let url = "https://aireiter.com/api/openapi/submit"
let payload = {|{
"model": "vidu_q4",
"params": {
"prompt": "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
"type": "frame",
"image_url": ["https://example.com/first-frame.jpg"],
"resolution": "720p",
"video_length": 5,
"generate_audio": true
},
"out_task_id": "vidu_q4_frame_123456"
}|}
let () =
let headers = Header.init ()
|> fun h -> Header.add h "Authorization" "Bearer <token>"
|> fun h -> Header.add h "Content-Type" "application/json"
in
let body = Cohttp_lwt.Body.of_string payload in
let response = Client.post ~headers ~body (Uri.of_string url) >>= fun (resp, body) ->
body |> Cohttp_lwt.Body.to_string >|= fun body_str ->
print_endline body_str
in
Lwt_main.run response
import 'dart:convert';
import 'package:http/http.dart' as http;
void main() async {
final url = Uri.parse('https://aireiter.com/api/openapi/submit');
final payload = {
"model": "vidu_q4",
"params": {
"prompt": "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
"type": "frame",
"image_url": ["https://example.com/first-frame.jpg"],
"resolution": "720p",
"video_length": 5,
"generate_audio": true
},
"out_task_id": "vidu_q4_frame_123456"
};
final response = await http.post(
url,
headers: {
'Authorization': 'Bearer <token>',
'Content-Type': 'application/json'
},
body: jsonEncode(payload),
);
print(response.body);
}
library(httr)
library(jsonlite)
url <- "https://aireiter.com/api/openapi/submit"
payload <- list(
model = "vidu_q4",
params = list(
prompt = "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
type = "frame",
image_url = I("https://example.com/first-frame.jpg"),
resolution = "720p",
video_length = 5,
generate_audio = TRUE
),
out_task_id = "vidu_q4_frame_123456"
)
response <- POST(
url,
add_headers(
Authorization = "Bearer <token>",
`Content-Type` = "application/json"
),
body = toJSON(payload, auto_unbox = TRUE),
encode = "raw"
)
cat(content(response, "text"))
{
"statusCode": 200,
"message": "",
"data": {
"out_task_id": "vidu_q4_frame_123456",
"status": "pending",
"created_at": "2026-10-16T07:56:45.511Z"
}
}
{
"statusCode": 400,
"message": "Missing required field: image_url",
"ok": false
}
{
"error": {
"code": 401,
"message": "Authentication failed, please check your API key"
}
}
{
"error": {
"code": 433,
"message": "Insufficient account balance, please recharge and try again"
}
}
{
"error": {
"code": 500,
"message": "Internal server error, please try again later"
}
}
The model name for Vidu Q4 in AIReiter is
vidu_q4. This model requires at least one image to be passed in, does not support pure text-to-video generation, and does not support start and end frames.Authorizations
string
required
All endpoints require Bearer Token authentication.Get an API Key:Visit the API Key management page to get your API Key.Add to the request header when using:
Authorization: Bearer YOUR_API_KEY
Body
string
required
Model name, fixed value:
vidu_q4
object
required
Model parameters object.
Show params Object Properties
Show params Object Properties
string
Video content description, up to 20,000 characters.
- Optional in
framemode, used to describe visual motion and camera movements - Required in
referencemode
string
default:"frame"
Generation mode:
frame- First frame, default value. Pass in 1 image as the first frame of the video; the video will retain the image’s aspect ratioreference- Reference, pass in 1-15 reference images, optionally with 0-3 reference audio clips
First frame mode allows only 1 image and does not accept
audio_url.string | string[]
required
Image URL, must be directly accessible via the public network.
frame- Exactly 1 image required, used as the first framereference- 1-15 reference images
- Formats: JPG, JPEG, PNG, WEBP
- Up to 50 MB per image
string | string[]
Reference audio URL, used to guide the tone and inflection in the generated video.Valid only in
reference mode, up to 3 clips.Audio requirements:- Format: MP3
- 3-12 seconds per clip
- Up to 50 MB per clip
Do not pass this parameter in
frame mode.integer
default:"5"
Generated video duration, in seconds.Supports integers:
3 to 16.string
default:"720p"
Output resolution:
540p720p- Default value1080p2K4K
string
default:"16:9"
Video aspect ratio, valid only in
reference mode. In frame mode, it adopts the aspect ratio of the first frame image and will be ignored if passed.Supported aspect ratios:16:9- Landscape, default value9:16- Portrait1:1- Square4:3- Standard landscape3:4- Standard portrait
boolean
default:"true"
Whether to generate synchronized audio (dialogue and sound effects).
true- Generate video with an audio track, default valuefalse- Output silent video
string
required
Caller task ID.User-defined task identifier, required. Supports only letters, numbers, underscores, and hyphens, with a length of 1-64 characters. This ID can be used later to query task status and results.
Response
string
Initiator task ID, can be used to query results.
string
Initial status, typically
"pending".string
Creation time, in ISO format.
Query Task
Vidu Q4 is an asynchronous video generation model. After submitting a task, please useout_task_id to query the task status; querying every 10-15 seconds is recommended.
string
required
The initiator task ID passed when submitting the task.
curl --request POST \
--url https://aireiter.com/api/openapi/query \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"out_task_id": "vidu_q4_frame_123456"
}'
output array in the response will contain the generated video, with elements containing the video field.
curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "vidu_q4",
"params": {
"prompt": "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
"type": "frame",
"image_url": ["https://example.com/first-frame.jpg"],
"resolution": "720p",
"video_length": 5,
"generate_audio": true
},
"out_task_id": "vidu_q4_frame_123456"
}'
curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "vidu_q4",
"params": {
"prompt": "The girl in reference image 1 walks through the street in reference image 2, saying in the voice of reference audio 1: The weather is so nice today",
"type": "reference",
"image_url": ["https://example.com/girl.jpg", "https://example.com/street.jpg"],
"audio_url": ["https://example.com/voice.mp3"],
"resolution": "1080p",
"aspect_ratio": "9:16",
"video_length": 8,
"generate_audio": true
},
"out_task_id": "vidu_q4_ref_123456"
}'
import requests
url = "https://aireiter.com/api/openapi/submit"
payload = {
"model": "vidu_q4",
"params": {
"prompt": "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
"type": "frame",
"image_url": ["https://example.com/first-frame.jpg"],
"resolution": "720p",
"video_length": 5,
"generate_audio": True
},
"out_task_id": "vidu_q4_frame_123456"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())
const url = "https://aireiter.com/api/openapi/submit";
const payload = {
model: "vidu_q4",
params: {
prompt: "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
type: "frame",
image_url: ["https://example.com/first-frame.jpg"],
resolution: "720p",
video_length: 5,
generate_audio: true
},
out_task_id: "vidu_q4_frame_123456"
};
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://aireiter.com/api/openapi/submit"
payload := map[string]interface{}{
"model": "vidu_q4",
"params": map[string]interface{}{
"prompt": "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
"type": "frame",
"image_url": []string{"https://example.com/first-frame.jpg"},
"resolution": "720p",
"video_length": 5,
"generate_audio": true,
},
"out_task_id": "vidu_q4_frame_123456",
}
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://aireiter.com/api/openapi/submit";
String payload = """
{
"model": "vidu_q4",
"params": {
"prompt": "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
"type": "frame",
"image_url": ["https://example.com/first-frame.jpg"],
"resolution": "720p",
"video_length": 5,
"generate_audio": true
},
"out_task_id": "vidu_q4_frame_123456"
}
""";
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://aireiter.com/api/openapi/submit";
$payload = [
"model" => "vidu_q4",
"params" => [
"prompt" => "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
"type" => "frame",
"image_url" => ["https://example.com/first-frame.jpg"],
"resolution" => "720p",
"video_length" => 5,
"generate_audio" => true
],
"out_task_id" => "vidu_q4_frame_123456"
];
$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://aireiter.com/api/openapi/submit")
payload = {
model: "vidu_q4",
params: {
prompt: "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
type: "frame",
image_url: ["https://example.com/first-frame.jpg"],
resolution: "720p",
video_length: 5,
generate_audio: true
},
out_task_id: "vidu_q4_frame_123456"
}
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://aireiter.com/api/openapi/submit")!
let payload: [String: Any] = [
"model": "vidu_q4",
"params": [
"prompt": "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
"type": "frame",
"image_url": ["https://example.com/first-frame.jpg"],
"resolution": "720p",
"video_length": 5,
"generate_audio": true
],
"out_task_id": "vidu_q4_frame_123456"
]
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://aireiter.com/api/openapi/submit";
var payload = @"
{
""model"": ""vidu_q4"",
""params"": {
""prompt"": ""A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text"",
""type"": ""frame"",
""image_url"": [""https://example.com/first-frame.jpg""],
""resolution"": ""720p"",
""video_length"": 5,
""generate_audio"": true
},
""out_task_id"": ""vidu_q4_frame_123456""
}";
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);
}
}
#include <stdio.h>
#include <curl/curl.h>
int main(void) {
CURL *curl;
CURLcode res;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl) {
const char *url = "https://aireiter.com/api/openapi/submit";
const char *payload = "{\"model\":\"vidu_q4\",\"params\":{\"prompt\":\"A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text\",\"type\":\"frame\",\"image_url\":[\"https://example.com/first-frame.jpg\"],\"resolution\":\"720p\",\"video_length\":5,\"generate_audio\":true},\"out_task_id\":\"vidu_q4_frame_123456\"}";
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Authorization: Bearer <token>");
headers = curl_slist_append(headers, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, payload);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
res = curl_easy_perform(curl);
if(res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
}
curl_global_cleanup();
return 0;
}
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSURL *url = [NSURL URLWithString:@"https://aireiter.com/api/openapi/submit"];
NSDictionary *payload = @{
@"model": @"vidu_q4",
@"params": @{
@"prompt": @"A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
@"type": @"frame",
@"image_url": @[@"https://example.com/first-frame.jpg"],
@"resolution": @"720p",
@"video_length": @5,
@"generate_audio": @YES
},
@"out_task_id": @"vidu_q4_frame_123456"
};
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:payload
options:0
error:&error];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:@"Bearer <token>" forHTTPHeaderField:@"Authorization"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:jsonData];
NSURLSessionDataTask *task = [[NSURLSession sharedSession]
dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"Error: %@", error);
return;
}
NSString *result = [[NSString alloc] initWithData:data
encoding:NSUTF8StringEncoding];
NSLog(@"%@", result);
}];
[task resume];
[[NSRunLoop mainRunLoop] run];
}
return 0;
}
(* Requires cohttp and yojson libraries *)
open Lwt
open Cohttp
open Cohttp_lwt_unix
let url = "https://aireiter.com/api/openapi/submit"
let payload = {|{
"model": "vidu_q4",
"params": {
"prompt": "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
"type": "frame",
"image_url": ["https://example.com/first-frame.jpg"],
"resolution": "720p",
"video_length": 5,
"generate_audio": true
},
"out_task_id": "vidu_q4_frame_123456"
}|}
let () =
let headers = Header.init ()
|> fun h -> Header.add h "Authorization" "Bearer <token>"
|> fun h -> Header.add h "Content-Type" "application/json"
in
let body = Cohttp_lwt.Body.of_string payload in
let response = Client.post ~headers ~body (Uri.of_string url) >>= fun (resp, body) ->
body |> Cohttp_lwt.Body.to_string >|= fun body_str ->
print_endline body_str
in
Lwt_main.run response
import 'dart:convert';
import 'package:http/http.dart' as http;
void main() async {
final url = Uri.parse('https://aireiter.com/api/openapi/submit');
final payload = {
"model": "vidu_q4",
"params": {
"prompt": "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
"type": "frame",
"image_url": ["https://example.com/first-frame.jpg"],
"resolution": "720p",
"video_length": 5,
"generate_audio": true
},
"out_task_id": "vidu_q4_frame_123456"
};
final response = await http.post(
url,
headers: {
'Authorization': 'Bearer <token>',
'Content-Type': 'application/json'
},
body: jsonEncode(payload),
);
print(response.body);
}
library(httr)
library(jsonlite)
url <- "https://aireiter.com/api/openapi/submit"
payload <- list(
model = "vidu_q4",
params = list(
prompt = "A girl turns to the camera, smiles and says hello, breeze blowing her hair, cinematic, no text",
type = "frame",
image_url = I("https://example.com/first-frame.jpg"),
resolution = "720p",
video_length = 5,
generate_audio = TRUE
),
out_task_id = "vidu_q4_frame_123456"
)
response <- POST(
url,
add_headers(
Authorization = "Bearer <token>",
`Content-Type` = "application/json"
),
body = toJSON(payload, auto_unbox = TRUE),
encode = "raw"
)
cat(content(response, "text"))
{
"statusCode": 200,
"message": "",
"data": {
"out_task_id": "vidu_q4_frame_123456",
"status": "pending",
"created_at": "2026-10-16T07:56:45.511Z"
}
}
{
"statusCode": 400,
"message": "Missing required field: image_url",
"ok": false
}
{
"error": {
"code": 401,
"message": "Authentication failed, please check your API key"
}
}
{
"error": {
"code": 433,
"message": "Insufficient account balance, please recharge and try again"
}
}
{
"error": {
"code": 500,
"message": "Internal server error, please try again later"
}
}
Mode Notes
frame uses 1 image as the first frame to generate a video, the prompt is optional, and the aspect ratio follows the image; reference combines 1-15 reference images and up to 3 reference audio clips to generate new visuals, the prompt is required, and the aspect ratio can be specified.When
type is frame, image_url must contain exactly 1 image, and do not pass audio_url. When type is reference, prompt cannot be empty, with a maximum of 15 reference images and up to 3 reference audio clips.