curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "happyhorse_1_0",
"params": {
"type": "text_to_video",
"prompt": "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
"resolution": "720p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 0
},
"out_task_id": "happyhorse_1_0_t2v_123456"
}'
curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "happyhorse_1_0",
"params": {
"type": "image_to_video",
"prompt": "Make the cat in the image run naturally across the grass, with the camera smoothly following",
"image_url": ["https://example.com/cat.png"],
"resolution": "720p",
"video_length": 5
},
"out_task_id": "happyhorse_1_0_i2v_123456"
}'
curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "happyhorse_1_0",
"params": {
"type": "reference_to_video",
"prompt": "character1 walks into character2's scene and picks up the prop in character3, maintaining a smooth 3D cartoon style",
"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": 8
},
"out_task_id": "happyhorse_1_0_r2v_123456"
}'
curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "happyhorse_1_0",
"params": {
"type": "video_edit",
"prompt": "Change the red paper airplane in the video to blue, while preserving the original background and camera motion",
"video_url": ["https://example.com/source.mp4"],
"image_url": ["https://example.com/blue-paper-plane.jpg"],
"resolution": "720p",
"keep_original_sound": true,
"seed": 42
},
"out_task_id": "happyhorse_1_0_edit_123456"
}'
import requests
url = "https://aireiter.com/api/openapi/submit"
payload = {
"model": "happyhorse_1_0",
"params": {
"type": "text_to_video",
"prompt": "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
"resolution": "720p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 0
},
"out_task_id": "happyhorse_1_0_t2v_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_0",
params: {
type: "text_to_video",
prompt: "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
resolution: "720p",
aspect_ratio: "16:9",
video_length: 5,
seed: 0
},
out_task_id: "happyhorse_1_0_t2v_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_0",
"params": map[string]interface{}{
"type": "text_to_video",
"prompt": "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
"resolution": "720p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 0,
},
"out_task_id": "happyhorse_1_0_t2v_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_0",
"params": {
"type": "text_to_video",
"prompt": "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
"resolution": "720p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 0
},
"out_task_id": "happyhorse_1_0_t2v_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_0",
"params" => [
"type" => "text_to_video",
"prompt" => "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
"resolution" => "720p",
"aspect_ratio" => "16:9",
"video_length" => 5,
"seed" => 0
],
"out_task_id" => "happyhorse_1_0_t2v_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_0",
params: {
type: "text_to_video",
prompt: "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
resolution: "720p",
aspect_ratio: "16:9",
video_length: 5,
seed: 0
},
out_task_id: "happyhorse_1_0_t2v_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_0",
"params": [
"type": "text_to_video",
"prompt": "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
"resolution": "720p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 0
],
"out_task_id": "happyhorse_1_0_t2v_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_0"",
""params"": {
""type"": ""text_to_video"",
""prompt"": ""A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight"",
""resolution"": ""720p"",
""aspect_ratio"": ""16:9"",
""video_length"": 5,
""seed"": 0
},
""out_task_id"": ""happyhorse_1_0_t2v_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_0\",\"params\":{\"type\":\"text_to_video\",\"prompt\":\"A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight\",\"resolution\":\"720p\",\"aspect_ratio\":\"16:9\",\"video_length\":5,\"seed\":0},\"out_task_id\":\"happyhorse_1_0_t2v_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_0",
@"params": @{
@"type": @"text_to_video",
@"prompt": @"A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
@"resolution": @"720p",
@"aspect_ratio": @"16:9",
@"video_length": @5,
@"seed": @0
},
@"out_task_id": @"happyhorse_1_0_t2v_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_0",
"params": {
"type": "text_to_video",
"prompt": "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
"resolution": "720p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 0
},
"out_task_id": "happyhorse_1_0_t2v_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_0",
"params": {
"type": "text_to_video",
"prompt": "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
"resolution": "720p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 0
},
"out_task_id": "happyhorse_1_0_t2v_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_0",
params = list(
type = "text_to_video",
prompt = "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
resolution = "720p",
aspect_ratio = "16:9",
video_length = 5,
seed = 0
),
out_task_id = "happyhorse_1_0_t2v_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_0_t2v_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.0
HappyHorse 1.0 Video Generation and Editing
- Supports text-to-video, image-to-video, multi-reference image-to-video, and video editing
- Supports 720p / 1080p output and 3-15 second video generation
- Text-to-video and multi-reference image-to-video support 9 aspect ratios
- Asynchronous processing mode returns a task ID for later query
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_0",
"params": {
"type": "text_to_video",
"prompt": "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
"resolution": "720p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 0
},
"out_task_id": "happyhorse_1_0_t2v_123456"
}'
curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "happyhorse_1_0",
"params": {
"type": "image_to_video",
"prompt": "Make the cat in the image run naturally across the grass, with the camera smoothly following",
"image_url": ["https://example.com/cat.png"],
"resolution": "720p",
"video_length": 5
},
"out_task_id": "happyhorse_1_0_i2v_123456"
}'
curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "happyhorse_1_0",
"params": {
"type": "reference_to_video",
"prompt": "character1 walks into character2's scene and picks up the prop in character3, maintaining a smooth 3D cartoon style",
"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": 8
},
"out_task_id": "happyhorse_1_0_r2v_123456"
}'
curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "happyhorse_1_0",
"params": {
"type": "video_edit",
"prompt": "Change the red paper airplane in the video to blue, while preserving the original background and camera motion",
"video_url": ["https://example.com/source.mp4"],
"image_url": ["https://example.com/blue-paper-plane.jpg"],
"resolution": "720p",
"keep_original_sound": true,
"seed": 42
},
"out_task_id": "happyhorse_1_0_edit_123456"
}'
import requests
url = "https://aireiter.com/api/openapi/submit"
payload = {
"model": "happyhorse_1_0",
"params": {
"type": "text_to_video",
"prompt": "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
"resolution": "720p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 0
},
"out_task_id": "happyhorse_1_0_t2v_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_0",
params: {
type: "text_to_video",
prompt: "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
resolution: "720p",
aspect_ratio: "16:9",
video_length: 5,
seed: 0
},
out_task_id: "happyhorse_1_0_t2v_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_0",
"params": map[string]interface{}{
"type": "text_to_video",
"prompt": "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
"resolution": "720p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 0,
},
"out_task_id": "happyhorse_1_0_t2v_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_0",
"params": {
"type": "text_to_video",
"prompt": "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
"resolution": "720p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 0
},
"out_task_id": "happyhorse_1_0_t2v_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_0",
"params" => [
"type" => "text_to_video",
"prompt" => "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
"resolution" => "720p",
"aspect_ratio" => "16:9",
"video_length" => 5,
"seed" => 0
],
"out_task_id" => "happyhorse_1_0_t2v_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_0",
params: {
type: "text_to_video",
prompt: "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
resolution: "720p",
aspect_ratio: "16:9",
video_length: 5,
seed: 0
},
out_task_id: "happyhorse_1_0_t2v_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_0",
"params": [
"type": "text_to_video",
"prompt": "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
"resolution": "720p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 0
],
"out_task_id": "happyhorse_1_0_t2v_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_0"",
""params"": {
""type"": ""text_to_video"",
""prompt"": ""A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight"",
""resolution"": ""720p"",
""aspect_ratio"": ""16:9"",
""video_length"": 5,
""seed"": 0
},
""out_task_id"": ""happyhorse_1_0_t2v_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_0\",\"params\":{\"type\":\"text_to_video\",\"prompt\":\"A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight\",\"resolution\":\"720p\",\"aspect_ratio\":\"16:9\",\"video_length\":5,\"seed\":0},\"out_task_id\":\"happyhorse_1_0_t2v_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_0",
@"params": @{
@"type": @"text_to_video",
@"prompt": @"A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
@"resolution": @"720p",
@"aspect_ratio": @"16:9",
@"video_length": @5,
@"seed": @0
},
@"out_task_id": @"happyhorse_1_0_t2v_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_0",
"params": {
"type": "text_to_video",
"prompt": "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
"resolution": "720p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 0
},
"out_task_id": "happyhorse_1_0_t2v_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_0",
"params": {
"type": "text_to_video",
"prompt": "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
"resolution": "720p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 0
},
"out_task_id": "happyhorse_1_0_t2v_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_0",
params = list(
type = "text_to_video",
prompt = "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
resolution = "720p",
aspect_ratio = "16:9",
video_length = 5,
seed = 0
),
out_task_id = "happyhorse_1_0_t2v_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_0_t2v_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 of HappyHorse 1.0 in AIReiter is
happyhorse_1_0.Authorizations
string
required
All endpoints require Bearer Token authentication.Visit the API Key management page to get your API Key, and add the following to the request header:
Authorization: Bearer YOUR_API_KEY
Body
string
required
Model name, fixed to
happyhorse_1_0.object
required
Model parameters object.
Show Properties of the params Object
Show Properties of the params Object
string
default:"text_to_video"
required
Video workflow:
text_to_video- Generate a video based on textimage_to_video- Generate a video using a first-frame imagereference_to_video- Generate a video using 1-9 reference imagesvideo_edit- Edit a source video based on instructions
string
Video content description or editing instructions. Required for
text_to_video, reference_to_video, and video_edit, optional for image_to_video.Supports up to 2500 Chinese characters or 5000 non-Chinese characters; any excess will be truncated.In reference_to_video mode, use the names character1, character2, and so on to refer to reference images in image order.string | string[]
Image URL, must be directly accessible from the public internet.
image_to_video- Required, use the first image as the first framereference_to_video- Required, supports 1-9 ordered reference imagesvideo_edit- Optional, up to 5 style or subject reference images
string | string[]
Required for
video_edit mode, only one source video is used.Supports MP4 and MOV, and H.264 encoding is recommended. Source video requirements:- Duration: 3-60 seconds; if it exceeds 15 seconds, only the first 15 seconds will be processed
- File size must not exceed 100MB
- The longer side must not exceed 2160px, and the shorter side must be at least 320px
- Aspect ratio must be between 1:2.5 and 2.5:1
- Frame rate must be greater than 8 FPS
string
default:"720p"
Output resolution:
720p or 1080p.string
default:"16:9"
Output aspect ratio for
text_to_video and reference_to_video modes.Supported: 16:9, 9:16, 1:1, 4:3, 3:4, 4:5, 5:4, 9:21, 21:9.video_edit does not support this parameter. Do not pass it. The output aspect ratio of image_to_video follows the input image.integer
default:"5"
Output video duration, in seconds. Supports integers between 3 and 15.
video_edit does not support this parameter. Do not pass it. The output duration is automatically determined by the source video, equal to min(input video duration, 15 seconds).integer
default:"0"
Random seed, in the range 0-2147483647. When
0 is passed or omitted, a random seed is used.boolean
default:"false"
Valid only for
video_edit mode. When set to true, the source video audio track is forcibly preserved; when set to false or omitted, the model decides automatically.string
required
A unique task ID generated by the caller, used later to query task status and results.Only letters, numbers, underscores, and hyphens are supported, with a length of 1-64 characters.
Response
string
Caller task ID, can be used to query results.
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_0_task_123456"
}'
Request Examples
curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "happyhorse_1_0",
"params": {
"type": "text_to_video",
"prompt": "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
"resolution": "720p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 0
},
"out_task_id": "happyhorse_1_0_t2v_123456"
}'
curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "happyhorse_1_0",
"params": {
"type": "image_to_video",
"prompt": "Make the cat in the image run naturally across the grass, with the camera smoothly following",
"image_url": ["https://example.com/cat.png"],
"resolution": "720p",
"video_length": 5
},
"out_task_id": "happyhorse_1_0_i2v_123456"
}'
curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "happyhorse_1_0",
"params": {
"type": "reference_to_video",
"prompt": "character1 walks into character2's scene and picks up the prop in character3, maintaining a smooth 3D cartoon style",
"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": 8
},
"out_task_id": "happyhorse_1_0_r2v_123456"
}'
curl --request POST \
--url https://aireiter.com/api/openapi/submit \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "happyhorse_1_0",
"params": {
"type": "video_edit",
"prompt": "Change the red paper airplane in the video to blue, while preserving the original background and camera motion",
"video_url": ["https://example.com/source.mp4"],
"image_url": ["https://example.com/blue-paper-plane.jpg"],
"resolution": "720p",
"keep_original_sound": true,
"seed": 42
},
"out_task_id": "happyhorse_1_0_edit_123456"
}'
import requests
url = "https://aireiter.com/api/openapi/submit"
payload = {
"model": "happyhorse_1_0",
"params": {
"type": "text_to_video",
"prompt": "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
"resolution": "720p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 0
},
"out_task_id": "happyhorse_1_0_t2v_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_0",
params: {
type: "text_to_video",
prompt: "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
resolution: "720p",
aspect_ratio: "16:9",
video_length: 5,
seed: 0
},
out_task_id: "happyhorse_1_0_t2v_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_0",
"params": map[string]interface{}{
"type": "text_to_video",
"prompt": "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
"resolution": "720p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 0,
},
"out_task_id": "happyhorse_1_0_t2v_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_0",
"params": {
"type": "text_to_video",
"prompt": "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
"resolution": "720p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 0
},
"out_task_id": "happyhorse_1_0_t2v_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_0",
"params" => [
"type" => "text_to_video",
"prompt" => "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
"resolution" => "720p",
"aspect_ratio" => "16:9",
"video_length" => 5,
"seed" => 0
],
"out_task_id" => "happyhorse_1_0_t2v_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_0",
params: {
type: "text_to_video",
prompt: "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
resolution: "720p",
aspect_ratio: "16:9",
video_length: 5,
seed: 0
},
out_task_id: "happyhorse_1_0_t2v_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_0",
"params": [
"type": "text_to_video",
"prompt": "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
"resolution": "720p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 0
],
"out_task_id": "happyhorse_1_0_t2v_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_0"",
""params"": {
""type"": ""text_to_video"",
""prompt"": ""A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight"",
""resolution"": ""720p"",
""aspect_ratio"": ""16:9"",
""video_length"": 5,
""seed"": 0
},
""out_task_id"": ""happyhorse_1_0_t2v_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_0\",\"params\":{\"type\":\"text_to_video\",\"prompt\":\"A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight\",\"resolution\":\"720p\",\"aspect_ratio\":\"16:9\",\"video_length\":5,\"seed\":0},\"out_task_id\":\"happyhorse_1_0_t2v_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_0",
@"params": @{
@"type": @"text_to_video",
@"prompt": @"A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
@"resolution": @"720p",
@"aspect_ratio": @"16:9",
@"video_length": @5,
@"seed": @0
},
@"out_task_id": @"happyhorse_1_0_t2v_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_0",
"params": {
"type": "text_to_video",
"prompt": "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
"resolution": "720p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 0
},
"out_task_id": "happyhorse_1_0_t2v_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_0",
"params": {
"type": "text_to_video",
"prompt": "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
"resolution": "720p",
"aspect_ratio": "16:9",
"video_length": 5,
"seed": 0
},
"out_task_id": "happyhorse_1_0_t2v_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_0",
params = list(
type = "text_to_video",
prompt = "A red paper airplane slowly flies past a bright white photo studio, fixed camera, soft daylight",
resolution = "720p",
aspect_ratio = "16:9",
video_length = 5,
seed = 0
),
out_task_id = "happyhorse_1_0_t2v_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_0_t2v_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"
}
}
Workflow Parameter Comparison
type | Required Assets | Duration and Aspect Ratio |
|---|---|---|
text_to_video | prompt | video_length 3-15 seconds, optional aspect_ratio |
image_to_video | image_url | video_length 3-15 seconds, aspect ratio follows the image |
reference_to_video | prompt, image_url | video_length 3-15 seconds, optional aspect_ratio |
video_edit | prompt, video_url | Duration and aspect ratio follow the source video, output up to 15 seconds |