Alibaba Happyhorse 1.1 Image To Video API Documentation
Playground
Try it on WaveSpeedAI!Alibaba HappyHorse 1.1 Image to Video animates a reference image into a cinematic 720P or 1080P video, with optional text prompt guidance, smooth camera movement, and expressive, stable motion. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Features
Alibaba Happy Horse 1.1 Image-to-Video animates a reference image into a cinematic video with optional text guidance for motion, camera movement, and scene direction. It supports 480p, 720p and 1080p output, while preserving the reference image’s subject, composition, and visual style.
Why Choose This?
-
Image-faithful generation
Preserves the reference image’s subject, composition, and style while adding motion. -
Optional prompt guidance
Describe the camera movement, mood, action, and scene development in plain language. -
Cinematic motion
Generate smooth, expressive motion with stable subject preservation. -
Flexible resolution options
Choose480pfor the lowest cost,720pfor standard generation or1080pfor higher-resolution output. -
Production-ready API
Use REST inference for image-to-video generation workflows.
Parameters
| Parameter | Required | Description |
|---|---|---|
| image | Yes | First-frame image URL. Supported formats: JPEG, PNG, BMP, WEBP. Minimum dimension: 300 px. Aspect ratio: 1:2.5 to 2.5:1. Maximum file size: 10 MB. |
| prompt | No | Optional text prompt guiding the animation. Maximum length: 2500 characters. |
| resolution | No | Output resolution: 480p, 720p or 1080p. Default: 720p. |
| duration | No | Video length in seconds. Supported range: 3 to 15. Default: 5. |
| seed | No | Random seed for reproducibility. Supported range: 0 to 2147483647. |
How to Use
- Upload image — Provide a first-frame image URL.
- Add prompt guidance (optional) — Describe the desired motion, camera behavior, mood, or action.
- Select resolution — Choose
480p,720por1080p. - Set duration — Choose a duration from
3to15seconds. - Set seed (optional) — Use a fixed seed for reproducible results.
- Generate — Create the image-to-video output.
Pricing
| Resolution | Per second | 5s | 10s | 15s |
|---|---|---|---|---|
| 480p | $0.07 | $0.35 | $0.70 | $1.05 |
| 720p | $0.14 | $0.70 | $1.40 | $2.10 |
| 1080p | $0.18 | $0.90 | $1.80 | $2.70 |
- Total price: per-second rate ×
duration
Best Use Cases
- Image-to-video animation — Animate a reference image into a short video.
- Cinematic motion generation — Add smooth camera movement and scene motion to a still image.
- Character and subject animation — Preserve the main subject while generating natural motion.
- Creative video previews — Create short visual clips from concept images or storyboards.
- Social media content — Generate short-form video assets from still images.
Pro Tips
- Use a clear first-frame image with the main subject visible.
- Keep the prompt focused on motion, camera behavior, and scene development.
- Use
480pfor the lowest cost and720pfor standard generation. - Use
1080pwhen higher-resolution output is needed. - Use a fixed
seedwhen you want more reproducible results. - Make sure the input image matches the desired output composition.
Related Models
- Alibaba Happy Horse 1.1 Text-to-Video — Generate video directly from text.
Authentication
For authentication details, please refer to the Authentication Guide.
API Endpoints
Submit Task & Query Result
set -euo pipefail
export WAVESPEED_API_KEY="your-api-key"
REQUEST_BODY=$(cat <<'JSON'
{
"prompt": "A cinematic ocean wave at sunrise, highly detailed",
"image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
"resolution": "720p",
"duration": 5
}
JSON
)
# 1. Submit the prediction once. Never retry this request automatically:
# a retry after an unclear failure can create a second, billed task.
CHECK='The task may already exist. Check History or the predictions list before submitting again.'
if ! SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
--connect-timeout 10 --max-time 60 \
-X POST "https://api.wavespeed.ai/api/v3/alibaba/happyhorse-1.1/image-to-video" \
-H "Authorization: Bearer ${WAVESPEED_API_KEY}" \
-H "Content-Type: application/json" \
-d "${REQUEST_BODY}"); then
printf 'Submit failed. %s\n' "${CHECK}" >&2
exit 1
fi
TASK=$(printf '%s' "${SUBMIT_RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "${TASK}" | jq -r '.id // empty')
if [ -z "${PREDICTION_ID}" ]; then
printf 'Submission response did not contain a prediction id. %s\n' "${CHECK}" >&2
exit 1
fi
RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"
# 2. Poll until the prediction reaches a final status.
BODY_FILE=$(mktemp)
trap 'rm -f "${BODY_FILE}"' EXIT
while true; do
# Transient errors (429, 5xx) are retried, honoring Retry-After.
HTTP_CODE=$(curl --silent --show-error --fail-with-body \
--connect-timeout 10 --max-time 60 --retry 5 --retry-delay 2 \
--output "${BODY_FILE}" --write-out '%{http_code}' \
"${RESULT_URL}" \
-H "Authorization: Bearer ${WAVESPEED_API_KEY}" || true)
case "${HTTP_CODE}" in
2??) ;;
000|429|5??) # dropped connection or temporary error: keep polling
printf 'Task %s: HTTP %s, polling again in 10s\n' "${PREDICTION_ID}" "${HTTP_CODE}" >&2
sleep 10; continue ;;
*) printf 'Task %s: HTTP %s\n' "${PREDICTION_ID}" "${HTTP_CODE}" >&2
cat "${BODY_FILE}" >&2; exit 1 ;;
esac
RESULT=$(jq 'if type == "object" and has("data") then .data else . end' "${BODY_FILE}")
STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')
case "${STATUS}" in
completed) printf '%s\n' "${RESULT}" | jq '.outputs'; break ;;
failed|cancelled|timeout|deleted)
printf 'Task %s ended with status %s\n' "${PREDICTION_ID}" "${STATUS}" >&2
printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
*) sleep 2 ;;
esac
doneRetry temporary errors only while polling, never the submit request. Errors, retries and timeouts
Parameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| prompt | string | Yes | - | Optional text prompt guiding the animation. Max 2500 characters. | |
| image | string | Yes | - | URL of the first-frame image. JPEG / PNG / BMP / WEBP. Min dimension 300px. Aspect ratio between 1:2.5 and 2.5:1. Max 10 MB. | |
| resolution | string | No | 720p | 480p, 720p, 1080p | Output video resolution. |
| duration | integer | No | 5 | 3 ~ 15 | Video length in seconds (3-15). |
| seed | integer | No | - | - | Random seed for reproducibility. |
Every model also accepts the global request options enable_sync_mode and enable_base64_output; see their pages for details.
Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data.id | string | Unique identifier for the prediction, Task Id |
| data.model | string | Model ID used for the prediction |
| data.outputs | array | Output values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed) |
| data.urls | object | Object containing related API endpoints |
| data.status | string | Task status. completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses. |
| data.created_at | string | ISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”) |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |
Result Request Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | Yes | - | Task ID |
Result Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data | object | The prediction data object containing all details |
| data.id | string | Unique identifier for the prediction |
| data.model | string | Model ID used for the prediction |
| data.outputs | array<string | object> | Array of generated outputs (empty when status is not completed). Items are usually URL strings, but may be text strings or structured result objects, depending on the model. |
| data.urls | object | Object containing related API endpoints |
| data.status | string | Status: completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses |
| data.created_at | string | ISO timestamp of when the request was created |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |