Tareas

GET /api/v1/tasks/{id}, /tasks/{id}/events y /tasks: consulta el estado de una tarea, sigue su progreso en streaming y descarga el resultado.

Obtener una tarea

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

Devuelve la tarea con su estado más reciente. Consúltala cada 5–10 segundos mientras esté queued o processing. Los vídeos más largos y las resoluciones más altas tardan más.

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"
}

Una tarea que no existe o que pertenece a otra cuenta devuelve 404 not_found.

Ejemplo de consulta periódica

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));
  }
}

Recibir eventos de la tarea en streaming

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

En lugar de consultar periódicamente, puedes mantener una conexión abierta y recibir el progreso de la tarea como Server-Sent Events. La solicitud responde con una redirección 302 a una URL de stream firmada; los clientes SSE la siguen automáticamente (con curl, añade -L). La URL firmada ya concede el acceso, así que tu clave de API no se envía a ella.

EventoDatosCuándo
status{"id": "…", "status": "queued"}El trabajo está esperando una GPU (queued) o en ejecución (processing). Se envía cuando cambia.
completedLa tarea completaEl resultado está listo. Después, el stream se cierra.
failedLa tarea completaEl procesamiento falló y los créditos se reembolsaron. Después, el stream se cierra.
timeout{"id": "…"}El stream se cierra a los 10 minutos. Vuelve a abrir /events si la tarea sigue en curso.

Los datos de completed y failed son exactamente lo que devuelve GET /tasks/{id}. Si abres el stream de una tarea que ya terminó, ese evento se envía de inmediato.

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

Consultar GET /tasks/{id} periódicamente da el mismo resultado; usa lo que mejor encaje con tu código.

Listar tareas

GET https://videoupscaler.co/api/v1/tasks?limit=20&page=1
ParámetroValor por defectoDescripción
limit20Tareas por página, 1–100
page1Número de página, empezando por 1

Devuelve las tareas de la más reciente a la más antigua. La lista también incluye las tareas creadas en el sitio web.

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

El objeto tarea

CampoTipoDescripción
idstringID de la tarea
statusstringqueued, processing, completed o failed
resolutionstring1080p, 2k o 4k
video_urlstringEl vídeo que enviaste
duration_secondsnumberDuración del vídeo de entrada, leída del archivo
processed_secondsnumberCuántos segundos se escalan. Igual a duration_seconds en las tareas de la API; solo es menor en tareas creadas en el sitio web mientras la cuenta era gratuita.
credits_chargedintegerCréditos cobrados por esta tarea (se reembolsan si falla)
watermarkbooleanSi el resultado lleva marca de agua. Siempre false en las tareas de la API; true solo en tareas creadas en el sitio web mientras la cuenta era gratuita.
output_urlstring | nullEl vídeo escalado, una vez completed
thumbnail_urlstring | nullPrimer fotograma del resultado, una vez completed
errorstring | nullPor qué falló la tarea, cuando está failed
created_atstringFecha y hora ISO 8601
updated_atstringFecha y hora ISO 8601

Descarga output_url poco después de que la tarea termine y guarda tu propia copia. No lo uses como almacenamiento permanente.