curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "happyhorse_1_1",
"params": {
"prompt": "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
"image_url": [
"https://example.com/character.jpg",
"https://example.com/scene.jpg",
"https://example.com/prop.jpg"
],
"resolution": "1080p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 42
},
"out_task_id": "happyhorse_1_1_r2v_123456"
}'
import requests
url = "https://aireiter.com/api/openapi/submit"
payload = {
"model": "happyhorse_1_1",
"params": {
"prompt": "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
"image_url": ["https://example.com/character.jpg", "https://example.com/scene.jpg", "https://example.com/prop.jpg"],
"resolution": "1080p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 42
},
"out_task_id": "happyhorse_1_1_r2v_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: "happyhorse_1_1",
params: {
prompt: "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
image_url: ["https://example.com/character.jpg", "https://example.com/scene.jpg", "https://example.com/prop.jpg"],
resolution: "1080p",
aspect_ratio: "16:9",
video_length: 5,
seed: 42
},
out_task_id: "happyhorse_1_1_r2v_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": "happyhorse_1_1",
"params": map[string]interface{}{
"prompt": "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
"image_url": []interface{}{
"https://example.com/character.jpg",
"https://example.com/scene.jpg",
"https://example.com/prop.jpg",
},
"resolution": "1080p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 42,
},
"out_task_id": "happyhorse_1_1_r2v_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": "happyhorse_1_1",
"params": {
"prompt": "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
"image_url": [
"https://example.com/character.jpg",
"https://example.com/scene.jpg",
"https://example.com/prop.jpg"
],
"resolution": "1080p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 42
},
"out_task_id": "happyhorse_1_1_r2v_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" => "happyhorse_1_1",
"params" => [
"prompt" => "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
"image_url" => ["https://example.com/character.jpg", "https://example.com/scene.jpg", "https://example.com/prop.jpg"],
"resolution" => "1080p",
"aspect_ratio" => "16:9",
"video_length" => 5,
"seed" => 42
],
"out_task_id" => "happyhorse_1_1_r2v_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: "happyhorse_1_1",
params: {
prompt: "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
image_url: ["https://example.com/character.jpg", "https://example.com/scene.jpg", "https://example.com/prop.jpg"],
resolution: "1080p",
aspect_ratio: "16:9",
video_length: 5,
seed: 42
},
out_task_id: "happyhorse_1_1_r2v_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": "happyhorse_1_1",
"params": [
"prompt": "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
"image_url": ["https://example.com/character.jpg", "https://example.com/scene.jpg", "https://example.com/prop.jpg"],
"resolution": "1080p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 42
],
"out_task_id": "happyhorse_1_1_r2v_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"": ""happyhorse_1_1"",
""params"": {
""prompt"": ""The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion."",
""image_url"": [
""https://example.com/character.jpg"",
""https://example.com/scene.jpg"",
""https://example.com/prop.jpg""
],
""resolution"": ""1080p"",
""aspect_ratio"": ""16:9"",
""video_length"": 5,
""seed"": 42
},
""out_task_id"": ""happyhorse_1_1_r2v_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\":\"happyhorse_1_1\",\"params\":{\"prompt\":\"The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.\",\"image_url\":[\"https://example.com/character.jpg\",\"https://example.com/scene.jpg\",\"https://example.com/prop.jpg\"],\"resolution\":\"1080p\",\"aspect_ratio\":\"16:9\",\"video_length\":5,\"seed\":42},\"out_task_id\":\"happyhorse_1_1_r2v_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": @"happyhorse_1_1",
@"params": @{
@"prompt": @"The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
@"image_url": @[
@"https://example.com/character.jpg",
@"https://example.com/scene.jpg",
@"https://example.com/prop.jpg"
],
@"resolution": @"1080p",
@"aspect_ratio": @"16:9",
@"video_length": @5,
@"seed": @42
},
@"out_task_id": @"happyhorse_1_1_r2v_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": "happyhorse_1_1",
"params": {
"prompt": "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
"image_url": [
"https://example.com/character.jpg",
"https://example.com/scene.jpg",
"https://example.com/prop.jpg"
],
"resolution": "1080p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 42
},
"out_task_id": "happyhorse_1_1_r2v_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": "happyhorse_1_1",
"params": {
"prompt": "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
"image_url": ["https://example.com/character.jpg", "https://example.com/scene.jpg", "https://example.com/prop.jpg"],
"resolution": "1080p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 42
},
"out_task_id": "happyhorse_1_1_r2v_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 = "happyhorse_1_1",
params = list(
prompt = "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
image_url = list(
"https://example.com/character.jpg",
"https://example.com/scene.jpg",
"https://example.com/prop.jpg"
),
resolution = "1080p",
aspect_ratio = "16:9",
video_length = 5,
seed = 42
),
out_task_id = "happyhorse_1_1_r2v_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": "happyhorse_1_1_r2v_123456",
"status": "pending",
"estimated_credits": 100,
"created_at": "2025-12-22T06:03:28.242Z"
}
}
{
"statusCode": 400,
"message": "Invalid request parameters",
"ok": false
}
{
"error": {
"code": 401,
"message": "Authentication failed. Please check your API key"
}
}
{
"error": {
"code": 433,
"message": "Insufficient account balance. Please top up and try again"
}
}
{
"error": {
"code": 500,
"message": "Internal server error. Please try again later"
}
}
HappyHorse 1.1
HappyHorse 1.1 Multi-Reference Image Video Generation
- Generate videos using 1 to 9 ordered reference images
- Supports 720p / 1080p, 9 aspect ratios, and 3-15 second durations
- Use [Image 1], [Image 2] in the prompt to correspond to the reference images
- Asynchronous processing mode returns a task ID for later queries
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": "happyhorse_1_1",
"params": {
"prompt": "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
"image_url": [
"https://example.com/character.jpg",
"https://example.com/scene.jpg",
"https://example.com/prop.jpg"
],
"resolution": "1080p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 42
},
"out_task_id": "happyhorse_1_1_r2v_123456"
}'
import requests
url = "https://aireiter.com/api/openapi/submit"
payload = {
"model": "happyhorse_1_1",
"params": {
"prompt": "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
"image_url": ["https://example.com/character.jpg", "https://example.com/scene.jpg", "https://example.com/prop.jpg"],
"resolution": "1080p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 42
},
"out_task_id": "happyhorse_1_1_r2v_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: "happyhorse_1_1",
params: {
prompt: "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
image_url: ["https://example.com/character.jpg", "https://example.com/scene.jpg", "https://example.com/prop.jpg"],
resolution: "1080p",
aspect_ratio: "16:9",
video_length: 5,
seed: 42
},
out_task_id: "happyhorse_1_1_r2v_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": "happyhorse_1_1",
"params": map[string]interface{}{
"prompt": "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
"image_url": []interface{}{
"https://example.com/character.jpg",
"https://example.com/scene.jpg",
"https://example.com/prop.jpg",
},
"resolution": "1080p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 42,
},
"out_task_id": "happyhorse_1_1_r2v_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": "happyhorse_1_1",
"params": {
"prompt": "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
"image_url": [
"https://example.com/character.jpg",
"https://example.com/scene.jpg",
"https://example.com/prop.jpg"
],
"resolution": "1080p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 42
},
"out_task_id": "happyhorse_1_1_r2v_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" => "happyhorse_1_1",
"params" => [
"prompt" => "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
"image_url" => ["https://example.com/character.jpg", "https://example.com/scene.jpg", "https://example.com/prop.jpg"],
"resolution" => "1080p",
"aspect_ratio" => "16:9",
"video_length" => 5,
"seed" => 42
],
"out_task_id" => "happyhorse_1_1_r2v_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: "happyhorse_1_1",
params: {
prompt: "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
image_url: ["https://example.com/character.jpg", "https://example.com/scene.jpg", "https://example.com/prop.jpg"],
resolution: "1080p",
aspect_ratio: "16:9",
video_length: 5,
seed: 42
},
out_task_id: "happyhorse_1_1_r2v_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": "happyhorse_1_1",
"params": [
"prompt": "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
"image_url": ["https://example.com/character.jpg", "https://example.com/scene.jpg", "https://example.com/prop.jpg"],
"resolution": "1080p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 42
],
"out_task_id": "happyhorse_1_1_r2v_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"": ""happyhorse_1_1"",
""params"": {
""prompt"": ""The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion."",
""image_url"": [
""https://example.com/character.jpg"",
""https://example.com/scene.jpg"",
""https://example.com/prop.jpg""
],
""resolution"": ""1080p"",
""aspect_ratio"": ""16:9"",
""video_length"": 5,
""seed"": 42
},
""out_task_id"": ""happyhorse_1_1_r2v_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\":\"happyhorse_1_1\",\"params\":{\"prompt\":\"The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.\",\"image_url\":[\"https://example.com/character.jpg\",\"https://example.com/scene.jpg\",\"https://example.com/prop.jpg\"],\"resolution\":\"1080p\",\"aspect_ratio\":\"16:9\",\"video_length\":5,\"seed\":42},\"out_task_id\":\"happyhorse_1_1_r2v_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": @"happyhorse_1_1",
@"params": @{
@"prompt": @"The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
@"image_url": @[
@"https://example.com/character.jpg",
@"https://example.com/scene.jpg",
@"https://example.com/prop.jpg"
],
@"resolution": @"1080p",
@"aspect_ratio": @"16:9",
@"video_length": @5,
@"seed": @42
},
@"out_task_id": @"happyhorse_1_1_r2v_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": "happyhorse_1_1",
"params": {
"prompt": "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
"image_url": [
"https://example.com/character.jpg",
"https://example.com/scene.jpg",
"https://example.com/prop.jpg"
],
"resolution": "1080p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 42
},
"out_task_id": "happyhorse_1_1_r2v_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": "happyhorse_1_1",
"params": {
"prompt": "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
"image_url": ["https://example.com/character.jpg", "https://example.com/scene.jpg", "https://example.com/prop.jpg"],
"resolution": "1080p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 42
},
"out_task_id": "happyhorse_1_1_r2v_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 = "happyhorse_1_1",
params = list(
prompt = "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
image_url = list(
"https://example.com/character.jpg",
"https://example.com/scene.jpg",
"https://example.com/prop.jpg"
),
resolution = "1080p",
aspect_ratio = "16:9",
video_length = 5,
seed = 42
),
out_task_id = "happyhorse_1_1_r2v_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": "happyhorse_1_1_r2v_123456",
"status": "pending",
"estimated_credits": 100,
"created_at": "2025-12-22T06:03:28.242Z"
}
}
{
"statusCode": 400,
"message": "Invalid request parameters",
"ok": false
}
{
"error": {
"code": 401,
"message": "Authentication failed. Please check your API key"
}
}
{
"error": {
"code": 433,
"message": "Insufficient account balance. Please top up and try again"
}
}
{
"error": {
"code": 500,
"message": "Internal server error. Please try again later"
}
}
The model name for HappyHorse 1.1 in AIReiter is
happyhorse_1_1, and it currently provides a multi-reference-image video generation workflow.Authorizations
string
required
All endpoints require Bearer Token authentication.Visit the API Key management page to get an API Key, and add the following to the request headers:
Authorization: Bearer YOUR_API_KEY
Body
string
required
Model name, fixed to
happyhorse_1_1.object
required
Model parameters object.
Show Params Object Properties
Show Params Object Properties
string
required
Description of the video content, actions, and visual style.In the prompt, use markers such as
[Image 1] and [Image 2] to refer to the images at the corresponding positions in the image_url array, and describe the specific objects in the images. For example: The woman in a red cheongsam in [Image 1] opens the folding fan in [Image 2].Supports up to 2500 Chinese characters or 5000 non-Chinese characters; anything beyond that will be truncated.string | string[]
required
Reference image URL, supports 1-9 images. The image order must match the
[Image N] markers in the prompt.Image requirements:- Supports JPEG, JPG, PNG, WEBP
- The shorter side must be at least 400px; 720p or higher resolution is recommended
- Each image must be no larger than 10MB
- The URL must be directly accessible from the public internet
string
default:"1080p"
Output resolution:
720p or 1080p.string
default:"16:9"
Output video aspect ratio.Supported:
16:9, 9:16, 3:4, 4:3, 4:5, 5:4, 1:1, 9:21, 21:9.integer
default:"5"
Output video duration, in seconds. Supports integers between 3 and 15.
integer
default:"0"
Random seed, ranging from 0 to 2147483647. When
0 is passed or omitted, a random seed is used.string
required
A unique task ID generated by the caller. Use this ID later to query the task status and results.Only letters, numbers, underscores, and hyphens are supported, with a length of 1-64 characters.
Response
string
Caller task ID, which can be used to query the result.
string
Initial status, usually
pending.string
Creation time, in ISO 8601 format.
Query Task
After the task is submitted successfully, query its status using the sameout_task_id. Task statuses include pending, processing, completed, and failed; after completion, the output array contains the video result.
curl --request POST \
--url https://aireiter.com/api/openapi/query \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"out_task_id": "happyhorse_1_1_task_123456"
}'
Request Example
curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "happyhorse_1_1",
"params": {
"prompt": "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
"image_url": [
"https://example.com/character.jpg",
"https://example.com/scene.jpg",
"https://example.com/prop.jpg"
],
"resolution": "1080p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 42
},
"out_task_id": "happyhorse_1_1_r2v_123456"
}'
import requests
url = "https://aireiter.com/api/openapi/submit"
payload = {
"model": "happyhorse_1_1",
"params": {
"prompt": "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
"image_url": ["https://example.com/character.jpg", "https://example.com/scene.jpg", "https://example.com/prop.jpg"],
"resolution": "1080p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 42
},
"out_task_id": "happyhorse_1_1_r2v_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: "happyhorse_1_1",
params: {
prompt: "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
image_url: ["https://example.com/character.jpg", "https://example.com/scene.jpg", "https://example.com/prop.jpg"],
resolution: "1080p",
aspect_ratio: "16:9",
video_length: 5,
seed: 42
},
out_task_id: "happyhorse_1_1_r2v_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": "happyhorse_1_1",
"params": map[string]interface{}{
"prompt": "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
"image_url": []interface{}{
"https://example.com/character.jpg",
"https://example.com/scene.jpg",
"https://example.com/prop.jpg",
},
"resolution": "1080p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 42,
},
"out_task_id": "happyhorse_1_1_r2v_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": "happyhorse_1_1",
"params": {
"prompt": "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
"image_url": [
"https://example.com/character.jpg",
"https://example.com/scene.jpg",
"https://example.com/prop.jpg"
],
"resolution": "1080p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 42
},
"out_task_id": "happyhorse_1_1_r2v_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" => "happyhorse_1_1",
"params" => [
"prompt" => "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
"image_url" => ["https://example.com/character.jpg", "https://example.com/scene.jpg", "https://example.com/prop.jpg"],
"resolution" => "1080p",
"aspect_ratio" => "16:9",
"video_length" => 5,
"seed" => 42
],
"out_task_id" => "happyhorse_1_1_r2v_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: "happyhorse_1_1",
params: {
prompt: "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
image_url: ["https://example.com/character.jpg", "https://example.com/scene.jpg", "https://example.com/prop.jpg"],
resolution: "1080p",
aspect_ratio: "16:9",
video_length: 5,
seed: 42
},
out_task_id: "happyhorse_1_1_r2v_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": "happyhorse_1_1",
"params": [
"prompt": "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
"image_url": ["https://example.com/character.jpg", "https://example.com/scene.jpg", "https://example.com/prop.jpg"],
"resolution": "1080p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 42
],
"out_task_id": "happyhorse_1_1_r2v_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"": ""happyhorse_1_1"",
""params"": {
""prompt"": ""The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion."",
""image_url"": [
""https://example.com/character.jpg"",
""https://example.com/scene.jpg"",
""https://example.com/prop.jpg""
],
""resolution"": ""1080p"",
""aspect_ratio"": ""16:9"",
""video_length"": 5,
""seed"": 42
},
""out_task_id"": ""happyhorse_1_1_r2v_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\":\"happyhorse_1_1\",\"params\":{\"prompt\":\"The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.\",\"image_url\":[\"https://example.com/character.jpg\",\"https://example.com/scene.jpg\",\"https://example.com/prop.jpg\"],\"resolution\":\"1080p\",\"aspect_ratio\":\"16:9\",\"video_length\":5,\"seed\":42},\"out_task_id\":\"happyhorse_1_1_r2v_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": @"happyhorse_1_1",
@"params": @{
@"prompt": @"The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
@"image_url": @[
@"https://example.com/character.jpg",
@"https://example.com/scene.jpg",
@"https://example.com/prop.jpg"
],
@"resolution": @"1080p",
@"aspect_ratio": @"16:9",
@"video_length": @5,
@"seed": @42
},
@"out_task_id": @"happyhorse_1_1_r2v_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": "happyhorse_1_1",
"params": {
"prompt": "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
"image_url": [
"https://example.com/character.jpg",
"https://example.com/scene.jpg",
"https://example.com/prop.jpg"
],
"resolution": "1080p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 42
},
"out_task_id": "happyhorse_1_1_r2v_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": "happyhorse_1_1",
"params": {
"prompt": "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
"image_url": ["https://example.com/character.jpg", "https://example.com/scene.jpg", "https://example.com/prop.jpg"],
"resolution": "1080p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 42
},
"out_task_id": "happyhorse_1_1_r2v_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 = "happyhorse_1_1",
params = list(
prompt = "The woman in [Image 1] walks into the scene in [Image 2], then picks up the prop in [Image 3]. Keep a smooth 3D cartoon style and natural motion.",
image_url = list(
"https://example.com/character.jpg",
"https://example.com/scene.jpg",
"https://example.com/prop.jpg"
),
resolution = "1080p",
aspect_ratio = "16:9",
video_length = 5,
seed = 42
),
out_task_id = "happyhorse_1_1_r2v_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": "happyhorse_1_1_r2v_123456",
"status": "pending",
"estimated_credits": 100,
"created_at": "2025-12-22T06:03:28.242Z"
}
}
{
"statusCode": 400,
"message": "Invalid request parameters",
"ok": false
}
{
"error": {
"code": 401,
"message": "Authentication failed. Please check your API key"
}
}
{
"error": {
"code": 433,
"message": "Insufficient account balance. Please top up and try again"
}
}
{
"error": {
"code": 500,
"message": "Internal server error. Please try again later"
}
}
The order of the image array does not match the
[Image N] references in the prompt, which may cause confusion between the character, props, or scene.