curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "minimax_h3",
"params": {
"prompt": "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
"type": "text_to_video",
"video_length": 5,
"quality": "2k",
"aspect_ratio": "16:9"
},
"out_task_id": "minimax_h3_text_123456"
}'
curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "minimax_h3",
"params": {
"prompt": "두 구도 사이의 부드러운 전환, 부드러운 바람, 은은한 카메라 인",
"type": "first_last_frame",
"image_url": [
"https://example.com/first.jpg",
"https://example.com/last.jpg"
],
"video_length": 6,
"quality": "2k"
},
"out_task_id": "minimax_h3_frame_123456"
}'
curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "minimax_h3",
"params": {
"prompt": "일관된 제품 외관과 시네마틱 모션을 갖춘 세련된 전자상거래 제품 영상을 생성하세요",
"type": "all_reference",
"image_url": [
"https://example.com/product-front.jpg",
"https://example.com/product-lifestyle.jpg"
],
"video_url": ["https://example.com/motion-reference.mp4"],
"audio_url": ["https://example.com/music-reference.mp3"],
"video_length": 5,
"quality": "2k",
"aspect_ratio": "16:9"
},
"out_task_id": "minimax_h3_reference_123456"
}'
import requests
url = "https://aireiter.com/api/openapi/submit"
payload = {
"model": "minimax_h3",
"params": {
"prompt": "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
"type": "text_to_video",
"video_length": 5,
"quality": "2k",
"aspect_ratio": "16:9"
},
"out_task_id": "minimax_h3_text_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: "minimax_h3",
params: {
prompt: "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
type: "text_to_video",
video_length: 5,
quality: "2k",
aspect_ratio: "16:9"
},
out_task_id: "minimax_h3_text_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": "minimax_h3",
"params": map[string]interface{}{
"prompt": "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
"type": "text_to_video",
"video_length": 5,
"quality": "2k",
"aspect_ratio": "16:9",
},
"out_task_id": "minimax_h3_text_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": "minimax_h3",
"params": {
"prompt": "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
"type": "text_to_video",
"video_length": 5,
"quality": "2k",
"aspect_ratio": "16:9"
},
"out_task_id": "minimax_h3_text_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" => "minimax_h3",
"params" => [
"prompt" => "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
"type" => "text_to_video",
"video_length" => 5,
"quality" => "2k",
"aspect_ratio" => "16:9"
],
"out_task_id" => "minimax_h3_text_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: "minimax_h3",
params: {
prompt: "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
type: "text_to_video",
video_length: 5,
quality: "2k",
aspect_ratio: "16:9"
},
out_task_id: "minimax_h3_text_123456"
}
http = Net::HTTP.new(url.host, url.port)
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": "minimax_h3",
"params": [
"prompt": "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
"type": "text_to_video",
"video_length": 5,
"quality": "2k",
"aspect_ratio": "16:9"
],
"out_task_id": "minimax_h3_text_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"": ""minimax_h3"",
""params"": {
""prompt"": ""황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷"",
""type"": ""text_to_video"",
""video_length"": 5,
""quality"": ""2k"",
""aspect_ratio"": ""16:9""
},
""out_task_id"": ""minimax_h3_text_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\":\"minimax_h3\",\"params\":{\"prompt\":\"황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷\",\"type\":\"text_to_video\",\"video_length\":5,\"quality\":\"2k\",\"aspect_ratio\":\"16:9\"},\"out_task_id\":\"minimax_h3_text_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": @"minimax_h3",
@"params": @{
@"prompt": @"황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
@"type": @"text_to_video",
@"video_length": @5,
@"quality": @"2k",
@"aspect_ratio": @"16:9"
},
@"out_task_id": @"minimax_h3_text_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": "minimax_h3",
"params": {
"prompt": "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
"type": "text_to_video",
"video_length": 5,
"quality": "2k",
"aspect_ratio": "16:9"
},
"out_task_id": "minimax_h3_text_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": "minimax_h3",
"params": {
"prompt": "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
"type": "text_to_video",
"video_length": 5,
"quality": "2k",
"aspect_ratio": "16:9"
},
"out_task_id": "minimax_h3_text_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 = "minimax_h3",
params = list(
prompt = "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
type = "text_to_video",
video_length = 5,
quality = "2k",
aspect_ratio = "16:9"
),
out_task_id = "minimax_h3_text_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": "minimax_h3_text_123456",
"status": "pending",
"estimated_credits": 100,
"created_at": "2025-12-22T06:03:28.242Z"
}
}
{
"statusCode": 400,
"message": "요청 매개변수가 유효하지 않습니다",
"ok": false
}
{
"error": {
"code": 401,
"message": "인증에 실패했습니다. API 키를 확인하세요"
}
}
{
"error": {
"code": 433,
"message": "계정 잔액이 부족합니다. 충전 후 다시 시도하세요"
}
}
{
"error": {
"code": 500,
"message": "서버 내부 오류입니다. 나중에 다시 시도하세요"
}
}
MiniMax H3
MiniMax H3 비디오 생성
- MiniMax H3, Hailuo 03 / Hailuo 3라고도 불립니다
- 비동기 처리 모드, 후속 조회를 위한 작업 ID를 반환합니다
- 텍스트-비디오, 첫 프레임/마지막 프레임 이미지-비디오, 여러 참고 자료를 사용한 비디오 생성을 지원합니다
- 768P / 2K 출력을 지원하며, 비디오 길이는 4-15초입니다
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": "minimax_h3",
"params": {
"prompt": "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
"type": "text_to_video",
"video_length": 5,
"quality": "2k",
"aspect_ratio": "16:9"
},
"out_task_id": "minimax_h3_text_123456"
}'
curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "minimax_h3",
"params": {
"prompt": "두 구도 사이의 부드러운 전환, 부드러운 바람, 은은한 카메라 인",
"type": "first_last_frame",
"image_url": [
"https://example.com/first.jpg",
"https://example.com/last.jpg"
],
"video_length": 6,
"quality": "2k"
},
"out_task_id": "minimax_h3_frame_123456"
}'
curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "minimax_h3",
"params": {
"prompt": "일관된 제품 외관과 시네마틱 모션을 갖춘 세련된 전자상거래 제품 영상을 생성하세요",
"type": "all_reference",
"image_url": [
"https://example.com/product-front.jpg",
"https://example.com/product-lifestyle.jpg"
],
"video_url": ["https://example.com/motion-reference.mp4"],
"audio_url": ["https://example.com/music-reference.mp3"],
"video_length": 5,
"quality": "2k",
"aspect_ratio": "16:9"
},
"out_task_id": "minimax_h3_reference_123456"
}'
import requests
url = "https://aireiter.com/api/openapi/submit"
payload = {
"model": "minimax_h3",
"params": {
"prompt": "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
"type": "text_to_video",
"video_length": 5,
"quality": "2k",
"aspect_ratio": "16:9"
},
"out_task_id": "minimax_h3_text_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: "minimax_h3",
params: {
prompt: "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
type: "text_to_video",
video_length: 5,
quality: "2k",
aspect_ratio: "16:9"
},
out_task_id: "minimax_h3_text_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": "minimax_h3",
"params": map[string]interface{}{
"prompt": "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
"type": "text_to_video",
"video_length": 5,
"quality": "2k",
"aspect_ratio": "16:9",
},
"out_task_id": "minimax_h3_text_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": "minimax_h3",
"params": {
"prompt": "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
"type": "text_to_video",
"video_length": 5,
"quality": "2k",
"aspect_ratio": "16:9"
},
"out_task_id": "minimax_h3_text_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" => "minimax_h3",
"params" => [
"prompt" => "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
"type" => "text_to_video",
"video_length" => 5,
"quality" => "2k",
"aspect_ratio" => "16:9"
],
"out_task_id" => "minimax_h3_text_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: "minimax_h3",
params: {
prompt: "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
type: "text_to_video",
video_length: 5,
quality: "2k",
aspect_ratio: "16:9"
},
out_task_id: "minimax_h3_text_123456"
}
http = Net::HTTP.new(url.host, url.port)
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": "minimax_h3",
"params": [
"prompt": "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
"type": "text_to_video",
"video_length": 5,
"quality": "2k",
"aspect_ratio": "16:9"
],
"out_task_id": "minimax_h3_text_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"": ""minimax_h3"",
""params"": {
""prompt"": ""황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷"",
""type"": ""text_to_video"",
""video_length"": 5,
""quality"": ""2k"",
""aspect_ratio"": ""16:9""
},
""out_task_id"": ""minimax_h3_text_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\":\"minimax_h3\",\"params\":{\"prompt\":\"황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷\",\"type\":\"text_to_video\",\"video_length\":5,\"quality\":\"2k\",\"aspect_ratio\":\"16:9\"},\"out_task_id\":\"minimax_h3_text_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": @"minimax_h3",
@"params": @{
@"prompt": @"황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
@"type": @"text_to_video",
@"video_length": @5,
@"quality": @"2k",
@"aspect_ratio": @"16:9"
},
@"out_task_id": @"minimax_h3_text_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": "minimax_h3",
"params": {
"prompt": "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
"type": "text_to_video",
"video_length": 5,
"quality": "2k",
"aspect_ratio": "16:9"
},
"out_task_id": "minimax_h3_text_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": "minimax_h3",
"params": {
"prompt": "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
"type": "text_to_video",
"video_length": 5,
"quality": "2k",
"aspect_ratio": "16:9"
},
"out_task_id": "minimax_h3_text_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 = "minimax_h3",
params = list(
prompt = "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
type = "text_to_video",
video_length = 5,
quality = "2k",
aspect_ratio = "16:9"
),
out_task_id = "minimax_h3_text_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": "minimax_h3_text_123456",
"status": "pending",
"estimated_credits": 100,
"created_at": "2025-12-22T06:03:28.242Z"
}
}
{
"statusCode": 400,
"message": "요청 매개변수가 유효하지 않습니다",
"ok": false
}
{
"error": {
"code": 401,
"message": "인증에 실패했습니다. API 키를 확인하세요"
}
}
{
"error": {
"code": 433,
"message": "계정 잔액이 부족합니다. 충전 후 다시 시도하세요"
}
}
{
"error": {
"code": 500,
"message": "서버 내부 오류입니다. 나중에 다시 시도하세요"
}
}
AIReiter에서 MiniMax H3의 모델 이름은
minimax_h3입니다. 이 모델은 Hailuo 03, Hailuo 3 또는 MiniMax H3 API로도 자주 검색됩니다.Authorizations
string
필수
모든 인터페이스는 Bearer Token으로 인증해야 합니다.API Key 받기:API Key 관리 페이지에 접속하여 API Key를 받으세요.사용할 때는 요청 헤더에 다음을 추가하세요:
Authorization: Bearer YOUR_API_KEY
Body
string
필수
모델 이름, 고정값:
minimax_h3
object
필수
모델 파라미터 객체.
표시 params 객체 속성
표시 params 객체 속성
string
필수
비디오 생성용 텍스트 설명, 최대 7000자.주체, 장면, 카메라 움직임, 동작, 스타일, 조명, 리듬 등의 내용을 설명할 수 있습니다.
string
기본값:"text_to_video"
생성 유형, 어떤 비디오 생성 모드를 사용할지 결정합니다.
text_to_video- 텍스트-투-비디오, 프롬프트만 사용해 비디오를 생성합니다first_last_frame- 첫 프레임/마지막 프레임 이미지 기반 비디오 생성, 첫 프레임, 마지막 프레임 또는 첫-마지막 프레임 전환으로 비디오를 생성합니다all_reference- 다중 참조 소재 비디오 생성, 참조 이미지, 참조 비디오 및 참조 오디오를 사용할 수 있습니다
number
기본값:"4"
생성 비디오 길이, 단위는 초입니다.정수를 지원합니다:
4에서 15까지.string
기본값:"2k"
출력 품질:
768p2k
string
기본값:"16:9"
비디오 화면 비율.지원되는 화면 비율:
21:9- 초광폭16:9- 가로 화면, 기본값4:3- 표준 가로 화면1:1- 정사각형3:4- 세로 표준9:16- 세로 화면
first_last_frame 모드는 개별 화면 비율 선택을 지원하지 않으며, 출력은 입력 이미지 비율을 따릅니다.string | string[]
이미지 URL.
type에 따라 의미가 다릅니다:text_to_video- 이미지를 전달할 필요가 없습니다first_last_frame- 첫 프레임 이미지로 사용합니다. 배열을 전달할 수도 있으며, 첫 번째 이미지는 첫 프레임, 두 번째 이미지는 마지막 프레임으로 사용됩니다all_reference- 참조 이미지로 사용하며, 최대 9장까지 가능합니다
- JPG, JPEG, PNG, WEBP, HEIC, HEIF 지원
- 단일 이미지 최대 30MB
- 가로세로 범위 256-5760px
- 이미지 화면 비율 범위 0.4-2.5
string
마지막 프레임 이미지 URL.
first_last_frame 모드에서만 유효합니다. 마지막 프레임을 image_url 배열의 두 번째 이미지로 전달할 수도 있습니다.string | string[]
참조 비디오 URL.
all_reference 모드에서만 유효합니다.현재 최대 1개의 참조 비디오만 지원합니다.비디오 요구 사항:- 단일 비디오 길이 2-15초
- MP4, MOV 지원
- 비디오 인코딩 H.264 또는 H.265
- 오디오 인코딩 AAC 또는 MP3
- 단일 비디오 최대 50MB
- 가로세로 범위 256-5760px
- 프레임 속도 23.976-60 FPS
URL이 공개적으로 접근 가능해야 하며, 비디오 길이 메타데이터를 읽을 수 있어야 합니다.
string | string[]
참조 오디오 URL.
all_reference 모드에서만 유효하며, 최대 3개의 오디오를 지원합니다.오디오 요구 사항:- 단일 오디오 길이 2-15초
- WAV, MP3 지원
- 단일 오디오 최대 15MB
string
필수
요청 측 작업 ID.사용자가 정의한 작업 식별자로, 필수입니다. 이후 이 ID를 사용해 작업 상태와 결과를 조회할 수 있습니다.
Response
string
요청한 측의 작업 ID로, 결과를 조회하는 데 사용할 수 있습니다.
string
초기 상태이며, 일반적으로
"pending"입니다.number
예상 소모 포인트.
string
생성 시간, ISO 형식입니다.
Query Task
MiniMax H3는 비동기 비디오 생성 모델입니다. 작업을 제출한 후out_task_id를 사용하여 작업 상태를 조회하세요.
string
필수
작업 제출 시 전달된 요청 측 작업 ID입니다.
curl --request POST \
--url https://aireiter.com/api/openapi/query \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"out_task_id": "minimax_h3_task_123456"
}'
output 필드에 생성된 비디오 URL이 포함됩니다.
Request Examples
curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "minimax_h3",
"params": {
"prompt": "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
"type": "text_to_video",
"video_length": 5,
"quality": "2k",
"aspect_ratio": "16:9"
},
"out_task_id": "minimax_h3_text_123456"
}'
curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "minimax_h3",
"params": {
"prompt": "두 구도 사이의 부드러운 전환, 부드러운 바람, 은은한 카메라 인",
"type": "first_last_frame",
"image_url": [
"https://example.com/first.jpg",
"https://example.com/last.jpg"
],
"video_length": 6,
"quality": "2k"
},
"out_task_id": "minimax_h3_frame_123456"
}'
curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "minimax_h3",
"params": {
"prompt": "일관된 제품 외관과 시네마틱 모션을 갖춘 세련된 전자상거래 제품 영상을 생성하세요",
"type": "all_reference",
"image_url": [
"https://example.com/product-front.jpg",
"https://example.com/product-lifestyle.jpg"
],
"video_url": ["https://example.com/motion-reference.mp4"],
"audio_url": ["https://example.com/music-reference.mp3"],
"video_length": 5,
"quality": "2k",
"aspect_ratio": "16:9"
},
"out_task_id": "minimax_h3_reference_123456"
}'
import requests
url = "https://aireiter.com/api/openapi/submit"
payload = {
"model": "minimax_h3",
"params": {
"prompt": "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
"type": "text_to_video",
"video_length": 5,
"quality": "2k",
"aspect_ratio": "16:9"
},
"out_task_id": "minimax_h3_text_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: "minimax_h3",
params: {
prompt: "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
type: "text_to_video",
video_length: 5,
quality: "2k",
aspect_ratio: "16:9"
},
out_task_id: "minimax_h3_text_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": "minimax_h3",
"params": map[string]interface{}{
"prompt": "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
"type": "text_to_video",
"video_length": 5,
"quality": "2k",
"aspect_ratio": "16:9",
},
"out_task_id": "minimax_h3_text_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": "minimax_h3",
"params": {
"prompt": "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
"type": "text_to_video",
"video_length": 5,
"quality": "2k",
"aspect_ratio": "16:9"
},
"out_task_id": "minimax_h3_text_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" => "minimax_h3",
"params" => [
"prompt" => "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
"type" => "text_to_video",
"video_length" => 5,
"quality" => "2k",
"aspect_ratio" => "16:9"
],
"out_task_id" => "minimax_h3_text_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: "minimax_h3",
params: {
prompt: "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
type: "text_to_video",
video_length: 5,
quality: "2k",
aspect_ratio: "16:9"
},
out_task_id: "minimax_h3_text_123456"
}
http = Net::HTTP.new(url.host, url.port)
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": "minimax_h3",
"params": [
"prompt": "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
"type": "text_to_video",
"video_length": 5,
"quality": "2k",
"aspect_ratio": "16:9"
],
"out_task_id": "minimax_h3_text_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"": ""minimax_h3"",
""params"": {
""prompt"": ""황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷"",
""type"": ""text_to_video"",
""video_length"": 5,
""quality"": ""2k"",
""aspect_ratio"": ""16:9""
},
""out_task_id"": ""minimax_h3_text_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\":\"minimax_h3\",\"params\":{\"prompt\":\"황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷\",\"type\":\"text_to_video\",\"video_length\":5,\"quality\":\"2k\",\"aspect_ratio\":\"16:9\"},\"out_task_id\":\"minimax_h3_text_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": @"minimax_h3",
@"params": @{
@"prompt": @"황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
@"type": @"text_to_video",
@"video_length": @5,
@"quality": @"2k",
@"aspect_ratio": @"16:9"
},
@"out_task_id": @"minimax_h3_text_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": "minimax_h3",
"params": {
"prompt": "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
"type": "text_to_video",
"video_length": 5,
"quality": "2k",
"aspect_ratio": "16:9"
},
"out_task_id": "minimax_h3_text_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": "minimax_h3",
"params": {
"prompt": "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
"type": "text_to_video",
"video_length": 5,
"quality": "2k",
"aspect_ratio": "16:9"
},
"out_task_id": "minimax_h3_text_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 = "minimax_h3",
params = list(
prompt = "황혼 무렵 바람이 부는 절벽을 따라 걷는 외로운 여행자, 시네마틱 트래킹 샷",
type = "text_to_video",
video_length = 5,
quality = "2k",
aspect_ratio = "16:9"
),
out_task_id = "minimax_h3_text_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": "minimax_h3_text_123456",
"status": "pending",
"estimated_credits": 100,
"created_at": "2025-12-22T06:03:28.242Z"
}
}
{
"statusCode": 400,
"message": "요청 매개변수가 유효하지 않습니다",
"ok": false
}
{
"error": {
"code": 401,
"message": "인증에 실패했습니다. API 키를 확인하세요"
}
}
{
"error": {
"code": 433,
"message": "계정 잔액이 부족합니다. 충전 후 다시 시도하세요"
}
}
{
"error": {
"code": 500,
"message": "서버 내부 오류입니다. 나중에 다시 시도하세요"
}
}
Mode Notes
The
text_to_video mode will call MiniMax H3 text-to-video capabilities; the first_last_frame mode will call image-to-video capabilities; and the all_reference mode will call multi-reference asset generation capabilities.When
type is first_last_frame, do not rely on the aspect_ratio parameter. The output aspect ratio for this mode is determined by the input image.