A marine researcher kneels beside a glowing tide pool at dawn, gently lifting a small translucent crab with tweezers as waves wash over volcanic rock, soft pink and gold sky, cinematic camera slowly pushing in, natural ambient sound, no text, no logos, no watermark, no promotional marks
Happy Horse 1.0 Text to Video API
alibaba/happyhorse-1.0/text-to-videoHappy Horse 1.0 Text to Video transforms natural-language prompts into cinematic short videos, with 3–15 second duration control, 720p or 1080p resolution, and 5 versatile aspect ratios. It faithfully follows scene composition, character action, and camera motion while maintaining visual consistency and physical coherence throughout the clip.
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 prompt instructions, and retrieve the video using the 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 a Generation Task
Configure inputs as shown in the request example with model set to alibaba/happyhorse-1.0/text-to-video.
REQUEST_BODY=$(cat <<'JSON'
{
"model": "alibaba/happyhorse-1.0/text-to-video",
"input": {
"prompt": "A marine researcher kneels beside a glowing tide pool at dawn, gently lifting a small translucent crab with tweezers as waves wash over volcanic rock, soft pink and gold sky, cinematic camera slowly pushing in, natural ambient sound, no text, no logos, no watermark, no promotional marks",
"duration": 5,
"resolution": "1080p",
"aspect_ratio": "16:9"
}
}
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/text-to-video",
"input": {
"prompt": "A marine researcher kneels beside a glowing tide pool at dawn, gently lifting a small translucent crab with tweezers as waves wash over volcanic rock, soft pink and gold sky, cinematic camera slowly pushing in, natural ambient sound, no text, no logos, no watermark, no promotional marks",
"duration": 5,
"resolution": "1080p",
"aspect_ratio": "16:9"
}
}
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 |
|---|---|---|---|---|
| prompt | string | Yes | — | String. Up to 2,500 characters. Guides scene layout, character action, and camera movement. |
| resolution | string | No | 1080p | String. Output resolution. Supports 720p and 1080p. |
| duration | integer | No | 5 | Integer. Output duration from 3 to 15 seconds. |
| aspect_ratio | string | No | 16:9 | String. Output aspect ratio. Supports 16:9, 9:16, 1:1, 4:3, and 3:4. |
| 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 | Text Prompts Only | Provide a descriptive text prompt detailing the scene, action, and camera motion. |
| 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 Text to Video API Frequently Asked Questions
What is the Happy Horse 1.0 Text to Video API?
Happy Horse 1.0 Text to Video is an Alibaba model for video generation from text. It transforms natural-language prompts into 3–15s cinematic videos with 720p and 1080p resolution options across 5 standard aspect ratios, delivering precise prompt-driven camera motion and stable choreography. Built on an advanced video diffusion architecture, it preserves character anatomy and environmental perspective while adding expressive, physically coherent motion. You can call it programmatically or try it from the playground above.
What aspect ratios does Happy Horse 1.0 Text to Video support?
Happy Horse 1.0 Text to Video supports 16:9, 9:16, 1:1, 4:3, and 3:4. Use 16:9 for landscape widescreen cinema, 9:16 for vertical mobile campaigns, and square or classic framing for product and artistic compositions.
Can Happy Horse 1.0 Text to Video generate 15-second videos?
Yes. The duration parameter accepts any integer second from 3 to 15 seconds, with 5 seconds preselected in the playground. Extended durations maintain consistent prompt fidelity and motion stability.
Does Happy Horse 1.0 Text to Video support 1080p output?
Yes. You can toggle between 720p and 1080p via the resolution parameter. Choose 720p for rapid testing and concept iteration, or 1080p for high-detail production deliverables.
How do prompts control camera motion in Happy Horse 1.0 Text to Video?
Describe subject appearance, scene progression, and clear camera instructions (such as slow push-in, low-angle tracking, or orbital panning) in sequential order, avoiding contradictory movement directives.
Can Happy Horse 1.0 Text to Video reproduce shots using a seed?
Yes. Passing an optional integer seed from 0 to 2147483647 fixes the underlying noise distribution, allowing you to reproduce similar framing or isolate specific prompt adjustments.
When should you choose Happy Horse 1.0 Text to Video over Image to Video?
Choose Text to Video when starting from a script or conceptual prompt with no preexisting visual assets. If you already have a finalized opening still frame to animate, use Image to Video instead.















