models

happyhorse-1.1-t2v

Markdown · JSON

happyhorse-1.1-t2v

A model for creating short videos with audio from text descriptions. Suited to scenes whose movement, composition and visual style are specified in words.

About the model

This description covers the model’s capabilities. Available in Ailoot inputs, outputs and options are listed for the selected method below.

HappyHorse-1.1-T2V is an Alibaba model for creating short video scenes from text. The prompt specifies characters, actions, surroundings and visual treatment; this mode does not require a source image. The model produces video and can generate accompanying audio.

The manufacturer highlights understanding of a scene's meaning, cinematic staging and expressive movement. Text can define the atmosphere, a character's actions, object behavior and physical dynamics. This makes it possible to build a scene around what should happen, then guide it through lighting, viewpoint and camera movement.

Staging with words

A prompt is required and may be in any language. It can contain up to 5000 non-Chinese or 2500 Chinese characters; any excess is truncated. The action, surroundings and important visual details need to be described within that limit. This approach leaves the model room to create a new scene rather than supplying it with a finished first frame.

In this mode, text is the main controlling input. The specific appearance of a character or object can be described in words; supplying separate images to establish that appearance belongs to another mode in the family. The result depends on the entire prompt, so the same random seed can help produce similar variations without guaranteeing an exact repeat.

Video and accompanying audio

For HappyHorse-1.1, video duration is selected as an integer from 3 to 15 seconds. Resolution levels of 480P, 720P and 1080P are supported. The finished file is MP4 at 24 frames per second. The model can generate audio alongside the visuals, connecting the soundtrack to what happens in the scene.

The frame shape can be specified in advance. Available ratios are 16:9, 9:16, 1:1, 4:3, 3:4, 4:5, 5:4, 9:21 and 21:9, ranging from a wide cinematic frame to an elongated portrait video. Resolution, format and duration determine the dimensions of the result; text defines its content and movement.

This variant is intended to create a new scene from a verbal concept. It is suited to a short episode, a visual idea or an atmospheric video whose staging needs to be expressed in text.

Ailoot · Video POST /v1/videos/generations happyhorse-1.1-t2v

happyhorse-1.1-t2v

Alibaba /happyhorse-1.1-t2v
Model ID
  • happyhorse-1.1-t2v
  • happyhorse-t2v
  • happyhorse-t2v-latest

Overview

A model for creating short videos with audio from text descriptions. Suited to scenes whose movement, composition and visual style are specified in words.

Accepted inputs
Text
Results
Video

Available in Ailoot · inputs & methods

Ailoot · Video POST /v1/videos/generations
Input types
text
Output types
video
Output format
mp4
FieldTypeRequirementValues & limitsDefault
FieldmodelTypestringRequirementRequiredValues & limits
happyhorse-1.1-t2v
Default—
FieldpromptTypestringRequirementRequiredValues & limits
Minimum length: 1
Default—
FielddurationTypeintegerRequirementOptionalValues & limits
Minimum: 3
Maximum: 15
Unit: seconds
Default5
FieldresolutionTypestringRequirementOptionalValues & limits
480P, 720P, 1080P
Default720P
FieldratioTypestringRequirementOptionalValues & limits
16:9, 9:16, 1:1, 4:3, 3:4, 4:5, 5:4, 9:21, 21:9
Default16:9
Fieldimage_urlsTypehttps_url|data_image_url[]RequirementOptionalValues & limits
Minimum items: 0
Maximum items: 0
Maximum decoded bytes: 20,971,520
MIME types: image/jpeg, image/png, image/webp
Default—
Input material combinations

Text to video · Required: prompt

Method parameters and lifecycle
ParameterContract
Parametercontent_typeContractapplication/json
ParameterrequiredContractmodel, prompt
Parametermaterial_typesContracttext
ParameteroptionalContractduration, resolution, ratio
Parameterduration_integer_rangeContract3, 15
Parameterdefault_durationContract5
ParameterresolutionContract480P, 720P, 1080P
Parameterdefault_resolutionContract720P
ParameterratioContract16:9, 9:16, 1:1, 4:3, 3:4, 4:5, 5:4, 9:21, 21:9
Parameterratio_must_omitContractfalse
Parameterimage_urlsContract{"max_count":0}

