The observatory dome slowly rotates open as the first sunlight sweeps across the plateau, haze drifting through the valley, camera gently pushing in, no text, no logos, no watermark, no promotional marks
Happy Horse 1.0 Image to Video API
alibaba/happyhorse-1.0/image-to-videoHappy Horse 1.0 Image to Video transforms still images into cinematic dynamic videos, supporting 3–15 second duration, 720p or 1080p resolution, and optional prompt guidance. It faithfully preserves initial subject likeness, material texture, and framing perspective while infusing scenes with natural physical motion and smooth camera trajectories.
Drag and drop files, paste from clipboard, or provide a URL.
Your generated video will appear here
Add your prompt and required media, review the settings, then click Run.
Examples
REST API
Quick Start
Authenticate via API Key, submit a first-frame image with optional motion prompt, and retrieve video via task ID.
Connect to Vidgo API
Create an API Key, store it securely on your server, and set Authorization: Bearer VIDGO_API_KEY.
- Endpoint
- POST
https://api.vidgo.ai/api/generate/submit - Authentication
- Authorization: Bearer VIDGO_API_KEY
Submit an Image to Video Task
Configure inputs with 1 image URL in image_urls, and set model to alibaba/happyhorse-1.0/image-to-video.
REQUEST_BODY=$(cat <<'JSON'
{
"model": "alibaba/happyhorse-1.0/image-to-video",
"input": {
"prompt": "The observatory dome slowly rotates open as the first sunlight sweeps across the plateau, haze drifting through the valley, camera gently pushing in, no text, no logos, no watermark, no promotional marks",
"duration": 5,
"resolution": "1080p",
"image_urls": [
"https://cdn.vidgo.ai/apis/models/alibaba/happyhorse-1.0/image-to-video/v1/01/input-01.png"
]
}
}
JSON
)
RESPONSE=$(curl --silent --show-error --fail-with-body \
--request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data "$REQUEST_BODY")
CODE=$(printf '%s' "$RESPONSE" | jq -r '.code // empty')
if [ "$CODE" != "0" ] && [ "$CODE" != "200" ]; then
printf 'API error: %s
' "$RESPONSE" >&2
exit 1
fi
printf '%s
' "$RESPONSE"Await Results
Poll with task_id while status is not_started or running. Stop at finished or failed; read data.files[].file_url on success or data.error_message on failure.
Track Status
GET https://api.vidgo.ai/api/generate/status/{task_id}Poll every 2 seconds, backing off for extended jobs. Continue only while not_started or running. Alternatively provide callback_url.
not_startedrunningfinishedfailed{
"code": 200,
"data": {
"task_id": "task-unified-...",
"status": "running",
"created_time": "2026-09-17T10:00:00Z"
}
}{
"code": 200,
"data": {
"task_id": "task-unified-...",
"status": "finished",
"files": [
{
"file_url": "https://storage.vidgo.ai/generated/video.mp4",
"file_type": "video"
}
],
"created_time": "2026-08-22T10:00:00Z",
"progress": 100,
"error_message": null
}
}Complete Runnable Example
Expand to inspect complete code including status checks, task_id validation, polling, and timeout boundaries.
set -euo pipefail
: "${VIDGO_API_KEY:?Set VIDGO_API_KEY in your environment}"
REQUEST_BODY=$(cat <<'JSON'
{
"model": "alibaba/happyhorse-1.0/image-to-video",
"input": {
"prompt": "The observatory dome slowly rotates open as the first sunlight sweeps across the plateau, haze drifting through the valley, camera gently pushing in, no text, no logos, no watermark, no promotional marks",
"duration": 5,
"resolution": "1080p",
"image_urls": [
"https://cdn.vidgo.ai/apis/models/alibaba/happyhorse-1.0/image-to-video/v1/01/input-01.png"
]
}
}
JSON
)
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
--request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data "$REQUEST_BODY")
TASK_ID=$(printf '%s' "$SUBMIT_RESPONSE" | jq -r '.data.task_id // .task_id // empty')
BUSINESS_CODE=$(printf '%s' "$SUBMIT_RESPONSE" | jq -r '.code // empty')
if [ "$BUSINESS_CODE" != "0" ] && [ "$BUSINESS_CODE" != "200" ]; then
printf 'Submit failed:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
if [ -z "$TASK_ID" ]; then
printf 'Submit response did not include task_id:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
START_TIME=$(date +%s)
POLL_DELAY=2
while true; do
if [ $(( $(date +%s) - START_TIME )) -ge 600 ]; then
printf 'Timed out after 600 seconds
' >&2
exit 1
fi
STATUS_RESPONSE=$(curl --silent --show-error --fail-with-body \
--url "https://api.vidgo.ai/api/generate/status/$TASK_ID" \
--header "Authorization: Bearer $VIDGO_API_KEY")
STATUS=$(printf '%s' "$STATUS_RESPONSE" | jq -r '.data.status // .status // empty')
BUSINESS_CODE=$(printf '%s' "$STATUS_RESPONSE" | jq -r '.code // empty')
if [ "$BUSINESS_CODE" != "0" ] && [ "$BUSINESS_CODE" != "200" ]; then
printf 'Status request failed:
%s
' "$STATUS_RESPONSE" >&2
exit 1
fi
case "$STATUS" in
finished)
printf '%s' "$STATUS_RESPONSE" | jq -r '(.data.files // .files // [])[]?.file_url'
break
;;
failed)
printf '%s' "$STATUS_RESPONSE" | jq -r '.data.error_message // .error_message // "Generation failed"' >&2
exit 1
;;
not_started|running)
sleep "$POLL_DELAY"
if [ "$POLL_DELAY" -lt 10 ]; then POLL_DELAY=$((POLL_DELAY + 1)); fi
;;
*)
printf 'Unexpected task status: %s
' "$STATUS" >&2
exit 1
;;
esac
doneInput Parameters
Available request parameters, data types, and default values. The top-level model field is also required.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| image_urls | array | Yes | — | String array. Contains exactly 1 image URL serving as the opening keyframe. |
| prompt | string | No | — | String. Up to 2,500 characters. Optional directives for camera movement, subject action, and ambiance. |
| resolution | string | No | 1080p | String. Output resolution. Supports 720p and 1080p. |
| duration | integer | No | 5 | Integer. Output duration from 3 to 15 seconds. |
| seed | integer | No | — | Integer. 0 to 2147483647 for reproducible generation foundations. |
| enable_safety_checker | boolean | No | — | Boolean. Enables content safety moderation for inputs and outputs. |
Response Fields
Task submission returns a task_id; status queries yield lifecycle progress and video assets.
| Field | Type | Description |
|---|---|---|
| code | integer | Business response code, 200 on success. |
| data.task_id | string | Unique task identifier used to track and poll progress. |
| data.status | string | Lifecycle state: not_started, running, finished, or failed. |
| data.progress | integer | Generation completion percentage (0–100). |
| data.files[].file_url | string | Public URL of the generated video asset. |
| data.files[].file_type | string | File type string, e.g., video. |
| data.error_message | string | null | Failure details when status equals failed. |
Task Lifecycle
Continue polling while in not_started or running. Conclude when finished or failed is reached.
not_startedTask is accepted in the queue and awaiting execution.
runningGeneration is actively in progress. Continue polling.
finishedTask completed successfully. Read video from data.files[].file_url.
failedGeneration failed. Read data.error_message and stop polling.
Polling & Error Handling
- AuthenticationIf HTTP 401 is returned, verify the Bearer API key in the Authorization header.
- ValidationIf HTTP 400 is returned, verify required parameters, valid value ranges, and available credits.
- Network & TimeoutIf status polling encounters a network timeout, retain the task_id and retry the query.
- Polling FrequencyPoll every 2 seconds initially, gradually backing off for longer generations.
- Terminal StatesOnly continue polling on not_started or running. Halt on finished or failed.
- Callback SupportProvide callback_url in the request payload to receive final task payloads via webhook.
Endpoint Specifications
| Specification | Value | Details |
|---|---|---|
| Input Mode | Single First Frame + Optional Prompt | Supply 1 opening image alongside optional text instructions. |
| First Frame Requirement | Exactly 1 Image URL | Provided in image_urls as a publicly accessible image URI. |
| Output Format | MP4 Video | Asynchronous response returns task_id; final result provides downloadable video URL. |
| Resolution | 720p / 1080p | Default preselected to 1080p. |
| Duration | 3–15 seconds | Default preselected to 5 seconds. |
| Aspect Ratio | 16:9 / 9:16 / 1:1 / 4:3 / 3:4 | Default preselected to 16:9. |
| Billing | Per-second rate | 720p at 16 credits/s, 1080p at 32 credits/s. |
Related Models
Happy Horse 1.0 Image to Video API Frequently Asked Questions
What is the Happy Horse 1.0 Image to Video API?
Happy Horse 1.0 Image to Video is an Alibaba model for video generation from images. It takes a single still image as an opening frame alongside optional prompt directives to generate 3–15s cinematic videos in 720p or 1080p, featuring exceptional first-frame fidelity and natural motion inference. Built on an advanced spatiotemporal diffusion architecture, it anchors opening subject anatomy, attire details, and perspective while introducing physically coherent motion and camera fluidity. You can call it programmatically or try it from the playground above.
Is a starting image required for Happy Horse 1.0 Image to Video?
Yes. This endpoint requires exactly 1 publicly accessible image URL passed in the image_urls array to serve as the opening anchor frame for the video.
Can Happy Horse 1.0 Image to Video generate videos without a prompt?
Yes. The prompt parameter is completely optional. If omitted, the model autonomously infers natural dynamics directly from scene semantics. Adding a prompt allows you to explicitly guide camera trajectory and action pacing.
How does Happy Horse 1.0 Image to Video preserve subject and composition?
The model performs continuous latent diffusion conditioned on the starting keyframe, anchoring initial facial likeness, texture details, and spatial depth before smoothly evolving them into motion.
Can Happy Horse 1.0 Image to Video generate 15-second clips?
Yes. The duration parameter accepts any integer second between 3 and 15 seconds, with 5 seconds preselected in the playground. Extended durations maintain physical consistency and frame stability.
Does Happy Horse 1.0 Image to Video support 1080p output?
Yes. Both 720p and 1080p resolution tiers are supported. The 1080p option faithfully preserves high-frequency textures, fine hair strands, and lighting nuance from the source image.
When should you choose Happy Horse 1.0 Image to Video over Reference to Video?
Choose Image to Video when you have a finalized opening still frame and want the camera or action to start directly from that composition. If you need 1–9 reference images to guide character identity across a completely new shot, choose Reference to Video.















