klingai-webhook-config
Replaces polling with event-driven webhooks for Kling AI task completion notifications.
Install
mkdir -p .claude/skills/klingai-webhook-config && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/8776" && unzip -o skill.zip -d .claude/skills/klingai-webhook-config && rm skill.zipInstalls to .claude/skills/klingai-webhook-config
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Configure webhook callbacks for Kling AI task completion. Use when buildingKey capabilities
- →Configure webhook callback URLs for task completion
- →Handle asynchronous task result notifications
- →Implement webhook reliability patterns with polling fallback
- →Process task success and failure events
How it works
The user provides a callback URL during task creation, and the Kling AI API sends a POST request to that URL once the generation task reaches a terminal state.
Inputs & outputs
When to use klingai-webhook-config
- →Implement webhook notification handlers
- →Transition from polling to event-driven updates
- →Process video completion events
- →Configure task callbacks
About this skill
Kling AI Webhook Configuration
Overview
Instead of polling task status, pass a callback_url when creating a task. Kling AI will POST the completed task result to your URL when generation finishes. This eliminates polling overhead and reduces API calls.
Supported on: All video generation endpoints (text2video, image2video, video-extend, lip-sync, effects)
How It Works
- Include
callback_urlin your task creation request - Kling queues the task normally
- When task reaches terminal state (
succeedorfailed), Kling POSTs the full result to your URL - Your webhook handler processes the result
Sending a Task with Callback
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 task with callback
response = requests.post(f"{BASE}/videos/text2video", headers=get_headers(), json={
"model_name": "kling-v2-master",
"prompt": "A futuristic city skyline at night with neon lights",
"duration": "5",
"mode": "standard",
"callback_url": "https://your-app.com/webhooks/kling", # your endpoint
})
task_id = response.json()["data"]["task_id"]
print(f"Task {task_id} submitted with callback -- no polling needed")
Webhook Receiver (Flask)
from flask import Flask, request, jsonify
import hmac
import hashlib
import json
app = Flask(__name__)
@app.route("/webhooks/kling", methods=["POST"])
def kling_webhook():
payload = request.get_json()
task_id = payload["data"]["task_id"]
status = payload["data"]["task_status"]
if status == "succeed":
video_url = payload["data"]["task_result"]["videos"][0]["url"]
print(f"Task {task_id} complete: {video_url}")
# Download video, store to S3, notify user, etc.
process_completed_video(task_id, video_url)
elif status == "failed":
error = payload["data"].get("task_status_msg", "Unknown error")
print(f"Task {task_id} failed: {error}")
handle_failure(task_id, error)
return jsonify({"received": True}), 200
Webhook Receiver (Express.js)
import express from "express";
const app = express();
app.use(express.json());
app.post("/webhooks/kling", (req, res) => {
const { data } = req.body;
const { task_id, task_status } = data;
if (task_status === "succeed") {
const videoUrl = data.task_result.videos[0].url;
console.log(`Task ${task_id} complete: ${videoUrl}`);
processVideo(task_id, videoUrl);
} else if (task_status === "failed") {
console.error(`Task ${task_id} failed: ${data.task_status_msg}`);
}
res.json({ received: true });
});
app.listen(3000);
Callback Payload Shape
{
"code": 0,
"message": "success",
"data": {
"task_id": "abc123...",
"task_status": "succeed",
"task_status_msg": "",
"task_result": {
"videos": [{
"id": "vid_001",
"url": "https://cdn.klingai.com/...",
"duration": "5.0"
}]
}
}
}
Webhook Reliability Pattern
import time
from collections import defaultdict
class WebhookManager:
"""Track webhook delivery and fall back to polling on failure."""
def __init__(self, poll_fallback_sec: int = 300):
self.pending = {} # task_id -> submission_time
self.poll_fallback_sec = poll_fallback_sec
def register(self, task_id: str):
self.pending[task_id] = time.time()
def mark_received(self, task_id: str):
self.pending.pop(task_id, None)
def get_stale_tasks(self) -> list:
"""Tasks that haven't received a callback within threshold."""
now = time.time()
return [tid for tid, submitted in self.pending.items()
if now - submitted > self.poll_fallback_sec]
def fallback_poll(self, client):
"""Poll stale tasks that missed their callback."""
for task_id in self.get_stale_tasks():
try:
result = client._get(f"/videos/text2video/{task_id}")
status = result["data"]["task_status"]
if status in ("succeed", "failed"):
self.mark_received(task_id)
return result
except Exception:
pass
Requirements for Your Webhook Endpoint
| Requirement | Detail |
|---|---|
| Protocol | HTTPS only |
| Response | Return 2xx within 5 seconds |
| Availability | Must be publicly reachable |
| Idempotency | Handle duplicate deliveries gracefully |
| Timeout | Kling retries on timeout, so process async |
Resources
When not to use it
- →Applications requiring synchronous task results
- →Environments without publicly reachable endpoints
Prerequisites
Limitations
- →Endpoint must respond with 2xx within 5 seconds
- →Requires HTTPS protocol
How it compares
This approach replaces constant status polling with event-driven notifications, reducing API overhead and latency.
Compared to similar skills
klingai-webhook-config side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| klingai-webhook-config (this skill) | 0 | 27d | Caution | Intermediate |
| telegram-bot-builder | 106 | 6mo | Review | Intermediate |
| reddit-api | 3 | 4mo | Review | Intermediate |
| hugging-face-tool-builder | 7 | 6mo | Review | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by jeremylongshore
View all by jeremylongshore →You might also like
telegram-bot-builder
davila7
Expert in building Telegram bots that solve real problems - from simple automation to complex AI-powered bots. Covers bot architecture, the Telegram Bot API, user experience, monetization strategies, and scaling bots to thousands of users. Use when: telegram bot, bot api, telegram automation, chat bot telegram, tg bot.
reddit-api
alinaqi
Reddit API with PRAW (Python) and Snoowrap (Node.js)
hugging-face-tool-builder
patchy631
Use this skill when the user wants to build tool/scripts or achieve a task where using data from the Hugging Face API would help. This is especially useful when chaining or combining API calls or the task will be repeated/automated. This Skill creates a reusable script to fetch, enrich or process data.
klingai-rate-limits
jeremylongshore
Handle Kling AI rate limits with proper backoff strategies. Use when experiencing 429 errors or building high-throughput systems. Trigger with phrases like 'klingai rate limit', 'kling ai 429', 'klingai throttle', 'klingai backoff'.
juicebox-install-auth
jeremylongshore
Install and configure Juicebox SDK/CLI authentication. Use when setting up a new Juicebox integration, configuring API keys, or initializing Juicebox in your project. Trigger with phrases like "install juicebox", "setup juicebox", "juicebox auth", "configure juicebox API key".
superpowers-python-automation
anthonylee991
Implements reliable automations in Python for REST APIs: httpx/requests patterns, retries, timeouts, pagination, typing, config, logging, and tests. Use when writing Python scripts/services that call external APIs.