HiAPI
  • Models
  • Pricing
Search

Search HiAPI models, tools, and resources.

  • Models
  • Pricing
HiAPI

One API, All AI Models

Generate images, video, and audio with leading models through one production-ready API.

Get a free API key

AI Image API

  • All image models
  • GPT Image 2
  • Nano Banana 2
  • Seedream 5.0 Pro
  • Qwen Image 2.0 Pro
  • FLUX 1.1 Pro

AI Video API

  • All video models
  • Seedance 2.5
  • FLUX.3 Video
  • Seedance 2.0
  • Veo 3.1
  • Kling 3.0

AI Audio API

  • All audio models
  • MiniMax Music 2.6
  • MiniMax Music 1.5
  • ElevenLabs v3
  • Text to music
  • Text to speech

Product

  • Model marketplace
  • Playground
  • Pricing
  • Image API Cost Calculator
  • Free GPT Image 2 Generator
  • Free Nano Banana Image Generator
  • Outfit Preview
  • Product Photo Lab

Developers

  • Documentation
  • API Reference
  • Agent Skills
  • LLM integration index
  • Blog

Company

  • About
  • Contact support
  • Terms of Service
  • Privacy Policy

© 2026 hiapi. All rights reserved.

Open source on GitHubPython SDK on PyPI
  • Turbo input schema
  • Minimal valid request
  • Python preflight validation
  • HTTP 400: the task was never created
  • TASK_FAILED: creation succeeded, rendering did not
  • Turbo pricing and model choice
  • FAQ
  • How many images does Kling 3.0 Turbo image-to-video accept?
  • What duration values are valid?
  • Does Turbo support 4K or sound?
  • What is the difference between HTTP 400 and TASK_FAILED?
  • Why does a public-looking image URL cause TASK_FAILED?
TutorialJul 11, 2026

Kling 3.0 Turbo Image-to-Video API: Schema, Limits and Python Errors

A version-specific reference for Turbo's single-image schema, 3-15 second limits, 720p/1080p tiers, and failure modes.

hiapiUpdated Aug 10, 2026kling-3.0-turboimage-to-videopython-errors

Latest models

Explore models

Contents
  • Turbo input schema
  • Minimal valid request
  • Python preflight validation
  • HTTP 400: the task was never created
  • TASK_FAILED: creation succeeded, rendering did not
  • Turbo pricing and model choice
  • FAQ
  • How many images does Kling 3.0 Turbo image-to-video accept?
  • What duration values are valid?
  • Does Turbo support 4K or sound?
  • What is the difference between HTTP 400 and TASK_FAILED?
  • Why does a public-looking image URL cause TASK_FAILED?

Generate it with HiAPI

Choose a model, enter your prompt, and see the result.

HiAPI Blog

Related articles

HiAPI

Generate it with HiAPI

kling-3.0-turbo/image-to-video has a small, strict schema: one public image URL, a required motion prompt, an integer duration from 3 to 15 seconds, and either 720p or 1080p output. This page is the version-specific reference for validating that payload and separating HTTP 400 errors from asynchronous TASK_FAILED results.

For the shared create, polling, callback, and download workflow, use the Kling Python task runner and Omni/Turbo chooser.

Turbo input schema

FieldTypeRequiredAccepted value
promptstringYesDescribe motion and camera behavior
image_urlsarray of stringsYesExactly one publicly reachable image URL
durationintegerNo3 through 15 seconds
resolutionstringNo720p or 1080p

Turbo does not accept sound, aspect_ratio, negative_prompt, seed, mode, or a second image URL. A strict schema rejects extra properties instead of silently ignoring them.

The input image determines the frame shape. Upload it to a public bucket or CDN before creating the task; localhost, private dashboards, and expired signed URLs cannot be fetched by the renderer.

Minimal valid request

curl -X POST https://api.hiapi.ai/v1/tasks \
  -H "Authorization: Bearer $HIAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "kling-3.0-turbo/image-to-video",
    "input": {
      "prompt": "The runner accelerates as the camera tracks from the side",
      "image_urls": ["https://cdn.example.com/first-frame.jpg"],
      "duration": 6,
      "resolution": "1080p"
    }
  }'

A successful response contains data.taskId. HTTP 200 confirms creation, not completion; the video render continues asynchronously.

Python preflight validation

Validate the constraints before the network call so obvious mistakes never create a task:

from urllib.parse import urlparse

import requests


def turbo_input(prompt: str, image_url: str, duration: int, resolution: str) -> dict:
    if not prompt.strip():
        raise ValueError("prompt is required")
    if type(duration) is not int or not 3 <= duration <= 15:
        raise ValueError("duration must be an integer from 3 to 15")
    if resolution not in {"720p", "1080p"}:
        raise ValueError("resolution must be 720p or 1080p")
    parsed = urlparse(image_url)
    if parsed.scheme not in {"http", "https"} or not parsed.netloc:
        raise ValueError("image_url must be a public HTTP(S) URL")

    return {
        "prompt": prompt,
        "image_urls": [image_url],
        "duration": duration,
        "resolution": resolution,
    }


