Kling AI Text-to-Video
Overview
Generate videos from text prompts using the /v1/videos/text2video endpoint. Supports models v1 through v2.6, standard/professional modes, camera control, negative prompts, and native audio (v2.6+).
Endpoint: POST https://api.klingai.com/v1/videos/text2video
Request Parameters
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| model_name | string | Yes | Model version (see model catalog) |
| prompt | string | Yes | Video description, max 2500 chars |
| negative_prompt | string | No | What to exclude from generation |
| duration | string | Yes | "5" or "10" seconds |
| aspect_ratio | string | No | "16:9" (default), "9:16", "1:1", etc. |
| mode | string | No | "standard" (default) or "professional" |
| cfg_scale | float | No | Prompt adherence (0.0-1.0, default 0.5) |
| camera_control | object | No | Camera movement config |
| callback_url | string | No | Webhook URL for completion notification |
Complete Example — Python
import jwt, time, os, requests
BASE = "https://api.klingai.com/v1"
def get_headers():
ak, sk = os.environ["KLING_ACCESS_KEY"], os.environ["KLING_SECRET_KEY"]
token = jwt.encode(
{"iss": ak, "exp": int(time.time()) + 1800, "nbf": int(time.time()) - 5},
sk, algorithm="HS256", headers={"alg": "HS256", "typ": "JWT"}
)
return {"Authorization": f"Bearer {token}", "Content-Type": "application/json"}
# Create text-to-video task
response = requests.post(f"{BASE}/videos/text2video", headers=get_headers(), json={
"model_name": "kling-v2-6",
"prompt": "Aerial drone shot of a coral reef at golden hour, "
"tropical fish swimming through crystal clear water, "
"sun rays penetrating the surface, cinematic 4K",
"negative_prompt": "blurry, low quality, distorted, watermark",
"duration": "5",
"aspect_ratio": "16:9",
"mode": "professional",
"cfg_scale": 0.5,
})
task = response.json()
task_id = task["data"]["task_id"]
# Poll for completion
while True:
time.sleep(15)
result = requests.get(
f"{BASE}/videos/text2video/{task_id}", headers=get_headers()
).json()
status = result["data"]["task_status"]
if status == "succeed":
video = result["data"]["task_result"]["videos"][0]
print(f"Video URL: {video['url']}")
print(f"Duration: {video['duration']}s")
break
elif status == "failed":
raise RuntimeError(result["data"]["task_status_msg"])
# else: submitted/processing — keep polling
With Camera Control
# Camera movement types: pan, tilt, zoom, roll
response = requests.post(f"{BASE}/videos/text2video", headers=get_headers(), json={
"model_name": "kling-v2-6",
"prompt": "A medieval castle on a cliff at sunrise, fog in the valley",
"duration": "5",
"mode": "standard",
"camera_control": {
"type": "simple",
"config": {
"horizontal": 5, # pan right (negative = left), range -10 to 10
"vertical": 0, # tilt (negative = down, positive = up)
"zoom": 3, # zoom in (positive) or out (negative)
"roll": 0, # rotation
"pan": 0, # dolly left/right
"tilt": -2, # dolly up/down
}
},
})
Rule: Only one non-zero field in config for type: "simple".
With Native Audio (v2.6 only)
response = requests.post(f"{BASE}/videos/text2video", headers=get_headers(), json={
"model_name": "kling-v2-6",
"prompt": "A jazz band performing in a dimly lit club, saxophone solo, "
"audience clapping, warm amber lighting",
"duration": "10",
"mode": "professional",
"motion_has_audio": True, # generates synchronized audio
})
Prompt Engineering Tips
| Technique | Example | |-----------|---------| | Scene + action + style | "A samurai walking through cherry blossoms, cinematic slow motion" | | Lighting cues | "golden hour", "neon-lit", "overcast diffused light" | | Camera language | "close-up", "wide establishing shot", "tracking shot" | | Negative prompt | "blurry, watermark, text overlay, distorted faces" | | Material/texture | "brushed steel", "hand-painted watercolor", "photorealistic" |
Cost Reference
| Duration | Standard | Professional | |----------|----------|-------------| | 5 seconds | 10 credits | 35 credits | | 10 seconds | 20 credits | 70 credits |
Error Handling
| Error | Cause | Fix |
|-------|-------|-----|
| 400 invalid prompt | Empty or >2500 chars | Check prompt length |
| 400 invalid model | Unsupported model_name | Use valid model ID from catalog |
| 402 insufficient credits | Not enough credits | Top up account |
| task_status: failed | Content policy violation or complexity | Simplify prompt, remove restricted content |