Lifecycle: submit_once_poll_original

GET /v1/videos/{request_id}

GET /v1/videos/generations/{request_id}

GET /v1/videos/{request_id}/content

GET /v1/videos/generations/{request_id}/content

Method shapes and IDs are exact; supplier capability is separate from admission.

Pricing

Ailoot method rates

Ailoot VideoPOST /v1/videos/generations
Output
$0.18 per second at 1080p
Output
$0.07 per second at 480p
Output
$0.14 per second at 720p

Ailoot reserves an estimated amount before a request. After the result, it settles the final charge from measured usage. Streaming settlement uses the final usage record. How reservation and settlement work →

Example requests

Ailoot · Video

Scene example
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_PROMPT_FILE:?Set your actual UTF-8 scene brief}"
export AILOOT_PROMPT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "happyhorse-1.1-t2v", "prompt": "", "duration": 5, "resolution": "720P", "ratio": "16:9"}')
f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 brief")
p['prompt']=f.read_text(encoding="utf-8")
if not p['prompt'].strip():raise SystemExit("Brief must contain text")
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/videos/generations \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT

Receive and save results

Ailoot · Video

mp4

  • GET /v1/videos/{request_id}
  • GET /v1/videos/generations/{request_id}
  • GET /v1/videos/{request_id}/content
  • GET /v1/videos/generations/{request_id}/content
Check job status
GET status
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_OPERATION_ID:?Set the actual Ailoot operation ID returned by creation}"
export AILOOT_OPERATION_ID
operation_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ["AILOOT_OPERATION_ID"],safe=""))')
curl --fail-with-body --silent --show-error "https://api.ailoot.ai/v1/videos/generations/$operation_id" \
  -H "Authorization: Bearer $AILOOT_API_KEY" -o status.json
python3 - <<'PY_STATUS'
import json
from pathlib import Path
r=json.loads(Path("status.json").read_text())
print(json.dumps(r))
if r.get("status")=="completed":
    for x in r.get("data",[]):print(x)
PY_STATUS
Save all completed assets
GET all completed assets
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_STATUS_FILE:?Set the actual completed status JSON file}"
export AILOOT_STATUS_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
from urllib.parse import urlsplit,urljoin
f=Path(os.environ["AILOOT_STATUS_FILE"])
if not f.is_file():raise SystemExit("Choose the actual completed status file")
r=json.loads(f.read_text())
if r.get("status")!="completed" or not isinstance(r.get("data"),list) or not r["data"]:raise SystemExit("Wait for a completed status with asset paths")
urls=[]
for x in r["data"]:
    if not isinstance(x,str) or "\n" in x or "\r" in x:raise SystemExit("Invalid asset path")
    u=urljoin("https://api.ailoot.ai",x)
    z=urlsplit(u)
    if z.scheme!="https" or z.netloc!="api.ailoot.ai" or z.username or z.password:raise SystemExit("Use the actual Ailoot asset paths from status")
    urls.append(u)
Path("asset-urls.txt").write_text("\n".join(urls)+"\n")
PY_REQUEST
index=0
while IFS= read -r asset_url; do
  curl --fail-with-body --silent --show-error "$asset_url" \
    -H "Authorization: Bearer $AILOOT_API_KEY" -o "video-${index}.mp4"
  index=$((index + 1))
done < asset-urls.txt
Other content reads
GET content
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_OPERATION_ID:?Set the actual Ailoot operation ID returned by creation}"
export AILOOT_OPERATION_ID
operation_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ["AILOOT_OPERATION_ID"],safe=""))')
curl --fail-with-body --silent --show-error "https://api.ailoot.ai/v1/videos/generations/$operation_id/content" \
  -H "Authorization: Bearer $AILOOT_API_KEY" -o video.mp4
Keep all completed results

Save every completed video or returned file; retrieve every actual returned asset URL.

Preserve every returned data item/output index. content_url is first only; fetch every actual content path/asset. GETcontentwithoutindex isnotalloutputs.

If the original response needs checking

Read existing original job; never resubmit unknown send.

