Перейти к основному содержанию

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!

Руководство по настройке

1

Создайте 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:
        error_msg = data.get('error', {}).get('message', 'Unknown error')
        print(f"Generation failed: {error_msg}")
        
    return jsonify({'status': 'received'}), 200
2

Передайте URL webhook

Укажите URL вашего webhook при создании задачи генерации.
curl -X POST https://platform.runblob.io/v1/veo/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"
  }'
3

Обработайте уведомления

Ваш эндпоинт получит мгновенное уведомление по готовности задачи.

Структура payload

Отправляется при успешной генерации видео.
{
  "generation_id": "ffd473d5-5bef-4e14-bf22-8d559be3c19f",
  "status": "completed",
  "prompt": "A cat playing with a ball in a sunny room",
  "video_url": "https://cdn.runblob.io/videos/your-video.mp4",
  "created_at": "2025-12-06T21:43:03.374000",
  "completed_at": "2025-12-06T21:44:06.143000",
  "seed": 319790131,
  "error": null
}
generation_id
string
UUID завершённой задачи
status
string
Всегда "completed" при успешной генерации
prompt
string
Исходный промпт для генерации
video_url
string
Прямая ссылка для скачивания готового видео
created_at
string
Временная метка создания задачи (ISO 8601)
completed_at
string
Временная метка завершения задачи (ISO 8601)
seed
number
Использованный seed
error
null
Всегда null при успешной генерации

Возможности надёжности

Политика повторов: до 5 попыток с интервалом 30 секундСтратегия задержки: линейная между повторамиОбработка отказа: после 5 неудачных попыток webhook помечается как failed
Тайм-аут запроса: 30 секунд на webhookТайм-аут соединения: 10 секунд для установления соединенияРекомендация: быстро отвечайте кодом 200
HTTPS обязателен: все URL webhook должны использовать HTTPSIP allowlist: рассмотрите ограничение доступа по IP RunBlobВалидация: всегда проверяйте generation_id в обработчике webhook

Примеры реализации

from flask import Flask, request, jsonify
import logging

app = Flask(__name__)
logging.basicConfig(level=logging.INFO)

@app.route('/webhook', methods=['POST'])
def runblob_webhook():
    try:
        data = request.json
        generation_id = data.get('generation_id')
        status = data.get('status')
        
        if 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:
            error = data.get('error', {})
            error_code = error.get('message', 'Unknown error')
            logging.error(f"Generation failed for {generation_id}: {error_code}")
            # Handle failure
            handle_failure(generation_id, error_code)
        
        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, error_code):
    # Your error handling logic here
    pass
Важно: всегда быстро возвращайте код 200, чтобы подтвердить получение. Тяжёлую обработку выполняйте асинхронно, чтобы избежать таймаутов.