Справочник API
Вебхуки
POST-уведомление о завершении генерации на ваш сервер — формат тела, проверка подписи HMAC-SHA256, сроки ответа и расписание повторных доставок.
Передайте webhook_url при отправке генерации, и когда задача завершится, Clipia отправит POST на этот адрес. Так не нужно опрашивать статус. Каждая доставка подписана HMAC-SHA256 секретом вашего ключа, а при сбое повторяется в течение примерно суток.
Требования к адресу
- Только
https://. Адреса во внутренних и частных сетях отклоняются при отправке с ошибкой400 webhook_url_invalid. - Редиректы не выполняются: ответ
3xxсчитается неуспешной доставкой.
Тело запроса
Успех:
{
"request_id": "764cabcf-b745-4b3e-ae38-1200304cf45b",
"status": "OK",
"payload": {
"model": "nano-banana-2",
"output": { "images": [{ "url": "https://media.clipia.ai/....webp" }] },
"cost": 12
}
}Ошибка генерации:
{
"request_id": "764cabcf-b745-4b3e-ae38-1200304cf45b",
"status": "ERROR",
"error": {
"code": "generation_failed",
"message": "Generation failed. Please retry or contact support."
}
}output зависит от типа модели: images: [{ url }], video: { url } или audio: { url, format? } вместе с audios: [{ url, format? }] (все варианты трека, первый совпадает с audio). error.code — из словаря ошибок генерации: generation_failed, content_moderated, model_unavailable и другие; незнакомый код обрабатывайте как generation_failed.
Тело вебхука короче ответа REST
В вебхуке нет original_url и thumbnail_url, а у изображений — только одна ссылка. Полный результат забирайте по GET /v1/requests/:id.
Свойство
Тип
Заголовки
Content-Type: application/json
X-Clipia-Webhook-Id: 1f2e3d4c-5b6a-7890-abcd-ef0123456789
X-Clipia-Timestamp: 1760011200
X-Clipia-Signature: t=1760011200,v1=5257a869e7...| Заголовок | Значение |
|---|---|
X-Clipia-Webhook-Id | идентификатор доставки, одинаковый во всех повторах |
X-Clipia-Timestamp | unix-время отправки этой попытки, в секундах |
X-Clipia-Signature | t=<timestamp>,v1=<hex HMAC-SHA256> |
Секрет подписи
Секрет свой у каждого API-ключа: вебхуки задач, отправленных этим ключом, подписываются им. Секрет показывается один раз при создании ключа в консоли разработчика. Истории доставок и повторной отправки в консоли нет. Если секрет потерян, создайте новый ключ и переключите на него интеграцию — см. «Управление ключами».
Проверка подписи
Подпись считается как HMAC_SHA256(secret, "{timestamp}.{raw_body}"). Проверяйте её по сырому телу запроса, до разбора JSON, сравнивайте в постоянном времени и отклоняйте доставки старше 5 минут. Проще всего взять готовую функцию из SDK.
import { verifyWebhookSignature } from 'clipia-ai/webhook';
// rawBody — исходные байты тела, не JSON.stringify(req.body)
const ok = verifyWebhookSignature({
secret: process.env.CLIPIA_WEBHOOK_SECRET!,
headers: req.headers,
body: rawBody,
toleranceSeconds: 300,
});
if (!ok) return res.status(401).end();Обе функции SDK возвращают true или false и не бросают исключений на испорченных заголовках.
Доставка и повторы
- Отвечайте кодом
2xxв течение 10 секунд. Тяжёлую обработку выполняйте после ответа. - Ответ не
2xx,3xxили таймаут считаются неуспехом. Доставка повторяется до 15 попыток в сумме. - Пауза между попытками растёт вдвое, начиная с 30 секунд, и не превышает 4 часов: 30 с, 1, 2, 4, 8, 16, 32 мин, 1 ч 04 мин, 2 ч 08 мин, затем по 4 часа — всего около 24 часов 15 минут с первой попытки. Отправка проверяется раз в 30 секунд, поэтому фактическая задержка может быть немного больше.
- После последней неудачи доставка помечается проваленной и больше не повторяется; запросить её заново нельзя. Если обработчик лежал дольше, заберите результат по
GET /v1/requests/:id— он хранится независимо от вебхука.
Обрабатывайте идемпотентно
Одна и та же доставка может прийти повторно, например если ваш ответ не дошёл. Дедуплицируйте по X-Clipia-Webhook-Id или request_id, прежде чем выполнять побочные действия.
В тестовом режиме вебхук тоже приходит и подписан так же — на нём удобно проверить обработчик. Тестовому ключу отправляется не больше одной доставки в минуту: остальные за эту минуту не создаются, а неудачная доставка повторяется не дальше трёх попыток.
Идемпотентность
Заголовок Idempotency-Key делает повтор отправки генерации безопасным — тот же запрос вернёт тот же request_id без второй задачи и второго списания.
Лимиты
Лимиты Clipia API — 120 запросов в минуту на ключ и 600 на аккаунт, заголовки RateLimit-*, ответ 429, лимит параллельных генераций и LLM-лимиты.