Response fields
FieldType
FieldidTypestring
FieldobjectTypestring
FieldmodelTypestring
FieldstatusTypestring
Fieldcontent_urlTypesigned URL
Fielddata[]Typesigned URL
FieldusageTypeobject
Fieldresult_pending_checkTypeboolean
Errors and next steps
ResponseConditionNext step
Response400 · invalid_request_errorConditionInvalid required fields, material representation or parameter valueNext stepCorrect the indicated fields before a new creation request.
Response409 · video_not_readyConditionOriginal result content is not yet availableNext stepPoll the original returned ID and respect Retry-After.
Responseserver_errorConditionThe returned response says the operation or result requires a checkNext stepKeep the original returned operation/task ID, request headers and response; continue supported reads of that original operation. Do not resubmit the creation request.

Aliases

Model aliases

Ailoot happyhorse-1.1-t2v, happyhorse-t2v, happyhorse-t2v-latest

Method path aliases

Use the method paths shown above.

Related caller IDs

happyhorse-1.1-t2v, happyhorse-t2v, happyhorse-t2v-latest

Ailoot · Video POST /v1/videos/generations happyhorse-t2v

happyhorse-t2v

Alibaba /happyhorse-t2v
Model ID
  • happyhorse-1.1-t2v
  • happyhorse-t2v
  • happyhorse-t2v-latest

Overview

A model for creating short videos with audio from text descriptions. Suited to scenes whose movement, composition and visual style are specified in words.

Accepted inputs
Text
Results
Video

Available in Ailoot · inputs & methods

Ailoot · Video POST /v1/videos/generations
Input types
text
Output types
video
Output format
mp4
FieldTypeRequirementValues & limitsDefault
FieldmodelTypestringRequirementRequiredValues & limits
happyhorse-t2v
Default—
FieldpromptTypestringRequirementRequiredValues & limits
Minimum length: 1
Default—
FielddurationTypeintegerRequirementOptionalValues & limits
Minimum: 3
Maximum: 15
Unit: seconds
Default5
FieldresolutionTypestringRequirementOptionalValues & limits
480P, 720P, 1080P
Default720P
FieldratioTypestringRequirementOptionalValues & limits
16:9, 9:16, 1:1, 4:3, 3:4, 4:5, 5:4, 9:21, 21:9
Default16:9
Fieldimage_urlsTypehttps_url|data_image_url[]RequirementOptionalValues & limits
Minimum items: 0
Maximum items: 0
Maximum decoded bytes: 20,971,520
MIME types: image/jpeg, image/png, image/webp
Default—
Input material combinations

Text to video · Required: prompt

Method parameters and lifecycle
ParameterContract
Parametermaterial_typesContracttext
ParameterrequiredContractnull
Parameteroptional_controlsContractnull

Lifecycle: submit_once_poll_original

GET /v1/videos/{request_id}

GET /v1/videos/generations/{request_id}

GET /v1/videos/{request_id}/content

GET /v1/videos/generations/{request_id}/content

Method shapes and IDs are exact; supplier capability is separate from admission.

Pricing

Ailoot method rates

Ailoot VideoPOST /v1/videos/generations
Output
$0.18 per second at 1080p
Output
$0.07 per second at 480p
Output
$0.14 per second at 720p

Ailoot reserves an estimated amount before a request. After the result, it settles the final charge from measured usage. Streaming settlement uses the final usage record. How reservation and settlement work →

Example requests

Ailoot · Video

Scene example
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_PROMPT_FILE:?Set your actual UTF-8 scene brief}"
export AILOOT_PROMPT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "happyhorse-t2v", "prompt": "", "duration": 5, "resolution": "720P", "ratio": "16:9"}')
f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 brief")
p['prompt']=f.read_text(encoding="utf-8")
if not p['prompt'].strip():raise SystemExit("Brief must contain text")
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/videos/generations \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT

Receive and save results

Ailoot · Video

mp4

  • GET /v1/videos/{request_id}
  • GET /v1/videos/generations/{request_id}
  • GET /v1/videos/{request_id}/content
  • GET /v1/videos/generations/{request_id}/content
