Tareas
GET /api/v1/tasks/{id}, /tasks/{id}/events y /tasks: consulta el estado de una tarea, sigue su progreso en streaming, descarga el resultado y lista tareas anteriores.
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}/eventsEn 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.
| Evento | Datos | Cuándo |
|---|---|---|
status | {"id": "…", "status": "queued"} | El trabajo está esperando una GPU (queued) o en ejecución (processing). Se envía cuando cambia. |
completed | La tarea completa | El resultado está listo. Después, el stream se cierra. |
failed | La tarea completa | El 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"):
breakConsultar 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ámetro | Valor por defecto | Descripción |
|---|---|---|
limit | 20 | Tareas por página, 1–100 |
page | 1 | Nú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
| Campo | Tipo | Descripción |
|---|---|---|
id | string | ID de la tarea |
status | string | queued, processing, completed o failed |
resolution | string | 1080p, 2k o 4k |
video_url | string | El vídeo que enviaste |
duration_seconds | number | Duración del vídeo de entrada, leída del archivo |
processed_seconds | number | Cuá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_charged | integer | Créditos cobrados por esta tarea (se reembolsan si falla) |
watermark | boolean | Si 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_url | string | null | El vídeo escalado, una vez completed |
thumbnail_url | string | null | Primer fotograma del resultado, una vez completed |
error | string | null | Por qué falló la tarea, cuando está failed |
created_at | string | Fecha y hora ISO 8601 |
updated_at | string | Fecha 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.