Wan 3.0 and HappyHorse video API
Alibaba Model Studio video generation on Essevin — Wan 3.0 omni-reference clips up to 30s and HappyHorse 1.1 text / image / reference to video, billed only on completed output.
Essevin exposes Alibaba Cloud Model Studio video generation through Alibaba's own DashScope contract, on the original paths. Official Alibaba SDK or HTTP code migrates by changing only the base URL and the key — the request body, the response shape, and the paths are unchanged.
Both model families are asynchronous: submit a task, then poll the Essevin task ID. Use a key that has the Alibaba group enabled and confirm availability with GET /v1/models before sending paid work.
Endpoints
| Method | Path | Purpose |
|---|---|---|
| POST | /api/v1/services/aigc/video-generation/video-synthesis | Submit a Wan 3.0 or HappyHorse video task |
| GET | /api/v1/tasks/{task_id} | Query one task |
All requests use Authorization: Bearer sk-your-key and Content-Type: application/json. You do not need to send X-DashScope-Async — the gateway always requests asynchronous execution upstream.
The body is decoded strictly: unknown fields and a second JSON value are rejected before the upstream is called. This is deliberate. The upstream accepts almost any parameter at submit time and only fails during execution — an invalid resolution still returns a task ID, then fails roughly ten minutes later. Essevin rejects such requests immediately with 400 instead.
Models
| Model ID | Duration | Resolution | Input |
|---|---|---|---|
wan3.0-video | integer 2-30 s (default 5), or -1 for automatic | 480P / 720P / 1080P | first / last frame, or up to 10 reference images, 5 reference videos, 5 reference audio tracks, 1 document, 1 web link |
happyhorse-1.1-t2v | integer 3-15 s (default 5) | 480P / 720P / 1080P | prompt only |
happyhorse-1.1-i2v | integer 3-15 s (default 5) | 480P / 720P / 1080P | exactly 1 first_frame image |
happyhorse-1.1-r2v | integer 3-15 s (default 5) | 480P / 720P / 1080P | 1-9 reference_image images |
Use the exact IDs above. No aliases are registered; unknown model names are rejected. wan3.0-video-prime, happyhorse-1.1-video-edit, and the HappyHorse 1.0 line are not offered.
Request contract
{
"model": "wan3.0-video",
"input": { "prompt": "...", "media": [{ "type": "first_frame", "url": "..." }] },
"parameters": { "resolution": "1080P", "duration": 5 }
}input
Whether prompt is required differs per model, matching Alibaba's own contract:
| Model | prompt |
|---|---|
wan3.0-video | conditional — prompt or media, at least one |
happyhorse-1.1-t2v | required |
happyhorse-1.1-i2v | optional — the first frame alone can drive the clip |
happyhorse-1.1-r2v | required |
Length: Wan 3.0 accepts up to 20,000 characters; HappyHorse accepts up to 5,000 non-Chinese characters (Chinese text is effectively limited to 2,500 upstream). Alibaba silently truncates anything longer; Essevin rejects a prompt over the model's documented maximum with a 400 instead of passing a request through that would be rewritten without telling you.
media entries carry a type and a url:
type | Wan 3.0 | HappyHorse |
|---|---|---|
first_frame | 1 | -i2v only, required |
last_frame | 1 | not accepted |
reference_image | up to 10 | -r2v only, 1-9 required |
reference_video | up to 5, ≤15 s combined | not accepted |
reference_audio | up to 5, ≤15 s combined | not accepted |
file | 1 document (docx / doc / xlsx / xls / pptx / ppt / pdf / txt / key / pages / numbers / md; ≤100 MB, ≤50 pages) | not accepted |
link | 1 public web page | not accepted |
For Wan 3.0, first / last frame input and the reference group (reference_*, file, link) are mutually exclusive in one request, and file and link are additionally mutually exclusive with each other. When a reference video is supplied, Alibaba also caps input video duration + output duration at 30 seconds; the gateway cannot measure your input clip, so that limit is enforced upstream.
url accepts an absolute public http(s) URL or a data: URI (base64 embed). oss:// locators are rejected — the object would belong to your own Alibaba Cloud account, which the gateway cannot access. link must be a real web address, not a data: embed.
parameters
| Field | Wan 3.0 | HappyHorse 1.1 |
|---|---|---|
resolution | 480P / 720P / 1080P (default 1080P) | same |
duration | optional; 2-30, default 5, or -1 for automatic | optional; 3-15, default 5 |
ratio | adaptive / 16:9 / 4:3 / 1:1 / 3:4 / 9:16 | 16:9 / 9:16 / 1:1 / 4:3 / 3:4 / 4:5 / 5:4 / 9:21 / 21:9; not accepted by -i2v, where the output follows the input image |
audio | boolean, upstream default true (audio on or off costs the same) | not accepted |
prompt_extend | boolean, upstream default true | not accepted |
watermark | boolean, upstream default false | boolean, upstream default true |
seed | integer 0-2147483647 | same |
Parameters a model does not support are rejected rather than silently dropped, so a request never appears to have taken effect when it did not. Fields you omit are not sent upstream at all — Alibaba's own defaults apply unchanged.
HappyHorse watermarks output by default
Alibaba's default for HappyHorse watermark is true, which stamps a "Happy Horse" mark on the clip. Essevin does not override upstream defaults. Send "watermark": false explicitly if you need a clean output.
Example — text to video
curl https://api.essevin.com/api/v1/services/aigc/video-generation/video-synthesis \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{
"model": "wan3.0-video",
"input": { "prompt": "Aerial drone shot over snow mountains above a sea of clouds at sunrise" },
"parameters": { "resolution": "1080P", "duration": 5, "ratio": "16:9" }
}'The submission responds with the Essevin task ID in Alibaba's response shape:
{ "output": { "task_id": "blt60x4115010d-d361-4bfc-b131-a382f1c400a5", "task_status": "PENDING" }, "request_id": "..." }Example — image to video
{
"model": "happyhorse-1.1-i2v",
"input": {
"prompt": "The camera slowly pushes in, light drifting across the scene",
"media": [{ "type": "first_frame", "url": "data:image/jpeg;base64,..." }]
},
"parameters": { "resolution": "720P", "duration": 5, "watermark": false }
}Use stable media hosting or data: embeds
Reference media is downloaded by the upstream, not by Essevin. Image hosts that block datacenter IPs (many free image CDNs do) cause the task to fail minutes after submission. Prefer data: embeds or your own OSS / CDN.
Task lifecycle
Poll GET /api/v1/tasks/{task_id}. output.task_status moves PENDING → RUNNING → SUCCEEDED | FAILED. A typical clip completes in 1-5 minutes; long Wan 3.0 clips take longer. Poll at roughly 15-second intervals.
On success the response carries a stable Essevin relay URL (upstream download links expire in 24 hours; the relay refreshes them transparently):
{
"output": {
"task_id": "blt60x4115010d-d361-4bfc-b131-a382f1c400a5",
"task_status": "SUCCEEDED",
"video_url": "https://api.essevin.com/relay/...",
"orig_prompt": "..."
},
"usage": { "video_count": 1, "duration": 5, "SR": 1080, "output_video_duration": 5, "input_video_duration": 0, "ratio": "16:9", "billed_seconds": 5, "billing_bucket": "1080p" }
}usage.SR is the short side in pixels and decides the billing tier. usage.ratio echoes the produced aspect ratio and may be raw dimensions (e.g. 1632:937) rather than one of the request enum values.
A failed task reports the reason in output.message:
{ "output": { "task_id": "blt60x...", "task_status": "FAILED", "code": "TaskFailed", "message": "..." } }Billing
Billing happens only when the task succeeds, from upstream-reported usage:
- Output seconds are billed at the tier the upstream actually produced (
usage.SR), not at the tier you requested. - Wan 3.0 also bills reference-video input seconds at the same tier — Alibaba lists it as an "input and output" unit price. HappyHorse bills output seconds only.
- Failed or safety-filtered generations are never billed, and no usage is reported for them.
See the pricing page for official list prices; your effective rate is shown in the signed-in model catalog.