Нарезка длинных видео на клипы
Длинное видео (стрим, подкаст, вебинар) → готовые вертикальные клипы с
субтитрами и постинг-паком. Тот же пайплайн, что в боте и веб-студии:
цена считается по факту длительности, при сбое оценка возвращается
полностью. Все вызовы — с заголовком X-API-Key: pp_..., кроме
скачивания файлов (там сама подписанная ссылка).
Базовый URL: https://api.piratepress.fun/public/v1.
Шаг 1. Оценить ссылку — POST /clips/probe
curl -X POST https://api.piratepress.fun/public/v1/clips/probe \
-H "X-API-Key: pp_..." \
-H "Content-Type: application/json" \
-d '{"url": "https://youtube.com/watch?v=..."}'
{ "duration_s": 3720.0, "title": "Подкаст про нейросети", "estimated_cost": 240 }
Это оценка: списание при заказе — по ней, а после нарезки считается
факт (разница возвращается на баланс или досписывается). Битая,
приватная или 18+ ссылка — 422 invalid_params, не 500.
Шаг 2. Заказать нарезку — POST /clips
Заголовок Idempotency-Key обязателен (без него 400, чужой ключ —
409 idempotency_conflict). Повтор со своим ключом вернёт исходный
заказ без повторного списания (200 вместо 201).
curl -X POST https://api.piratepress.fun/public/v1/clips \
-H "X-API-Key: pp_..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: clips-order-0001" \
-d '{
"source_url": "https://youtube.com/watch?v=...",
"estimated_seconds": 3720,
"lang": "ru",
"top_n": 5,
"captions": true,
"split_layout": 50,
"split_bottom_preset": "lofi_game",
"banner_asset_id": "ast_...",
"banner_rules": "показать 2 раза подряд с середины, с паузой"
}'
Тело (PublicClipOrderCreate):
| Поле | Тип | По умолчанию | Что значит |
|---|---|---|---|
source_url | string | — | Ссылка на видео (http/https, yt-dlp). Ровно один из source_url/source_asset_id обязателен |
source_asset_id | string | — | Источник из медиатеки (id из GET /assets) |
estimated_seconds | number | 0 | Подсказка длительности для превью цены (см. probe) |
lang | string | "en" | Язык субтитров и метаданных |
top_n | int 1–50 | все | Сколько лучших клипов вернуть |
captions | bool | true | Встроенные субтитры |
split_layout | 0/33/50/60 | 0 | Сплит-вью: % верхнего слота (контент + залипалка снизу) |
split_bottom_preset | string | — | Пресет для низа сплита (id из каталога генератора) |
smart_crop | bool | false | Умный кроп 3-слота для стримов; требует split_layout: 33 |
banner_asset_id | string | — | Готовый офферный баннер (ассет из медиатеки) поверх клипов |
banner_rules | string | — | Условия показа баннера текстом: тайминги, loops, расписание |
uniquify | off/soft/strong/custom | "off" | Уникализация клипов (анти-тень): незаметные правки кадра и звука против склейки дублей платформами. Доплата +30 🪙 при любом режиме ≠ off |
uniquify_opts | object | — | Обязателен при custom: тогглы mirror/speed/pitch/zoom/hue/grain (bool) |
variants | int 1–5 | 1 | Версий каждого клипа (clip_01.mp4, clip_01_v2.mp4…); +10 🪙 за каждую версию сверх первой |
resolution | string | "720x1280" | Вертикаль клипов: 720x1280 или 1080x1920 |
caption_font | string | — | Шрифт субтитров: имя пула (montserrat/inter/bebas/oswald/rubik/manrope/golos) или asset:<id> своего шрифта (ассет вида font) |
caption_color | string | — | Основной цвет субтитров, hex #RRGGBB |
caption_hot_color | string | — | Цвет текущего слова, hex |
caption_highlight_color | string | — | Цвет караоке-подсветки, hex |
caption_position | string | — | top/center/bottom |
Не передал caption-поля — применяется стиль аккаунта (шрифт/палитра юзера; у новых аккаунтов он генерируется случайно, чтобы клипы разных пользователей не выглядели штампованными).
Ответ 201:
{ "id": "ord_a1b2c3", "status": "queued", "cost": 240, "eta_seconds": 900 }
Заказ нарезки ест ту же квоту, что и ролики: 10 активных задач на ключ общих на всё (см. Коды ошибок).
Шаг 3. Забрать результат — GET /clips/{id}
curl https://api.piratepress.fun/public/v1/clips/ord_a1b2c3 \
-H "X-API-Key: pp_..."
По ходу работы в ответе stage/stage_detail («Резка клипов», «3/12»).
При status: "done":
{
"id": "ord_a1b2c3",
"status": "done",
"title": "Подкаст про нейросети",
"clips": [
{
"name": "clip_01.mp4",
"title": "Почему нейросети не заменят монтажёра",
"url": "https://api.piratepress.fun/public/v1/clips/files/eyJ...",
"description": "…",
"hashtags": ["нейросети", "подкаст"]
}
],
"zip_url": "https://api.piratepress.fun/public/v1/clips/files/eyJ...",
"estimated_cost": 240,
"actual_cost": 236,
"created_at": "2026-10-19T12:00:00Z",
"finished_at": "2026-10-19T12:20:00Z"
}
Статусы: queued|running|done|error|refunded. При error/refunded
оценка возвращена на баланс. Ссылки в url/zip_url — подписанные
(HMAC, TTL 7 дней), ключ для скачивания не нужен:
curl -L -o clips.zip "<zip_url>"
Не хочешь поллить — подпишись на clip.done/clip.error:
Вебхуки.
Список нарезок — GET /clips
curl "https://api.piratepress.fun/public/v1/clips?limit=20&offset=0" \
-H "X-API-Key: pp_..."
Новые первыми; в строке: id, статус, title, source_url, is_file, clips_count, cost (факт после done, до — оценка), created_at, error.
AI-баннер для нарезки
POST /clips/banner — генерирует баннер по описанию (цена как у
AI-баннера в генерации: триал/квота adveristor/дублоны):
curl -X POST https://api.piratepress.fun/public/v1/clips/banner \
-H "X-API-Key: pp_..." \
-H "Content-Type: application/json" \
-d '{"prompt": "баннер магазина наушников, неон, тёмный фон", "lang": "ru"}'
# → { "job_id": "ban_...", "cost": 50 }
GET /clips/banner/{job_id} — поллинг: при done в ответе asset_id
(ассет появился в медиатеке, его id передавай в banner_asset_id заказа
нарезки); при error дублоны рефандятся автоматически. Опционально в
теле source_asset_id — пак исходников из медиатеки для VIP-режима на
генераторе.
Куда дальше
- Быстрый старт — общий флоу заказа и статусов;
- Вебхуки —
clip.done/clip.errorвместо поллинга; - Коды ошибок — конверт
{error: {code, message}}.