GPT-6 Sol & Claude Opus 5.5 are liveGPT-6 Sol at half the price of 5.6 Sol

HappyHorse 1.1 Image to Video: API Guide and Real Clips

One script sends a still, polls the task and saves the MP4. The fields, the watermark and soundtrack surprises, and 5 clips we made on November 2, 2026.

Kiki, OmniaKey COO11 min read
On this page

To animate a still with 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: 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, 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.

FieldValueNotes
modelhappyhorse-1.1-i2vthe 1.1 image to video model ID
typevideothe kind of file the task makes
operationimage_to_videobare name, no prefix
input.prompttextOmniaKey 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.mediaexactly one {"type": "first_frame", "url": ...}a public HTTPS URL or a data URI
parameters.resolution480P, 720P or 1080Palways send it: Alibaba's default is 1080P
parameters.durationwhole seconds, 3 to 15required on OmniaKey
parameters.watermarktrue (default) or falsefalse removes the "Happy Horse" text
parameters.seed0 to 2147483647the 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, 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 on October 29, 2026.

Five clips we made

We generated four stills with 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.
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.
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.
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.
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.
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.
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

ClipAspectPixelsFramesTimeBytes
Orbit, default16:91286×716123128 s1,486,548
Orbit, watermark: false16:91286×71612198 s1,320,527
Rain portrait9:16716×1286123158 s2,108,577
Lake16:91286×716123131 s2,691,558
Fox1:1960×96012392 s2,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 and HappyHorse 1.1 vs Kling 3.0. To rerun a clip without code, HappyHorse 1.1 is in the 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 through the OmniaKey API to describe each track.

ClipWhat the model describedMean 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, 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.

StatusWhat it meansWhat to do
400 invalid_requestmalformed body, or a task without input.promptcheck the request shape above
400 model_price_errorduration outside the model's window, or an unpriced resolutionuse a supported duration and resolution
403 model_not_allowedyour key or group does not include the modelcheck the key's model access
409 idempotency_key_reusedthe same key was already sent with a different bodyreuse a key only for identical retries
503 no_available_channelno channel serves the model or operation right nowtry 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 checked November 2, 2026:

ResolutionSingaporeBeijing 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.

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, 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, 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

OmniaKey's own documentation, checked November 2, 2026: video API and media API overview.

Models in this article

HappyHorse 1.1image-to-videoAI videovideo APIPython

Related articles

Recent posts

Popular guides