Скачать готовое видео

GET/v1/videos/{job_id}/content

Отдаёт сами байты ролика — MP4 потоком через шлюз, не редирект.

Запрос

job_idstringpathобязательно
id завершённой джобы — vid_…
iintegerquery= 0
какой из роликов джобы отдать; нечисловое значение — 0

Ответы

200

HTTP/1.1 200 OK
content-type: video/mp4

<байты MP4 — тело файла, не JSON>

ключа нет в заголовке или он не наш

{ "error": { "message": "...", "type": "...", "code": "PROVIDER_CODE" } }

нечего отдать или отдавать не тебе: джобы нет, она чужая или не завершена

{ "error": { "message": "...", "type": "...", "code": "PROVIDER_CODE" } }

источник, откуда шлюз берёт ролик, недоступен или ответил не 200

{ "error": { "message": "...", "type": "...", "code": "PROVIDER_CODE" } }
Подробности

Нужен ключ в заголовке Authorization: Bearer или x-api-key.

Это те самые ссылки, которые приходят в data у завершённой джобы, и открыть их может любой ключ того же аккаунта. Ответ — 200 с Content-Type: video/mp4 и телом-файлом: шлюз качает ролик у провайдера и переливает его тебе. Редиректа нет намеренно — хост, с которого мы берём видео, наружу не показывается, а значит и ссылка на него никому не достанется. Из того же принципа хост результата сверяется с allowlist перед скачиванием, а статус апстрима проверяется ДО начала стрима: иначе клиент получил бы 200, умирающий на середине тела.

Один запрос — один ролик. Когда джоба вернула несколько (сториборд, мульти-аутпут), в data лежат ссылки с ?i=0, ?i=1, … — брать их оттуда, а не собирать руками.

Про срок жизни. У видео в строке джобы лежит ссылка провайдера, а не наши байты, поэтому ретеншен её не обнуляет — переносить ему тут нечего, он только проставляет строке archived_at, чтобы та ушла из очереди кандидатов. У видео этот штамп означает ровно «ретеншен закончил с этой строкой», а не «байты уехали». Из этого не следует, что ролик будет доступен вечно: живёт он на стороне провайдера, и его срок кодом не проверяется и нами не гарантируется. Скачивай сразу, как получил.

Одинаковый 404 на все случаи — джобы нет, она чужая, ещё не завершена, результат уже не хранится, индекс i за пределами набора, хост результата не в allowlist — сделан намеренно: разные ответы рассказали бы про чужие джобы. 502 проверяется до начала стрима, поэтому это честная ошибка, а не обрыв посреди файла; деньги при этом не при чём — джоба уже оплачена.

Примеры кода
curl https://api.teamtoken.store/v1/videos/vid_9f1c4a2b7e0d4f5a8c3b6d1e2f0a7b4c/content \
  -H "Authorization: Bearer sk-…" \
  -o out.mp4
Запрос
https://api.teamtoken.store/v1

Панель отправляет запрос с этого домена; в своём коде используйте адрес выше.

Ключ никуда не сохраняется: он живёт в этой вкладке до перезагрузки страницы.

id завершённой джобы — vid_…

какой из роликов джобы отдать; нечисловое значение — 0

Запрос уйдёт по-настоящему, но сам вызов денег не стоит: за чтение баланса, каталога или статуса джобы не тарифицируют.

Ответ

Нажмите «Отправить запрос» выше — и здесь появится ответ.