Check job status
GET status
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_OPERATION_ID:?Set the actual Ailoot operation ID returned by creation}"
export AILOOT_OPERATION_ID
operation_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ["AILOOT_OPERATION_ID"],safe=""))')
curl --fail-with-body --silent --show-error "https://api.ailoot.ai/v1/videos/generations/$operation_id" \
  -H "Authorization: Bearer $AILOOT_API_KEY" -o status.json
python3 - <<'PY_STATUS'
import json
from pathlib import Path
r=json.loads(Path("status.json").read_text())
print(json.dumps(r))
if r.get("status")=="completed":
    for x in r.get("data",[]):print(x)
PY_STATUS
Save all completed assets
GET all completed assets
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_STATUS_FILE:?Set the actual completed status JSON file}"
export AILOOT_STATUS_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
from urllib.parse import urlsplit,urljoin
f=Path(os.environ["AILOOT_STATUS_FILE"])
if not f.is_file():raise SystemExit("Choose the actual completed status file")
r=json.loads(f.read_text())
if r.get("status")!="completed" or not isinstance(r.get("data"),list) or not r["data"]:raise SystemExit("Wait for a completed status with asset paths")
urls=[]
for x in r["data"]:
    if not isinstance(x,str) or "\n" in x or "\r" in x:raise SystemExit("Invalid asset path")
    u=urljoin("https://api.ailoot.ai",x)
    z=urlsplit(u)
    if z.scheme!="https" or z.netloc!="api.ailoot.ai" or z.username or z.password:raise SystemExit("Use the actual Ailoot asset paths from status")
    urls.append(u)
Path("asset-urls.txt").write_text("\n".join(urls)+"\n")
PY_REQUEST
index=0
while IFS= read -r asset_url; do
  curl --fail-with-body --silent --show-error "$asset_url" \
    -H "Authorization: Bearer $AILOOT_API_KEY" -o "video-${index}.mp4"
  index=$((index + 1))
done < asset-urls.txt
Other content reads
GET content
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_OPERATION_ID:?Set the actual Ailoot operation ID returned by creation}"
export AILOOT_OPERATION_ID
operation_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ["AILOOT_OPERATION_ID"],safe=""))')
curl --fail-with-body --silent --show-error "https://api.ailoot.ai/v1/videos/generations/$operation_id/content" \
  -H "Authorization: Bearer $AILOOT_API_KEY" -o video.mp4
Keep all completed results

Save every completed video or returned file; retrieve every actual returned asset URL.

Preserve every returned data item/output index. content_url is first only; fetch every actual content path/asset. GETcontentwithoutindex isnotalloutputs.

If the original response needs checking

Read existing original job; never resubmit unknown send.

Response fields
FieldType
FieldidTypestring
FieldobjectTypestring
FieldmodelTypestring
FieldstatusTypestring
Fieldcontent_urlTypesigned URL
Fielddata[]Typesigned URL
FieldusageTypeobject
Fieldresult_pending_checkTypeboolean
Errors and next steps
ResponseConditionNext step
Response400 · invalid_request_errorConditionInvalid required fields, material representation or parameter valueNext stepCorrect the indicated fields before a new creation request.
Response409 · video_not_readyConditionOriginal result content is not yet availableNext stepPoll the original returned ID and respect Retry-After.
Responseserver_errorConditionThe returned response says the operation or result requires a checkNext stepKeep the original returned operation/task ID, request headers and response; continue supported reads of that original operation. Do not resubmit the creation request.

Aliases

Model aliases

Ailoot happyhorse-1.1-t2v, happyhorse-t2v, happyhorse-t2v-latest

Method path aliases

Use the method paths shown above.

Related caller IDs

happyhorse-1.1-t2v, happyhorse-t2v, happyhorse-t2v-latest

Ailoot · Video POST /v1/videos/generations happyhorse-t2v-latest

happyhorse-t2v-latest

Alibaba /happyhorse-t2v-latest
Model ID
  • happyhorse-1.1-t2v
  • happyhorse-t2v
  • happyhorse-t2v-latest

Overview

A model for creating short videos with audio from text descriptions. Suited to scenes whose movement, composition and visual style are specified in words.

Accepted inputs
Text
Results
Video

Available in Ailoot · inputs & methods

