--- name: klingai-hello-world description: 'Create your first Kling AI video generation with a minimal working example. Use when learning Kling AI or testing your setup. Trigger with phrases like ''kling ai hello world'', ''first kling video'', ''klingai quickstart'', ''test klingai''. ' allowed-tools: Read, Write, Edit, Bash(npm:*), Grep version: 1.18.0 license: MIT author: Jeremy Longshore tags: - saas - kling-ai - quickstart compatibility: Designed for Claude Code, also compatible with Codex and OpenClaw --- # Kling AI Hello World ## Overview Generate your first AI video in under 20 lines of code. This skill walks through the complete create-poll-download cycle using the Kling AI REST API. **Base URL:** `https://api.klingai.com/v1` ## Prerequisites - Completed `klingai-install-auth` setup - Python 3.8+ with `requests` and `PyJWT` - At least 10 credits in your Kling AI account ## Minimal Example — Python ```python import jwt, time, os, requests # --- Auth --- def get_token(): ak = os.environ["KLING_ACCESS_KEY"] sk = os.environ["KLING_SECRET_KEY"] payload = {"iss": ak, "exp": int(time.time()) + 1800, "nbf": int(time.time()) - 5} return jwt.encode(payload, sk, algorithm="HS256", headers={"alg": "HS256", "typ": "JWT"}) BASE = "https://api.klingai.com/v1" HEADERS = {"Authorization": f"Bearer {get_token()}", "Content-Type": "application/json"} # --- Step 1: Create task --- task = requests.post(f"{BASE}/videos/text2video", headers=HEADERS, json={ "model_name": "kling-v2-master", "prompt": "A golden retriever running through autumn leaves in slow motion, cinematic lighting", "duration": "5", "aspect_ratio": "16:9", "mode": "standard", }).json() task_id = task["data"]["task_id"] print(f"Task created: {task_id}") # --- Step 2: Poll until complete --- import time as t while True: t.sleep(10) status = requests.get(f"{BASE}/videos/text2video/{task_id}", headers=HEADERS).json() state = status["data"]["task_status"] print(f"Status: {state}") if state == "succeed": video_url = status["data"]["task_result"]["videos"][0]["url"] print(f"Video ready: {video_url}") break elif state == "failed": print(f"Failed: {status['data']['task_status_msg']}") break ``` ## Minimal Example — Node.js ```javascript import jwt from "jsonwebtoken"; const BASE = "https://api.klingai.com/v1"; function getHeaders() { const token = jwt.sign( { iss: process.env.KLING_ACCESS_KEY, exp: Math.floor(Date.now() / 1000) + 1800, nbf: Math.floor(Date.now() / 1000) - 5 }, process.env.KLING_SECRET_KEY, { algorithm: "HS256", header: { typ: "JWT" } } ); return { Authorization: `Bearer ${token}`, "Content-Type": "application/json" }; } // Create task const res = await fetch(`${BASE}/videos/text2video`, { method: "POST", headers: getHeaders(), body: JSON.stringify({ model_name: "kling-v2-master", prompt: "A golden retriever running through autumn leaves in slow motion", duration: "5", aspect_ratio: "16:9", mode: "standard", }), }); const { data } = await res.json(); console.log(`Task: ${data.task_id}`); // Poll const poll = setInterval(async () => { const r = await fetch(`${BASE}/videos/text2video/${data.task_id}`, { headers: getHeaders() }); const s = await r.json(); if (s.data.task_status === "succeed") { console.log("Video:", s.data.task_result.videos[0].url); clearInterval(poll); } else if (s.data.task_status === "failed") { console.error("Failed:", s.data.task_status_msg); clearInterval(poll); } }, 10000); ``` ## Response Shape ```json { "code": 0, "message": "success", "data": { "task_id": "abc123...", "task_status": "succeed", "task_result": { "videos": [{ "id": "vid_001", "url": "https://cdn.klingai.com/...", "duration": "5.0" }] } } } ``` ## Task Status Values | Status | Meaning | |--------|---------| | `submitted` | Task queued, waiting for processing | | `processing` | Video generation in progress | | `succeed` | Complete — video URL available | | `failed` | Generation failed — check `task_status_msg` | ## Common First-Run Issues | Problem | Fix | |---------|-----| | `401` response | JWT token expired or AK/SK wrong | | `task_status: failed` | Prompt too vague — add visual detail | | Empty `videos` array | Task still processing — poll longer | | Slow generation | Standard mode takes 60-120s; use `mode: "standard"` for first test | ## Cost - 5-second standard video = 10 credits - Free tier: 66 credits/day (refreshes daily, no rollover) ## Resources - [Kling AI Text-to-Video API](https://app.klingai.com/global/dev/document-api/apiReference/model/textToVideo) - [Developer Portal](https://app.klingai.com/global/dev)