Documentation Index Fetch the complete documentation index at: https://docs.runblob.io/llms.txt
Use this file to discover all available pages before exploring further.
Webhooks доставляют мгновенные уведомления о завершении или ошибке генерации видео. Без polling!
Руководство по настройке
Создайте webhook-эндпоинт
Поднимите HTTPS-эндпоинт, принимающий POST-запросы. from flask import Flask, request, jsonify
app = Flask( __name__ )
@app.route ( '/webhook' , methods = [ 'POST' ])
def handle_webhook ():
data = request.json
if data[ 'status' ] == 'completed' :
print ( f "Video ready: { data[ 'video_url' ] } " )
else :
print ( f "Generation failed: { data[ 'generation_id' ] } " )
return jsonify({ 'status' : 'received' }), 200
Передайте URL webhook
Укажите URL вашего webhook при создании задачи. curl -X POST https://platform.runblob.io/v1/kling/generate \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "A sunset over mountains",
"callback_url": "https://your-app.com/webhook"
}'
Обработайте уведомления
Ваш эндпоинт получит мгновенное уведомление по готовности задачи.
Структура payload
Отправляется при успешной генерации. {
"generation_id" : "550e8400-e29b-41d4-a716-446655440000" ,
"status" : "completed" ,
"video_url" : "https://cdn.runblob.io/videos/550e8400.mp4" ,
"completed_at" : "2025-11-22T10:32:15Z"
}
Всегда "completed" при успехе
Прямая ссылка для скачивания видео
Время завершения в ISO 8601
Отправляется при ошибке генерации. {
"generation_id" : "550e8400-e29b-41d4-a716-446655440000" ,
"status" : "failed" ,
"completed_at" : "2025-11-22T10:31:00Z"
}
Всегда "failed" при ошибке
Возможности надёжности
Политика повторов: до 5 попыток с экспоненциальной задержкойЗадержки: 30 секунд, 60 секунд, 120 секунд, 240 секунд, 480 секундОбработка отказа: после 5 попыток webhook помечается как failed
Тайм-аут запроса: 30 секунд на webhookТайм-аут соединения: 10 секундРекомендация: быстро отвечайте кодом 200
HTTPS обязателен: URL webhook должен использовать HTTPSIP allowlist: рассмотрите ограничение по IP RunBlobВалидация: всегда проверяйте generation_id в обработчике
Примеры реализации
from flask import Flask, request, jsonify
import logging
app = Flask( __name__ )
logging.basicConfig( level = logging. INFO )
@app.route ( '/webhook' , methods = [ 'POST' ])
def kling_webhook ():
try :
data = request.json
generation_id = data.get( 'generation_id' )
if data.get( 'status' ) == 'completed' :
video_url = data.get( 'video_url' )
logging.info( f "Video ready for { generation_id } : { video_url } " )
# Process successful generation
process_video(generation_id, video_url)
else :
logging.error( f "Generation failed for { generation_id } " )
# Handle failure
handle_failure(generation_id)
return jsonify({ 'status' : 'received' }), 200
except Exception as e:
logging.error( f "Webhook error: { str (e) } " )
return jsonify({ 'error' : 'Internal error' }), 500
def process_video ( generation_id , video_url ):
# Your video processing logic here
pass
def handle_failure ( generation_id ):
# Your error handling logic here
pass
Важно: всегда быстро возвращайте код 200, чтобы подтвердить получение. Тяжёлую обработку выполняйте асинхронно.