# HappyHorse 1.1 Image to Video: API Guide and Real Clips

> Call HappyHorse 1.1 image to video from Python: request fields, watermark and audio behavior, Alibaba's price per second, and 5 real clips from our own stills.

- Canonical HTML: https://omniakey.com/blog/happyhorse-1-1-image-to-video
- Markdown: https://omniakey.com/blog/happyhorse-1-1-image-to-video.md
- Published: 2026-11-02 (updated 2026-11-02)
- Author: Kiki, COO at OmniaKey
- Language: en
- Category: API setup
- Reading time: 11 min
- All posts: https://omniakey.com/blog/llms.txt

---

To animate a still with [HappyHorse 1.1](https://omniakey.com/happyhorse-1-1) image to video, POST it as a `first_frame` to `https://api.omniakey.com/v1/media/tasks` with the model ID `happyhorse-1.1-i2v`, poll the task, then download the MP4. Our five 5-second 720P clips took 92 to 158 seconds on November 2, 2026. Every clip had music we never asked for, and the default adds a "Happy Horse" watermark.

## Short answer

- **The request:** model `happyhorse-1.1-i2v`, operation `image_to_video`, and exactly one `first_frame` in `input.media`.
- **Aspect ratio:** the clip follows your still, because there is no `ratio` field.
- **Length and size:** 3 to 15 seconds at 480P, 720P or 1080P, and send `resolution` every time because Alibaba's default is 1080P.
- **Watermark:** on by default, off with `watermark: false`.
- **Sound:** all five of our clips had music, Alibaba's API lists no audio switch, and `ffmpeg` removes the track.

## What do you need before your first HappyHorse 1.1 image to video call?

You need three things: a key, Python 3 and a still that Alibaba's rules accept.

- The key in `OMNIAKEY_API_KEY`. The script sends it as a Bearer token, so it stays out of your code.
- Python 3 with nothing to install. The script imports only the standard library.
- A still that meets [Alibaba's image-to-video API reference](https://www.alibabacloud.com/help/en/model-studio/happyhorse-image-to-video-api-reference): JPEG, JPG, PNG or WEBP; width and height at least 300 pixels; up to 20 MB; aspect ratio from 1:2.5 to 2.5:1. Alibaba states no maximum pixel count.

The catch is size: an inline still travels inside the request body, which has to fit in 1 MiB, Base64 included ([OmniaKey's media API overview](https://docs.omniakey.com/en/media/overview), checked November 2, 2026). The script stops above 700 KB; above that, resize the still or pass a public HTTPS URL. Our 2K still was 2,254,819 bytes, and this macOS command got it to 92,212 bytes:

```bash
sips -s format jpeg -s formatOptions 85 -Z 1280 still.jpg --out still-small.jpg
```

## Which fields does the request take?

Nine fields carry the job: three at the top level, two inside `input`, four inside `parameters`.

|Field|Value|Notes|
|-|-|-|
|`model`|`happyhorse-1.1-i2v`|the 1.1 image to video model ID|
|`type`|`video`|the kind of file the task makes|
|`operation`|`image_to_video`|bare name, no prefix|
|`input.prompt`|text|OmniaKey requires it, Alibaba's API treats it as optional; up to 5,000 non-Chinese or 2,500 Chinese characters, longer text is cut off|
|`input.media`|exactly one `{"type": "first_frame", "url": ...}`|a public HTTPS URL or a data URI|
|`parameters.resolution`|`480P`, `720P` or `1080P`|always send it: Alibaba's default is 1080P|
|`parameters.duration`|whole seconds, 3 to 15|required on OmniaKey|
|`parameters.watermark`|`true` (default) or `false`|`false` removes the "Happy Horse" text|
|`parameters.seed`|0 to 2147483647|the same seed still does not guarantee the same clip|

Four details are easy to miss.

- There is no `ratio` field: the clip keeps your still's aspect ratio (Alibaba's image-to-video API reference, checked November 2, 2026).
- Alibaba's pages show no negative prompt field.
- Every create call needs an `Idempotency-Key` header. Replaying it with the same body returns the original task and never charges twice; a different body gets `409 idempotency_key_reused` (OmniaKey's [video API docs](https://docs.omniakey.com/en/media/video), checked November 2, 2026).
- Output size varies: OmniaKey's docs show a 1200×630 still at 720P coming back as 1324×696.

## The Python script

This is the exact file we ran, with only the standard library.

```python
"""Animate one still with HappyHorse 1.1 image-to-video through the OmniaKey media API.

Usage:
    export OMNIAKEY_API_KEY="your-omniakey-api-key"
    python3 hh_i2v.py still.jpg "The camera slowly orbits the headphones." clip.mp4

The still can be a local JPEG or PNG (sent inline as a data URL) or a public https:// URL.
"""
import base64
import json
import mimetypes
import os
import sys
import time
import urllib.error
import urllib.request
import uuid

API = "https://api.omniakey.com/v1/media/tasks"
HEADERS = {
    "Authorization": "Bearer " + os.environ["OMNIAKEY_API_KEY"],
    "Content-Type": "application/json",
    "User-Agent": "happyhorse-i2v-example/1.0",
}
POLL_SECONDS = 10
GIVE_UP_AFTER = 15 * 60  # most clips finish in 1-5 minutes


def call(method, url, body=None, extra_headers=None):
    data = json.dumps(body).encode() if body is not None else None
    req = urllib.request.Request(url, data=data, method=method, headers={**HEADERS, **(extra_headers or {})})
    for attempt in range(3):
        try:
            with urllib.request.urlopen(req, timeout=60) as resp:
                return json.load(resp)
        except urllib.error.HTTPError as err:
            sys.exit(f"HTTP {err.code}: {err.read().decode(errors='replace')}")
        except (urllib.error.URLError, TimeoutError, ConnectionError) as err:
            if attempt == 2:
                raise
            print("network error, retrying:", err)  # a retried POST keeps its Idempotency-Key
            time.sleep(5)


def first_frame_url(image):
    if image.startswith("https://"):
        return image
    raw = open(image, "rb").read()
    if len(raw) > 700_000:  # Base64 adds a third, and the whole request must stay under 1 MiB
        sys.exit("The still is over 700 KB. Resize it or pass a public https:// URL instead.")
    mime = mimetypes.guess_type(image)[0] or "image/jpeg"
    return f"data:{mime};base64,{base64.b64encode(raw).decode()}"


def main(image, prompt, out_path):
    task = call("POST", API, {
        "model": "happyhorse-1.1-i2v",
        "type": "video",
        "operation": "image_to_video",
        "input": {"prompt": prompt, "media": [{"type": "first_frame", "url": first_frame_url(image)}]},
        "parameters": {"resolution": "720P", "duration": 5, "watermark": False},  # watermark is on by default
    }, {"Idempotency-Key": str(uuid.uuid4())})
    print("task", task["id"], task["status"])

    start = time.time()
    while task["status"] in ("queued", "processing"):
        if time.time() - start > GIVE_UP_AFTER:
            sys.exit(f"Still {task['status']} after 15 minutes. Do not submit it again; "
                     f"check it later with GET {API}/{task['id']}")
        time.sleep(POLL_SECONDS)
        task = call("GET", f"{API}/{task['id']}")
    print(task["status"], "after", round(time.time() - start), "s")
    if task["status"] != "succeeded":
        sys.exit(json.dumps(task.get("error") or task))

    # The signed download URL is short-lived, so save the file right away.
    req = urllib.request.Request(task["assets"][0]["url"], headers={"User-Agent": HEADERS["User-Agent"]})
    with urllib.request.urlopen(req, timeout=300) as resp, open(out_path, "wb") as f:
        f.write(resp.read())
    print("saved", out_path)


if __name__ == "__main__":
    main(*sys.argv[1:4])
```

Save it as `hh_i2v.py` and run:

```bash
export OMNIAKEY_API_KEY="your-omniakey-api-key"
python3 hh_i2v.py still.jpg "The camera slowly orbits the headphones." clip.mp4
```

Our `watermark: false` run printed this:

```text
task task_QqK3ZdAd72vmK1DSOuOxXSytBSaJ244v queued
succeeded after 91 s
saved data/clips/c5-orbit-nowm.mp4
```

Five things in the script matter.

- It polls every 10 seconds.
- It gives up after 15 minutes with a message telling you not to submit again.
- On a network error it retries, and a retried create keeps its `Idempotency-Key`, so you get the original task back instead of a second charge.
- It saves the file as soon as the task succeeds, because the signed download URL is short-lived.
- It sends a User-Agent on every request: Python's default one got HTTP 403 with `error code: 1010` from Cloudflare in our [Kling 3.0 API test](https://omniakey.com/blog/kling-3-0-api) on October 29, 2026.

## Five clips we made

We generated four stills with [Nano Banana 2.1](https://omniakey.com/gemini-nano-banana-2-1) and ran the headphones image twice to test the watermark. That made five clips, all 5 seconds and 720P, on November 2, 2026. The portrait, lake and fox clips went out with default settings, so the watermark shows in those frames.

### Headphones orbit

```prompt
The camera slowly orbits about 90 degrees to the right around the headphones while a soft band of light sweeps across the ear cups. The headphones stay perfectly still on the pedestal. Smooth, steady product-commercial camera move.
```

![Eight frames of black headphones on a stone pedestal. The camera swings from one side of them to the other, and a curved backdrop edge appears behind them in the middle frames.](https://omniakey.com/_img/blog/happyhorse-1-1-image-to-video/c5-orbit-nowm-frames.a561e2e5.1280.webp)

_Eight frames from the orbit clip in time order, 0.0 to 4.85 seconds, with watermark set to false. HappyHorse 1.1 via the OmniaKey API, image to video, 5 seconds, 720P, made November 2, 2026._

The camera swings from one side of the headphones to the other, and they stay on the pedestal. In the middle frames a curved backdrop edge appears behind them that is not in the still, and the band of light the prompt asked for is hard to see.

We ran the same prompt on the same still twice, once with the default and once with `watermark: false`, and the corner shows the difference.

![The bottom-right corner of two clips. The top one shows white Happy Horse text, and the bottom one, with watermark set to false, is clean.](https://omniakey.com/_img/blog/happyhorse-1-1-image-to-video/watermark-corner.f1918105.1048.webp)

_Bottom-right corner of the last frame of each orbit clip, enlarged. Top: default settings. Bottom: watermark set to false. HappyHorse 1.1 via the OmniaKey API, image to video, 5 seconds, 720P, made November 2, 2026._

### Rain portrait

```prompt
She slowly turns her head toward the camera and gives a small smile while light rain keeps falling. The neon signs behind her flicker softly and the camera pushes in a little.
```

![Four frames of a woman in a yellow raincoat on a wet neon street. She turns from looking left to facing the camera and smiles, while the shot moves from waist-up to a close-up.](https://omniakey.com/_img/blog/happyhorse-1-1-image-to-video/c2-smile-frames.b5f07e60.1280.webp)

_Four frames from the rain portrait clip in time order, 0.0 to 4.85 seconds, with the default watermark. HappyHorse 1.1 via the OmniaKey API, image to video, 5 seconds, 720P, made November 2, 2026._

She turns from looking left to facing the camera and smiles, in the order the prompt gave, and the watermark sits in every frame. The prompt asked for a small push-in, and the shot goes from waist-up to a close-up of her face.

### Lake push-in

```prompt
Slow aerial push-in over the water toward the rowboat. Mist drifts across the lake, the boat rocks gently and small ripples spread from its hull, and the golden light grows a little brighter.
```

![Eight frames of a wooden rowboat on a misty lake at sunrise. The camera pushes in until the boat fills most of the frame, with ripples spreading from its hull.](https://omniakey.com/_img/blog/happyhorse-1-1-image-to-video/c3-pushin-frames.eb8d9567.1280.webp)

_Eight frames from the lake clip in time order, 0.0 to 4.85 seconds, with the default watermark. HappyHorse 1.1 via the OmniaKey API, image to video, 5 seconds, 720P, made November 2, 2026._

The camera pushes in toward the boat, as asked. By the end the boat fills most of the frame, and ripples spread out from its hull.

### Fox illustration

```prompt
The fox turns a page of the book with its paw and its ears twitch. A few orange leaves drift down from the tree and the branches sway gently. Keep the flat illustration style.
```

![Four frames of a flat illustration of a fox reading under an autumn tree. Orange leaves drift down, and the view zooms in from the whole tree to the fox.](https://omniakey.com/_img/blog/happyhorse-1-1-image-to-video/c4-page-frames.42eebfe3.1280.webp)

_Four frames from the fox clip in time order, 0.0 to 4.85 seconds, with the default watermark. HappyHorse 1.1 via the OmniaKey API, image to video, 5 seconds, 720P, made November 2, 2026._

The flat illustration style holds from the first frame to the last while orange leaves drift down. The camera zooms in from the whole tree to a close view of the fox, which the prompt never asked for; the pages of the book lift, though the frames do not confirm the paw turns one.

![Left: the fox still we sent, with the whole tree in view. Right: the last frame of the clip, much closer on the fox and its open book, in the same flat style, with a Happy Horse watermark.](https://omniakey.com/_img/blog/happyhorse-1-1-image-to-video/c4-page-first-last.809384e0.1872.webp)

_Left: the still sent as the first frame. Right: the last frame of the fox clip. HappyHorse 1.1 via the OmniaKey API, image to video, 5 seconds, 720P, made November 2, 2026._

In 2 of our 4 prompts the camera moved more than we asked for, so check the framing on a short test. A 3-second 480P clip is the shortest and lowest tier the docs list (Alibaba's image-to-video API reference, checked November 2, 2026).

### What the files measured

|Clip|Aspect|Pixels|Frames|Time|Bytes|
|-|-|-|-|-|-|
|Orbit, default|16:9|1286×716|123|128 s|1,486,548|
|Orbit, `watermark: false`|16:9|1286×716|121|98 s|1,320,527|
|Rain portrait|9:16|716×1286|123|158 s|2,108,577|
|Lake|16:9|1286×716|123|131 s|2,691,558|
|Fox|1:1|960×960|123|92 s|2,405,557|

Every file reports 5.16 seconds although we asked for 5: that is the audio stream, while the video stream runs 5.13 seconds at 123 frames and 5.04 seconds at 121 frames. All five are 24 fps H.264 with a two-channel AAC track, and a cut-detection script found no cuts in any of them.

Our clips took 92 to 158 seconds from submit to download, against the 1 to 5 minutes Alibaba's docs give for image-to-video tasks (Alibaba's image-to-video API reference, checked November 2, 2026). We did not test 480P, 1080P, any other duration, `seed`, a public image URL, HappyHorse 1.0, or Alibaba's own endpoint. To choose between models, see [HappyHorse 1.1 vs Seedance 2.0](https://omniakey.com/blog/happyhorse-1-1-vs-seedance-2-0) and [HappyHorse 1.1 vs Kling 3.0](https://omniakey.com/blog/happyhorse-1-1-vs-kling-3-0). To rerun a clip without code, HappyHorse 1.1 is in the [AI Video Generator](https://omniakey.com/ai-video-generator).

## Why do the clips have sound?

HappyHorse 1.1 added a soundtrack to all five clips, though none of our prompts asked for one. No person listened to them: we asked [Gemini 3.8 Flash](https://omniakey.com/gemini-3-8-flash) through the OmniaKey API to describe each track.

|Clip|What the model described|Mean loudness|
|-|-|-|
|Orbit, default|"A rhythmic hip-hop beat featuring syncopated percussion, claps, and mellow synth chords."|−19.5 dB|
|Orbit, `watermark: false`|"Chill, rhythmic electronic music with a steady beat and melodic synth tones"|−20.5 dB|
|Rain portrait|"A slow, melancholic, and gentle piano melody with soft atmospheric ambience"|−22.6 dB|
|Lake|"A slow, gentle, and sentimental piano melody"|−20.2 dB|
|Fox|"A calm, gentle ambient melody played with soft bell-like tones", plus "crunching footsteps on gravel"|−27.4 dB|

It reported no speech in any clip. The same prompt and still, run twice, got two different tracks.

Alibaba's image-to-video reference lists no audio field and no silent option, though its 1.1 release note mentions audio-visual synchronization (Alibaba's [newly released models page](https://www.alibabacloud.com/help/en/model-studio/newly-released-models), checked November 2, 2026). To get a silent file, strip the track after the download:

```bash
ffmpeg -i clip.mp4 -an -c:v copy silent.mp4
```

We ran that on the `watermark: false` clip and the result has a video stream and no audio stream. The picture stays exactly as it was, because `-c:v copy` copies the stream instead of re-encoding it.

## How long do results stay available?

On OmniaKey the signed link to your MP4 lasts about 1 hour, and the task record is kept for 24 hours; poll the task again for a fresh URL (OmniaKey's media API overview, checked November 2, 2026). On Alibaba's own API, the video URL and the task ID both last 24 hours, and after that a query returns `UNKNOWN` and the file is gone. Download as soon as a task succeeds.

## Which errors will you hit?

None of our five runs failed, so this list comes from OmniaKey's video API docs, checked November 2, 2026.

|Status|What it means|What to do|
|-|-|-|
|400 `invalid_request`|malformed body, or a task without `input.prompt`|check the request shape above|
|400 `model_price_error`|duration outside the model's window, or an unpriced resolution|use a supported duration and resolution|
|403 `model_not_allowed`|your key or group does not include the model|check the key's model access|
|409 `idempotency_key_reused`|the same key was already sent with a different body|reuse a key only for identical retries|
|503 `no_available_channel`|no channel serves the model or operation right now|try later, or check the Dashboard|

A task that ends `failed` is refunded automatically, so a rejected render costs only your time (OmniaKey's media API overview, checked November 2, 2026).

The mistake to avoid is reading a timeout on your side as a failed task. Poll the same task ID; resubmitting starts a second task and a second charge. If you do resend, keep the same `Idempotency-Key` and the same body, and you get the original task back.

## What does a HappyHorse 1.1 clip cost?

A 5-second 720P clip costs $0.70 at Alibaba's Singapore list price. These are Alibaba's per-second prices, from its [pricing page](https://www.alibabacloud.com/help/en/model-studio/model-pricing) checked November 2, 2026:

|Resolution|Singapore|Beijing and Global|
|-|-|-|
|480P|$0.07|$0.0618845|
|720P|$0.14|$0.123769|
|1080P|$0.18|$0.165026|

The bill is the per-second price times the seconds of output. Failed requests are not billed. Singapore also includes a free quota of 10 seconds, valid for 90 days. On the pricing page, the Global prices apply to Frankfurt, Virginia and Tokyo.

OmniaKey bills per second of rendered output and pre-charges when you create the task, with failed or canceled tasks refunded automatically; for current rates see the [HappyHorse 1.1 page](https://omniakey.com/happyhorse-1-1).

## Can you call Alibaba Cloud directly?

Yes. HappyHorse is served on Alibaba Cloud Model Studio, with region endpoints for Singapore, US (Virginia), Beijing, Frankfurt and Tokyo (Alibaba's image-to-video API reference, checked November 2, 2026). Our runs went through OmniaKey's API, so what follows comes from Alibaba's docs.

- Create with `POST https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/video-generation/video-synthesis` for Singapore.
- Send the header `X-DashScope-Async: enable`, or the request fails with "current user api does not support synchronous calls".
- Poll `GET .../api/v1/tasks/{task_id}` about every 15 seconds; the status runs `PENDING`, `RUNNING`, `SUCCEEDED`, `FAILED`, `CANCELED`, `UNKNOWN`.
- Keep the model, the endpoint and the key in the same region, because cross-region calls fail.
- One key gets 5 requests per second and 5 concurrent tasks (Alibaba's [rate limit page](https://www.alibabacloud.com/help/en/model-studio/rate-limit), checked November 2, 2026).

The pricing page lists Tokyo, but the rate-limit page does not list 1.1 image to video there, so Tokyo is unconfirmed.

## Frequently asked questions

### Do I need a prompt for HappyHorse image to video?

On OmniaKey, yes: a task without `input.prompt` gets `400 invalid_request` (OmniaKey's video API docs, checked November 2, 2026). Alibaba's own API treats the prompt as optional and takes the first frame alone. Either way, name the motion and the camera move, as our prompts above do.

### How do I remove the Happy Horse watermark?

Send `parameters.watermark: false`. The default `true` draws small white "Happy Horse" text in the bottom-right corner; our second orbit clip, sent with `false`, came back clean.

### How do I set the aspect ratio?

Crop the still. Image to video has no `ratio` field and the clip follows the shape of the first frame, so our 16:9 still gave a 16:9 clip and the portrait gave a 9:16 clip. Keep the crop between 1:2.5 and 2.5:1.

### Is there a HappyHorse 1.5?

Nothing after 1.1 appears in Alibaba's [model list](https://www.alibabacloud.com/help/en/model-studio/models), pricing tables or lifecycle page as of November 2, 2026, and the newest version on those pages is `happyhorse-1.1-i2v`, released June 16, 2026. Some sites use the name "Happy Horse 1.5".

### Is HappyHorse 1.1 better than 1.0 for image to video?

Alibaba says 1.1 improves visual quality, dynamic performance and cross-clip consistency, and its pricing page lists a 480P tier only for 1.1. 1.1 came out on June 16, 2026 and 1.0 on April 22, 2026. At Alibaba's Singapore rate, 1080P costs $0.18 per second on 1.1 against $0.24 on 1.0.

## Sources checked

- [Alibaba Cloud: HappyHorse image-to-video API reference](https://www.alibabacloud.com/help/en/model-studio/happyhorse-image-to-video-api-reference), checked November 2, 2026
- [Alibaba Cloud: model pricing](https://www.alibabacloud.com/help/en/model-studio/model-pricing), checked November 2, 2026
- [Alibaba Cloud: models](https://www.alibabacloud.com/help/en/model-studio/models), checked November 2, 2026
- [Alibaba Cloud: newly released models](https://www.alibabacloud.com/help/en/model-studio/newly-released-models), checked November 2, 2026
- [Alibaba Cloud: rate limit](https://www.alibabacloud.com/help/en/model-studio/rate-limit), checked November 2, 2026

OmniaKey's own documentation, checked November 2, 2026: [video API](https://docs.omniakey.com/en/media/video) and [media API overview](https://docs.omniakey.com/en/media/overview).