Ailoot · Video POST /v1/videos/generations
Input types
text
Output types
video
Output format
mp4
FieldTypeRequirementValues & limitsDefault
FieldmodelTypestringRequirementRequiredValues & limits
happyhorse-t2v-latest
Default—
FieldpromptTypestringRequirementRequiredValues & limits
Minimum length: 1
Default—
FielddurationTypeintegerRequirementOptionalValues & limits
Minimum: 3
Maximum: 15
Unit: seconds
Default5
FieldresolutionTypestringRequirementOptionalValues & limits
480P, 720P, 1080P
Default720P
FieldratioTypestringRequirementOptionalValues & limits
16:9, 9:16, 1:1, 4:3, 3:4, 4:5, 5:4, 9:21, 21:9
Default16:9
Fieldimage_urlsTypehttps_url|data_image_url[]RequirementOptionalValues & limits
Minimum items: 0
Maximum items: 0
Maximum decoded bytes: 20,971,520
MIME types: image/jpeg, image/png, image/webp
Default—
Input material combinations

Text to video · Required: prompt

Method parameters and lifecycle
ParameterContract
Parametermaterial_typesContracttext
ParameterrequiredContractnull
Parameteroptional_controlsContractnull

Lifecycle: submit_once_poll_original

GET /v1/videos/{request_id}

GET /v1/videos/generations/{request_id}

GET /v1/videos/{request_id}/content

GET /v1/videos/generations/{request_id}/content

Method shapes and IDs are exact; supplier capability is separate from admission.

Pricing

Ailoot method rates

Ailoot VideoPOST /v1/videos/generations
Output
$0.18 per second at 1080p
Output
$0.07 per second at 480p
Output
$0.14 per second at 720p

Ailoot reserves an estimated amount before a request. After the result, it settles the final charge from measured usage. Streaming settlement uses the final usage record. How reservation and settlement work →

Example requests

Ailoot · Video

Scene example
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_PROMPT_FILE:?Set your actual UTF-8 scene brief}"
export AILOOT_PROMPT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "happyhorse-t2v-latest", "prompt": "", "duration": 5, "resolution": "720P", "ratio": "16:9"}')
f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 brief")
p['prompt']=f.read_text(encoding="utf-8")
if not p['prompt'].strip():raise SystemExit("Brief must contain text")
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/videos/generations \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT

Receive and save results

Ailoot · Video

mp4

  • GET /v1/videos/{request_id}
  • GET /v1/videos/generations/{request_id}
  • GET /v1/videos/{request_id}/content
  • GET /v1/videos/generations/{request_id}/content
Check job status
GET status
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_OPERATION_ID:?Set the actual Ailoot operation ID returned by creation}"
export AILOOT_OPERATION_ID
operation_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ["AILOOT_OPERATION_ID"],safe=""))')
curl --fail-with-body --silent --show-error "https://api.ailoot.ai/v1/videos/generations/$operation_id" \
  -H "Authorization: Bearer $AILOOT_API_KEY" -o status.json
python3 - <<'PY_STATUS'
import json
from pathlib import Path
r=json.loads(Path("status.json").read_text())
print(json.dumps(r))
if r.get("status")=="completed":
    for x in r.get("data",[]):print(x)
PY_STATUS
Save all completed assets
GET all completed assets
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_STATUS_FILE:?Set the actual completed status JSON file}"
export AILOOT_STATUS_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
from urllib.parse import urlsplit,urljoin
f=Path(os.environ["AILOOT_STATUS_FILE"])
if not f.is_file():raise SystemExit("Choose the actual completed status file")
r=json.loads(f.read_text())
if r.get("status")!="completed" or not isinstance(r.get("data"),list) or not r["data"]:raise SystemExit("Wait for a completed status with asset paths")
urls=[]
for x in r["data"]:
    if not isinstance(x,str) or "\n" in x or "\r" in x:raise SystemExit("Invalid asset path")
    u=urljoin("https://api.ailoot.ai",x)
    z=urlsplit(u)
    if z.scheme!="https" or z.netloc!="api.ailoot.ai" or z.username or z.password:raise SystemExit("Use the actual Ailoot asset paths from status")
    urls.append(u)
