HappyHorse 1.1 is built for scenes with several people or products, because you can point at each reference by name: [Image 1] passes the cup to [Image 2]. Alibaba released this update in June 2026. Clear labels mean fewer mix-ups about who wears what and who does what.
Like 1.0, the price depends only on resolution and length.
What you can make
- Scenes with two or three distinct characters taken from photos
- Wide 21:9 cinematic shots and tall 9:21 formats
- Product placement from a product photo plus a scene photo
- 4:5 videos for social feeds
Settings that matter
image_urls: 1 to 9 references, called [Image 1], [Image 2] and so on in the prompt.image_url: a single first frame for image-to-video. Use this or references, not both.aspect_ratio: nine options from 21:9 to 9:21, in text and reference modes.resolution:720pby default; switch to1080pfor the final.duration: 3 to 15 seconds.- Prompt length: up to 5,000 characters in Latin scripts, 2,500 in Chinese, Japanese or Korean.
Starter prompt
[Image 1] and [Image 2] sit at a diner booth. [Image 1]
slides the red box from [Image 3] across the table,
[Image 2] opens it and laughs. Static wide shot, 21:9Swap in your own references and actions, and keep each character tied to one image number.
Questions
What does a HappyHorse 1.1 clip cost?
from $0.399 per second. Only resolution and duration change it, and a failed clip costs $0.
Can it restyle my own footage?
No. Video restyling is in HappyHorse 1.0.
Why does my character swap places with another?
Refer to each person by image number in every sentence where they act, not just once at the start.
HappyHorse 1.1 in your code
curl https://kadraris.com/v1/generate?wait=60 \
-H "Authorization: Bearer $KADRARIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "happyhorse-1.1",
"input": {
"prompt": "Tracking shot of a cyclist riding through an empty city street at dawn, long shadows, light fog, film look",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": 5
}
}'import os, time, requests
API = "https://kadraris.com/v1"
H = {"Authorization": f"Bearer {os.environ['KADRARIS_API_KEY']}"}
task = requests.post(f"{API}/generate", headers=H, json={
"model": "happyhorse-1.1",
"input": {
"prompt": "Tracking shot of a cyclist riding through an empty city street at dawn, long shadows, light fog, film look",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": 5
}
}).json()
while task["status"] in ("queued", "running"):
time.sleep(3)
task = requests.get(f"{API}/tasks/{task['id']}", headers=H).json()
print(task["status"], task["cost"], [o["url"] for o in task["output"]])const API = "https://kadraris.com/v1";
const headers = { Authorization: `Bearer ${process.env.KADRARIS_API_KEY}`, "Content-Type": "application/json" };
let task = await (await fetch(`${API}/generate`, {
method: "POST",
headers,
body: JSON.stringify({
"model": "happyhorse-1.1",
"input": {
"prompt": "Tracking shot of a cyclist riding through an empty city street at dawn, long shadows, light fog, film look",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": 5
}
}),
})).json();
while (task.status === "queued" || task.status === "running") {
await new Promise((r) => setTimeout(r, 3000));
task = await (await fetch(`${API}/tasks/${task.id}`, { headers })).json();
}
console.log(task.status, task.cost, task.output.map((o) => o.url));
Input fields
| Parameter | Type | Allowed | Default |
|---|---|---|---|
prompt | string | ≤ 5000 chars | |
aspect_ratio | string | 16:9 9:16 3:4 4:3 4:5 5:4 1:1 9:21 21:9 | 16:9 |
resolution | string | 720p 1080p | 720p |
duration | integer | 3-15 | 5 |
image_url | string | ||
image_urls | array | max 9 |
Fetch this list as JSON with GET /v1/models/happyhorse-1.1.























