Tarefas

GET /api/v1/tasks/{id}, /tasks/{id}/events e /tasks — confira o status de uma tarefa, acompanhe o progresso em streaming e baixe o resultado.

Consultar uma tarefa

GET https://videoupscaler.co/api/v1/tasks/{id}

Retorna a tarefa com o status mais recente. Consulte a cada 5–10 segundos enquanto ela estiver queued ou processing. Vídeos mais longos e resoluções mais altas demoram mais.

curl https://videoupscaler.co/api/v1/tasks/0b6f3c1e-8a52-5d1e-9c43-3f1d2e7a9b10 \
  -H "Authorization: Bearer $VIDEOUPSCALER_API_KEY"
{
  "id": "0b6f3c1e-8a52-5d1e-9c43-3f1d2e7a9b10",
  "status": "completed",
  "resolution": "2k",
  "video_url": "https://example.com/clip.mp4",
  "duration_seconds": 12.4,
  "processed_seconds": 12.4,
  "credits_charged": 26,
  "watermark": false,
  "output_url": "https://…/clip_upscaled.mp4",
  "thumbnail_url": "https://…/clip_first_frame.jpg",
  "error": null,
  "created_at": "2026-09-30T08:00:00.000Z",
  "updated_at": "2026-09-30T08:03:41.000Z"
}

Uma tarefa que não existe, ou que pertence a outra conta, retorna 404 not_found.

Exemplo de polling

async function waitForTask(id) {
  while (true) {
    const res = await fetch(`https://videoupscaler.co/api/v1/tasks/${id}`, {
      headers: { Authorization: `Bearer ${process.env.VIDEOUPSCALER_API_KEY}` },
    });
    const task = await res.json();
    if (task.status === 'completed') return task.output_url;
    if (task.status === 'failed') throw new Error(task.error);
    await new Promise((r) => setTimeout(r, 8000));
  }
}

Eventos da tarefa em streaming

GET https://videoupscaler.co/api/v1/tasks/{id}/events

Em vez de fazer polling, você pode manter uma conexão aberta e receber o progresso da tarefa como Server-Sent Events. A requisição responde com um redirecionamento 302 para uma URL de stream assinada; clientes SSE seguem o redirecionamento automaticamente (no curl, adicione -L). A URL assinada já concede o acesso, então sua chave de API não é enviada para ela.

EventoDadosQuando
status{"id": "…", "status": "queued"}O job está aguardando uma GPU (queued) ou em execução (processing). Enviado quando o status muda.
completedA tarefa completaO resultado está pronto. Em seguida o stream é encerrado.
failedA tarefa completaO processamento falhou e os créditos foram reembolsados. Em seguida o stream é encerrado.
timeout{"id": "…"}O stream é encerrado após 10 minutos. Abra /events de novo se a tarefa ainda estiver em execução.

Os dados de completed e failed são exatamente o que GET /tasks/{id} retorna. Se você abrir o stream de uma tarefa que já terminou, o evento correspondente é enviado na hora.

curl -N -L https://videoupscaler.co/api/v1/tasks/TASK_ID/events \
  -H "Authorization: Bearer $VIDEOUPSCALER_API_KEY"
event: status
data: {"id":"0b6f3c1e-…","status":"queued"}

event: status
data: {"id":"0b6f3c1e-…","status":"processing"}

event: completed
data: {"id":"0b6f3c1e-…","status":"completed","output_url":"https://…","…":"…"}
// npm install eventsource
import { EventSource } from 'eventsource';

const events = new EventSource(`https://videoupscaler.co/api/v1/tasks/${taskId}/events`, {
  fetch: (url, init) =>
    fetch(url, {
      ...init,
      headers: { ...init.headers, Authorization: `Bearer ${process.env.VIDEOUPSCALER_API_KEY}` },
    }),
});
events.addEventListener('status', (e) => console.log(JSON.parse(e.data).status));
events.addEventListener('completed', (e) => {
  console.log('done:', JSON.parse(e.data).output_url);
  events.close();
});
events.addEventListener('failed', (e) => {
  console.error(JSON.parse(e.data).error);
  events.close();
});
# pip install httpx httpx-sse
import json, os, httpx
from httpx_sse import connect_sse

headers = {"Authorization": f"Bearer {os.environ['VIDEOUPSCALER_API_KEY']}"}
url = f"https://videoupscaler.co/api/v1/tasks/{task_id}/events"
with httpx.Client(follow_redirects=True, timeout=None) as client:
    with connect_sse(client, "GET", url, headers=headers) as source:
        for event in source.iter_sse():
            task = json.loads(event.data)
            print(event.event, task["status"])
            if event.event in ("completed", "failed", "timeout"):
                break

Fazer polling em GET /tasks/{id} dá o mesmo resultado; use o que se encaixar melhor no seu código.

Listar tarefas

GET https://videoupscaler.co/api/v1/tasks?limit=20&page=1
ParâmetroPadrãoDescrição
limit20Tarefas por página, 1–100
page1Número da página, começando em 1

Retorna as tarefas das mais recentes para as mais antigas. A lista também inclui as tarefas criadas no site.

{
  "data": [{ "id": "…", "status": "completed", "…": "…" }],
  "page": 1,
  "limit": 20,
  "total": 42,
  "has_more": true
}

O objeto task

CampoTipoDescrição
idstringID da tarefa
statusstringqueued, processing, completed ou failed
resolutionstring1080p, 2k ou 4k
video_urlstringO vídeo que você enviou
duration_secondsnumberDuração do vídeo de entrada, lida do arquivo
processed_secondsnumberQuantos segundos passam pelo upscale. Igual a duration_seconds em tarefas da API; só é menor em tarefas criadas no site enquanto a conta era gratuita.
credits_chargedintegerCréditos cobrados por esta tarefa (reembolsados se ela falhar)
watermarkbooleanSe o resultado tem marca d'água. Sempre false em tarefas da API; true só em tarefas criadas no site enquanto a conta era gratuita.
output_urlstring | nullO vídeo com upscale, quando completed
thumbnail_urlstring | nullPrimeiro quadro do resultado, quando completed
errorstring | nullMotivo da falha, quando failed
created_atstringData e hora em ISO 8601
updated_atstringData e hora em ISO 8601

Baixe o output_url logo depois que a tarefa terminar e guarde sua própria cópia. Não conte com ele como armazenamento permanente.