payload = {
    "model": "kling-3.0-turbo/image-to-video",
    "input": turbo_input(
        prompt="The runner accelerates as the camera tracks from the side",
        image_url="https://cdn.example.com/first-frame.jpg",
        duration=6,
        resolution="1080p",
    ),
}

response = requests.post(
    "https://api.hiapi.ai/v1/tasks",
    headers={"Authorization": "Bearer sk-your-key"},
    json=payload,
    timeout=30,
)
response.raise_for_status()
task_id = response.json()["data"]["taskId"]
print(task_id)

This local check catches value shape, but it cannot prove that the remote image is publicly downloadable. The renderer performs that fetch after creation.

HTTP 400: the task was never created

An HTTP 400 response is synchronous schema validation. Typical causes are:

Invalid inputWhy it failsFix
"duration": "5"A string was sent instead of an integerSend 5
"duration": 20The maximum is 15Choose 3-15
Two image_urlsTurbo accepts exactly oneKeep only the starting frame
"resolution": "4K"Turbo supports 720p and 1080pUse 720p or 1080p, or choose Omni
"sound": truesound is not in the Turbo schemaRemove it or choose Omni
Missing promptTurbo requires a promptAdd a non-empty motion prompt

Because validation failed before creation, there is no task id to poll. Log the response body and request id, correct the payload, and submit a new request.

TASK_FAILED: creation succeeded, rendering did not

If POST /v1/tasks returned HTTP 200 and a task id, later failure belongs to the asynchronous task lifecycle. Treat it separately from a 400.

Common causes include:

  • the image URL requires cookies or an authorization header;
  • a signed image URL expired before the renderer fetched it;
  • the host blocks server-side fetching or redirects to an HTML page;
  • the file is corrupt or its media type does not match its contents;
  • the provider could not complete that render.

Record the task id, terminal error code and message, original input URL, and request time. Before retrying, verify that an unauthenticated server can fetch the image with a 2xx response and an image content type. Blindly retrying the same inaccessible URL only creates another failed task.

The generic Python guide contains the shared terminal-status loop and output download code; keeping it there avoids duplicating lifecycle logic on this version reference.

Turbo pricing and model choice

Current production rates are:

Turbo tierPrice per second5-second task
720p$0.130$0.65
1080p$0.160$0.80

Check the live pricing page before a large batch. Turbo's name describes the model variant; it is not a promise that every resolution is cheaper or that a task will meet a fixed render-time SLA.

Choose Omni instead when you need a last frame, audio, or 4K. For a single input frame at 720p or 1080p, benchmark both variants with your own motion prompts and judge output quality, queue time, and total cost.

FAQ

How many images does Kling 3.0 Turbo image-to-video accept?

Exactly one public image URL. A second image is a schema error; use Omni for first-and-last-frame control.

What duration values are valid?

Send an integer from 3 through 15. A quoted number such as "5" is a string and fails validation.

Does Turbo support 4K or sound?

No. This endpoint accepts 720p or 1080p and has no sound field. Use Omni when those capabilities are required.

What is the difference between HTTP 400 and TASK_FAILED?

HTTP 400 means no task was created because the request violated the schema. TASK_FAILED occurs after a valid create response, during input fetching or generation.

Why does a public-looking image URL cause TASK_FAILED?

The URL may depend on cookies, have an expired signature, block server fetches, or return HTML instead of image bytes. Test it without browser authentication before retrying.

Latest models

View all models
  • GPT Image 2From $0.007/image
  • Nano Banana 2From $0.051/image
  • Seedream 5.0 ProFrom $0.050/image
  • Seedance 2.5From $0.121/s

Explore models

TextImageVideoAudio
Back to blog
GPT Image 2From $0.007/image
Nano Banana 2From $0.051/image
Seedream 5.0 ProFrom $0.050/image
Seedance 2.5From $0.121/s
View all models
TextChat and reasoning
ImageGenerate and edit
VideoText and image to video
AudioSpeech and music
Start generating
View model pricing
View all articles
How to Use the flux-3 API for Text-to-Video, Audio, and Continuation

How to Use the flux-3 API for Text-to-Video, Audio, and Continuation

minimax-music-3 API: curl & Python Guide

minimax-music-3 API: curl & Python Guide

How to use grok-imagine-image-2.0/image-to-image via the hiapi API: curl, Python, and a working request

How to use grok-imagine-image-2.0/image-to-image via the hiapi API: curl, Python, and a working request

How to Use grok-imagine-image-2.0/text-to-image via the hiapi API: curl, Python, and a Working Request

How to Use grok-imagine-image-2.0/text-to-image via the hiapi API: curl, Python, and a Working Request

How to Use the qwen-image-3.0 API: curl, Python, and a Working Request

How to Use the qwen-image-3.0 API: curl, Python, and a Working Request

How to Use qwen-image-3.0-pro via the hiapi API: curl, Python, and a Working Request

How to Use qwen-image-3.0-pro via the hiapi API: curl, Python, and a Working Request

Start generating