Installs into .claude/skills of the current project.
Are you the author of Klingai Hello World?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/jeremylongshore-klingai-hello-world-1ea3bf86)
---
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 <jeremy@intentsolutions.io>
tags:
- saas
- kling-ai
- quickstart
compatibility: Designed for Claude Code
---
# 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)
## Instructions
1. Run the first request in a sandbox using a synthetic or rights-cleared brief and an approved credit cap; never paste credentials into code or logs.
2. Request one watermarked, draft-only canary and verify the task state, policy outcome, rights status, and destination before review.
3. Cancel and remove the draft if quality, policy, attribution, or budget checks fail; do not publish from the smoke test.
4. Record only a redacted receipt and delete temporary assets at the approved retention boundary.
## Output
Produce a first-render receipt with environment, brief classification, model/mode, duration, credit estimate, task state, policy/rights checks, draft-only assertion, owner, and cleanup reference. Exclude prompts, asset URLs, identities, and secrets.
## Error Handling
| Condition | Response |
|---|---|
| Policy, rights, or attribution concern | Cancel the task, delete the draft, and route a redacted record for owner review. |
| Budget or task-state anomaly | Pause further submissions and restore the approved test configuration. |
## Examples
`env=sandbox; brief=synthetic-sky; mode=standard; duration=5s; policy=pass; destination=draft-only; cleanup=24h` is an acceptable first canary.
## 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)