Three modes, one model
No images runs text-to-video, one image runs image-to-video, and two to nine images run reference-to-video.
The upgrade to Happy Horse: text-to-video, image-to-video, and reference-to-video from up to 9 images, with stronger motion and character consistency. One API, async jobs, and webhooks.
Integrate Happy Horse 1.1 with a single API call — one key, one unified endpoint, and shared billing across every model on Apiframe.
model: "happyhorse-1.1" No images runs text-to-video, one image runs image-to-video, and two to nine images run reference-to-video.
Keep characters, products, and scenes consistent — refer to them in the prompt as [Image 1], [Image 2], and so on.
Improved motion expressiveness and temporal consistency, with audio synchronized to the action.
Example prompts you can run through the Happy Horse 1.1 API on Apiframe.
A herd of horses thundering across desert dunes, dust trailing behind, golden hour
[Image 1] walks through the gate of [Image 2] at dusk, cinematic tracking shot
A product hero shot of [Image 1] rotating slowly on a reflective surface, studio lighting
Send a single POST /v2/videos/generate request with your API key to
generate with Happy Horse 1.1. The call returns a jobId you can poll or
receive via webhook.
curl -X POST https://api.apiframe.ai/v2/videos/generate \
-H "X-API-Key: afk_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"prompt": "a cinematic sunrise over a futuristic cityscape, smooth camera push-in",
"model": "happyhorse-1.1",
"happyhorse11Params": {
"images": [
"https://example.com/input.jpg"
],
"resolution": "1080p",
"aspect_ratio": "16:9",
"seed": 1
}
}'import requests
response = requests.post(
"https://api.apiframe.ai/v2/videos/generate",
headers={
"X-API-Key": "afk_your_api_key_here",
"Content-Type": "application/json",
},
json={
"prompt": "a cinematic sunrise over a futuristic cityscape, smooth camera push-in",
"model": "happyhorse-1.1",
"happyhorse11Params": {
"images": [
"https://example.com/input.jpg"
],
"resolution": "1080p",
"aspect_ratio": "16:9",
"seed": 1
}
},
)
print(response.json()) # { "jobId": "...", "status": "QUEUED" }const response = await fetch("https://api.apiframe.ai/v2/videos/generate", {
method: "POST",
headers: {
"X-API-Key": "afk_your_api_key_here",
"Content-Type": "application/json",
},
body: JSON.stringify({
"prompt": "a cinematic sunrise over a futuristic cityscape, smooth camera push-in",
"model": "happyhorse-1.1",
"happyhorse11Params": {
"images": [
"https://example.com/input.jpg"
],
"resolution": "1080p",
"aspect_ratio": "16:9",
"seed": 1
}
}),
});
const { jobId } = await response.json();
console.log(jobId);Generation is asynchronous. A successful submission returns 202 Accepted with a jobId. Poll GET /v2/jobs/{id} (or supply a webhook_url) until the status is COMPLETED; the result field then holds the output URL(s).
{
"jobId": "b2c3d4e5-f6a7-8901-bcde-f23456789012",
"status": "QUEUED"
}curl https://api.apiframe.ai/v2/jobs/JOB_ID \
-H "X-API-Key: afk_your_api_key_here"import requests, time
while True:
job = requests.get(
"https://api.apiframe.ai/v2/jobs/JOB_ID",
headers={"X-API-Key": "afk_your_api_key_here"},
).json()
if job["status"] in ("COMPLETED", "FAILED"):
break
time.sleep(2)
print(job["result"])let job;
do {
await new Promise((r) => setTimeout(r, 2000));
job = await fetch("https://api.apiframe.ai/v2/jobs/JOB_ID", {
headers: { "X-API-Key": "afk_your_api_key_here" },
}).then((r) => r.json());
} while (job.status !== "COMPLETED" && job.status !== "FAILED");
console.log(job.result);Request parameters accepted by the Happy Horse 1.1 endpoint. Model-specific options are nested under the params object shown below.
| Parameter | Type | Required | Default | Allowed / range | Description |
|---|---|---|---|---|---|
| prompt | string | required | — | — | Text description of what to generate. |
| model | string | required | "happyhorse-1.1" | "happyhorse-1.1" | The model identifier for this endpoint. |
| happyhorse11Params.images | string[] (URLs) | optional | — | — | None = text-to-video, one = image-to-video, two to nine = reference-to-video. |
| happyhorse11Params.resolution | string | optional | "1080p" | "720p", "1080p" | Resolution |
| happyhorse11Params.aspect_ratio | string | optional | "16:9" | "16:9", "9:16", "1:1", "4:3", "3:4" | Used for text-to-video (and reference-to-video on 1.1); ignored when animating an image. |
| happyhorse11Params.seed | number | optional | — | step 1 | Reuse a number to reproduce the same result. |
Common questions about the Happy Horse 1.1 API.
It depends on the number of images you pass in happyhorse11Params.images: none = text-to-video, one = image-to-video, two to nine = reference-to-video.
Pass up to nine images and mention them in the prompt as [Image 1], [Image 2], etc. Happy Horse 1.1 keeps those subjects and scenes consistent in the output.
Pricing is per second of output: 24 credits/second at 720p and 31 credits/second at 1080p. A 10-second 1080p clip is 310 credits.
Still have questions?
Get your API key and integrate Happy Horse 1.1 in minutes — Pay-as-you-go.
Questions? Join our Discord or contact sales.