Path("asset-urls.txt").write_text("\n".join(urls)+"\n")
PY_REQUEST
index=0
while IFS= read -r asset_url; do
  curl --fail-with-body --silent --show-error "$asset_url" \
    -H "Authorization: Bearer $AILOOT_API_KEY" -o "video-${index}.mp4"
  index=$((index + 1))
done < asset-urls.txt
Other content reads
GET content
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_OPERATION_ID:?Set the actual Ailoot operation ID returned by creation}"
export AILOOT_OPERATION_ID
operation_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ["AILOOT_OPERATION_ID"],safe=""))')
curl --fail-with-body --silent --show-error "https://api.ailoot.ai/v1/videos/generations/$operation_id/content" \
  -H "Authorization: Bearer $AILOOT_API_KEY" -o video.mp4
Keep all completed results

Save every completed video or returned file; retrieve every actual returned asset URL.

Preserve every returned data item/output index. content_url is first only; fetch every actual content path/asset. GETcontentwithoutindex isnotalloutputs.

If the original response needs checking

Read existing original job; never resubmit unknown send.

Response fields
FieldType
FieldidTypestring
FieldobjectTypestring
FieldmodelTypestring
FieldstatusTypestring
Fieldcontent_urlTypesigned URL
Fielddata[]Typesigned URL
FieldusageTypeobject
Fieldresult_pending_checkTypeboolean
Errors and next steps
ResponseConditionNext step
Response400 · invalid_request_errorConditionInvalid required fields, material representation or parameter valueNext stepCorrect the indicated fields before a new creation request.
Response409 · video_not_readyConditionOriginal result content is not yet availableNext stepPoll the original returned ID and respect Retry-After.
Responseserver_errorConditionThe returned response says the operation or result requires a checkNext stepKeep the original returned operation/task ID, request headers and response; continue supported reads of that original operation. Do not resubmit the creation request.

Aliases

Model aliases

Ailoot happyhorse-1.1-t2v, happyhorse-t2v, happyhorse-t2v-latest

Method path aliases

Use the method paths shown above.

Related caller IDs

happyhorse-1.1-t2v, happyhorse-t2v, happyhorse-t2v-latest

FAQ · happyhorse-1.1-t2v
What inputs and results are available?

POST /v1/videos/generations · happyhorse-1.1-t2v: text → video

POST /v1/videos/generations · happyhorse-t2v: text → video

POST /v1/videos/generations · happyhorse-t2v-latest: text → video

Which fields does the request use?

POST /v1/videos/generations · happyhorse-1.1-t2v: model, prompt, duration, resolution, ratio, image_urls

POST /v1/videos/generations · happyhorse-t2v: model, prompt, duration, resolution, ratio, image_urls

POST /v1/videos/generations · happyhorse-t2v-latest: model, prompt, duration, resolution, ratio, image_urls

What limits apply?

POST /v1/videos/generations · happyhorse-1.1-t2v: duration.minimum: 3; duration.maximum: 15

POST /v1/videos/generations · happyhorse-t2v: duration.minimum: 3; duration.maximum: 15

POST /v1/videos/generations · happyhorse-t2v-latest: duration.minimum: 3; duration.maximum: 15

More details

Connect Ailoot to Claude Code, OpenCode, Hermes or your own app.

The company and its project portfolio

The company and its project portfolio: millions of customers; monthly sales in the billions.

Buy tokens at a discount.

Subscription discounts for regular use. Promo codes offer up to 50% off token purchases.

Subscription
Choose a discounted plan for your regular requests.
Promo code: up to 50% off
Enter your code at checkout. The price updates to reflect the current promotion.
Spending in your history
The model, tokens and amount are recorded for each request.

Choose a subscription · View model prices

Connect the API to a product you sell.

Use Ailoot in SaaS, apps and bots under its official service offer and licence agreement. Request a reseller licence for resale.

Commercial application
Add text, image, video and audio generation to paid features in your service.
Reseller licence
Send a description of your project and how you provide access. Request written terms for use and resale.
Documents on the website
The service offer, licence agreement and data processing policy are available before you connect.

Request a reseller licence · Service offer and licence agreement