Introduction
HappyHorse 1.1 Image to video animates an opening frame supplied in image_url. The prompt is required and describes the movement that follows; the clip runs 3 to 15 whole seconds at 720p or 1080p, with a generated soundtrack. There is no aspect-ratio field and no closing-frame field: the still sets the shape, and the ending is whatever the prompted movement resolves to.
Choose a HappyHorse 1.1 mode by starting material
| What you have at the start | Mode |
|---|---|
| a written scene or script | HappyHorse 1.1 Text to video |
| an approved opening image | HappyHorse 1.1 Image to video |
| one to nine reference images | HappyHorse 1.1 Reference to video |
Key features & highlights
The still sets subject and shape
The opening frame is followed closely, which makes this the reliable path to a literal result, uncensored source frames included. In the tailgate-turn example the wardrobe, the truck and the backlight all come from the frame, and the prompt only asks her to lower the bottle, swing her boots once and turn her head into the low sun.
No closing frame to aim at
This endpoint takes image_url alone, so a shot cannot be pinned to a final composition. Movements that resolve on their own work best. The quiet-hold example is four seconds of near-stillness: a breath out, a dropped shoulder and a shift of weight against the window frame, with almost no camera movement.
Input and output limits
The opening frame needs at least 300 px on each side, an aspect ratio between 1:2.5 and 2.5:1 and a file size of up to 20 MB. Output runs 3 to 15 seconds with 5 as the default, at 720p (the default) or 1080p, and the soundtrack is always generated with the picture.
Request parameters
| Parameter | Required | Description |
|---|---|---|
prompt | Yes | Required. Describe what changes after the frame - action, camera, pacing - not the frame itself. at least 1 characters · at most 2500 characters |
image_url | Yes | The opening frame. It fixes subject and composition and sets the output shape. |
resolution | No | 720p or 1080p. |
duration_seconds | No | Whole seconds, 3 to 15. There is no closing frame, so keep the move resolvable in that time. |
seed | No | Integer from 0 to 2147483647 for the random start; leave it out and every run draws its own. |
Pricing
| Specification | Price |
|---|---|
| $0.14 / second |
| $0.18 / second |
Use cases
Animate an uncensored or art-directed frame
This path follows the frame it is given, so uncensored work starts here rather than on text-to-video, which rejects prompts past its content line. Supply the frame you designed and write only the motion; the subject arrives as drawn or photographed instead of being reinterpreted from a sentence.
Environmental motion around a held pose
The wasteland-hood-two example keeps two figures on the hood of a stalled car and writes only what exists in motion: torn cloth lifted and dropped by the wind, a rippling heat haze, dust devils crossing the road and a slow push in. It ran at 1080p with the default duration.
Short inserts and cutaways
A clip of three or four seconds with minimal camera movement suits inserts between longer shots. Keep the action to one breath or one gesture, as quiet-hold does, so the movement completes inside the duration instead of being cut off mid-way.
Prompt guide & pro tips
Give the prompt only motion
The prompt is required, so use it for what changes: action, camera and pacing. The wasteland-hood-two prompt never describes the composition; it describes wind, haze and dust. Re-describing the frame spends the 2,500-character limit on what the image already fixes.
Size the movement to the duration
With no closing frame, a movement that cannot finish in the chosen time simply stops where the clip ends. Match the action to the length: one gesture for a short clip, or a short sequence such as lower, swing, turn for a longer one, as tailgate-turn does over six seconds.
Crop before you upload
The still decides the output shape, so crop it to the delivery aspect ratio first and check it against the size limits. Draft at 720p and re-run at 1080p for delivery. Each pass draws its own take, so keep the wording fixed while you compare.
API quick start
# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
-H "Authorization: Bearer $SPICY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
-d '{
"model": "alibaba/happyhorse-1.1/image-to-video",
"input": {
"duration_seconds": 5,
"image_url": "https://example.com/reference.png",
"prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
"resolution": "720p"
}
}'
# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
-H "Authorization: Bearer $SPICY_API_KEY"
See the API reference for authentication, the complete schema, polling, and error handling.







