Customize your input with more control.
Customize your input with more control.
Customize your input with more control.
For every second of 720p video you generated, you will be charged $0.14/second. For 1080p video you will be charged $0.28/second.
For every second of 720p video you generated, you will be charged $0.14/second. For 1080p video you will be charged $0.28/second.
Generate 1080p video with synchronized native audio directly from a text prompt. No image input required.
Model ID:
Provider: fal.ai
Commercial rights: Full commercial rights on all outputs
Happy Horse 1.0 is built by the Future Life Lab inside Alibaba's Taotian Group. It uses a unified 15-billion-parameter Transformer that processes text, video, and audio tokens in a single sequence, generating video frames and their corresponding audio track (dialogue, ambient sound, Foley) in one forward pass rather than producing silent video and adding audio afterward.
As of April 2026, it ranks #1 on the Artificial Analysis Video Arena for text-to-video — 107 Elo points ahead of second-place Seedance 2.0, meaning users preferred its output roughly 65% of the time in blind head-to-head comparisons.
Key strengths for text-to-video:
| Property | Value |
|---|---|
| Resolution | 720p, 1080p |
| Duration | 3–15 seconds |
| Aspect ratios | 16:9, 9:16, 1:1, 4:3, 3:4 |
| Prompt length | Up to 2,500 characters |
| Resolution | Price |
|---|---|
| 720p | $0.14 / second |
| 1080p | $0.28 / second |
A 10-second clip at 1080p costs $2.80.
The model responds well to specific, descriptive prompts. Include:
Example prompt:
JavaScript:
Python:
JavaScript:
Python:
| Parameter | Type | Default | Description |
|---|---|---|---|
| string | required | Text description of the video. Max 2,500 characters. | |
| | | | | | Output video aspect ratio. | ||
| | | Output video resolution. | ||
| integer (3–15) | Clip length in seconds. | ||
| integer (0–2,147,483,647) | — | Set for reproducible outputs. | |
| boolean | Content moderation on input and output. |
For clips longer than a few seconds, use the queue API to avoid blocking.
JavaScript:
Python:
Security: Never expose your in browser or mobile code. Route requests through a server-side proxy: set as a server environment variable and have your frontend call your own backend endpoint, which forwards the request to fal.
| Model | Use case |
|---|---|
| Animate a still image as the first frame | |
| Generate video with subject consistency from 1–9 reference images |
alibaba/happy-horse/text-to-video"A little girl walking on a rain-soaked road at sunset, puddles reflecting warm orange light, slow dolly forward, cinematic."bashnpm install @fal-ai/clientbashpip install fal-clientbashexport FAL_KEY="YOUR_API_KEY"jsimport { fal } from "@fal-ai/client";
const result = await fal.subscribe("alibaba/happy-horse/text-to-video", {
input: {
prompt: "A little girl walking on a rain-soaked road at sunset, cinematic lighting, slow dolly forward.",
aspect_ratio: "16:9",
resolution: "1080p",
duration: 5,
},
logs: true,
onQueueUpdate: (update) => {
if (update.status === "IN_PROGRESS") {
update.logs.map((log) => log.message).forEach(console.log);
}
},
});
console.log(result.data.video.url);pythonimport fal_client
def on_queue_update(update):
if isinstance(update, fal_client.InProgress):
for log in update.logs:
print(log["message"])
result = fal_client.subscribe(
"alibaba/happy-horse/text-to-video",
arguments={
"prompt": "A little girl walking on a rain-soaked road at sunset, cinematic lighting, slow dolly forward.",
"aspect_ratio": "16:9",
"resolution": "1080p",
"duration": 5,
},
with_logs=True,
on_queue_update=on_queue_update,
)
print(result["video"]["url"])promptaspect_ratio"16:9""9:16""1:1""4:3""3:4""16:9"resolution"720p""1080p""1080p"duration5seedenable_safety_checkertruejson{
"video": {
"url": "https://...",
"content_type": "video/mp4",
"file_name": "output.mp4",
"file_size": 4404019,
"width": 1920,
"height": 1080,
"fps": 24,
"duration": 5.0,
"num_frames": 120
},
"seed": 1234567
}jsimport { fal } from "@fal-ai/client";
// Submit
const { request_id } = await fal.queue.submit("alibaba/happy-horse/text-to-video", {
input: {
prompt: "A time-lapse of storm clouds rolling over a mountain range, dramatic lighting.",
aspect_ratio: "16:9",
duration: 15,
resolution: "1080p",
},
webhookUrl: "https://your-server.com/webhook",
});
// Poll status
const status = await fal.queue.status("alibaba/happy-horse/text-to-video", {
requestId: request_id,
logs: true,
});
// Fetch result once complete
const result = await fal.queue.result("alibaba/happy-horse/text-to-video", {
requestId: request_id,
});
console.log(result.data.video.url);pythonimport fal_client
# Submit
handler = fal_client.submit(
"alibaba/happy-horse/text-to-video",
arguments={
"prompt": "A time-lapse of storm clouds rolling over a mountain range, dramatic lighting.",
"aspect_ratio": "16:9",
"duration": 15,
"resolution": "1080p",
},
webhook_url="https://your-server.com/webhook",
)
request_id = handler.request_id
# Poll status
status = fal_client.status("alibaba/happy-horse/text-to-video", request_id, with_logs=True)
# Fetch result once complete
result = fal_client.result("alibaba/happy-horse/text-to-video", request_id)
print(result["video"]["url"])FAL_KEYFAL_KEYalibaba/happy-horse/image-to-videoalibaba/happy-horse/reference-to-video