Скачать готовое видео
/v1/videos/{job_id}/contentОтдаёт сами байты ролика — MP4 потоком через шлюз, не редирект.
Запрос
job_idstringpathобязательноvid_…iintegerquery= 00Ответы
200
HTTP/1.1 200 OK
content-type: video/mp4
<байты MP4 — тело файла, не JSON>Подробности
Нужен ключ в заголовке Authorization: Bearer или x-api-key.
Это те самые ссылки, которые приходят в data у завершённой джобы, и открыть их может любой ключ того же аккаунта. Ответ — 200 с Content-Type: video/mp4 и телом-файлом: шлюз качает ролик у провайдера и переливает его тебе. Редиректа нет намеренно — хост, с которого мы берём видео, наружу не показывается, а значит и ссылка на него никому не достанется. Из того же принципа хост результата сверяется с allowlist перед скачиванием, а статус апстрима проверяется ДО начала стрима: иначе клиент получил бы 200, умирающий на середине тела.
Один запрос — один ролик. Когда джоба вернула несколько (сториборд, мульти-аутпут), в data лежат ссылки с ?i=0, ?i=1, … — брать их оттуда, а не собирать руками.
Про срок жизни. У видео в строке джобы лежит ссылка провайдера, а не наши байты, поэтому ретеншен её не обнуляет — переносить ему тут нечего, он только проставляет строке archived_at, чтобы та ушла из очереди кандидатов. У видео этот штамп означает ровно «ретеншен закончил с этой строкой», а не «байты уехали». Из этого не следует, что ролик будет доступен вечно: живёт он на стороне провайдера, и его срок кодом не проверяется и нами не гарантируется. Скачивай сразу, как получил.
Одинаковый 404 на все случаи — джобы нет, она чужая, ещё не завершена, результат уже не хранится, индекс i за пределами набора, хост результата не в allowlist — сделан намеренно: разные ответы рассказали бы про чужие джобы. 502 проверяется до начала стрима, поэтому это честная ошибка, а не обрыв посреди файла; деньги при этом не при чём — джоба уже оплачена.