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

MethodPathPurpose
POST/api/v1/services/aigc/video-generation/video-synthesisSubmit 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 IDDurationResolutionInput
wan3.0-videointeger 2-30 s (default 5), or -1 for automatic480P / 720P / 1080Pfirst / last frame, or up to 10 reference images, 5 reference videos, 5 reference audio tracks, 1 document, 1 web link
happyhorse-1.1-t2vinteger 3-15 s (default 5)480P / 720P / 1080Pprompt only
happyhorse-1.1-i2vinteger 3-15 s (default 5)480P / 720P / 1080Pexactly 1 first_frame image
happyhorse-1.1-r2vinteger 3-15 s (default 5)480P / 720P / 1080P1-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:

Modelprompt
wan3.0-videoconditional — prompt or media, at least one
happyhorse-1.1-t2vrequired
happyhorse-1.1-i2voptional — the first frame alone can drive the clip
happyhorse-1.1-r2vrequired

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:

typeWan 3.0HappyHorse
first_frame1-i2v only, required
last_frame1not accepted
reference_imageup to 10-r2v only, 1-9 required
reference_videoup to 5, ≤15 s combinednot accepted
reference_audioup to 5, ≤15 s combinednot accepted
file1 document (docx / doc / xlsx / xls / pptx / ppt / pdf / txt / key / pages / numbers / md; ≤100 MB, ≤50 pages)not accepted
link1 public web pagenot 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

FieldWan 3.0HappyHorse 1.1
resolution480P / 720P / 1080P (default 1080P)same
durationoptional; 2-30, default 5, or -1 for automaticoptional; 3-15, default 5
ratioadaptive / 16:9 / 4:3 / 1:1 / 3:4 / 9:1616: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
audioboolean, upstream default true (audio on or off costs the same)not accepted
prompt_extendboolean, upstream default truenot accepted
watermarkboolean, upstream default falseboolean, upstream default true
seedinteger 0-2147483647same

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.

On this page