Tarefas
GET /api/v1/tasks/{id}, /tasks/{id}/events e /tasks — confira o status de uma tarefa, acompanhe o progresso em streaming, baixe o resultado e liste tarefas anteriores.
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}/eventsEm 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.
| Evento | Dados | Quando |
|---|---|---|
status | {"id": "…", "status": "queued"} | O job está aguardando uma GPU (queued) ou em execução (processing). Enviado quando o status muda. |
completed | A tarefa completa | O resultado está pronto. Em seguida o stream é encerrado. |
failed | A tarefa completa | O 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"):
breakFazer 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âmetro | Padrão | Descrição |
|---|---|---|
limit | 20 | Tarefas por página, 1–100 |
page | 1 | Nú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
| Campo | Tipo | Descrição |
|---|---|---|
id | string | ID da tarefa |
status | string | queued, processing, completed ou failed |
resolution | string | 1080p, 2k ou 4k |
video_url | string | O vídeo que você enviou |
duration_seconds | number | Duração do vídeo de entrada, lida do arquivo |
processed_seconds | number | Quantos 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_charged | integer | Créditos cobrados por esta tarefa (reembolsados se ela falhar) |
watermark | boolean | Se 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_url | string | null | O vídeo com upscale, quando completed |
thumbnail_url | string | null | Primeiro quadro do resultado, quando completed |
error | string | null | Motivo da falha, quando failed |
created_at | string | Data e hora em ISO 8601 |
updated_at | string | Data 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.