Crear un escalado
POST /api/v1/upscale: cobra créditos por un vídeo e inicia su escalado a 1080p, 2K o 4K.
POST https://videoupscaler.co/api/v1/upscaleInicia un escalado y devuelve la nueva tarea. Descargamos el vídeo, leemos su duración real del propio archivo y cobramos los créditos correspondientes antes de que empiece el trabajo. Nunca tienes que enviar la duración tú mismo.
Solicitud
Cabeceras
| Cabecera | Obligatoria | Descripción |
|---|---|---|
Authorization | Sí | Bearer <your API key> |
Content-Type | Sí | application/json |
Idempotency-Key | Recomendada | Cualquier cadena de 1–255 caracteres ASCII imprimibles. Reintentar con la misma clave nunca cobra dos veces. Consulta Idempotencia. |
Cuerpo
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
video_url | string | Sí | Una URL pública http(s) del vídeo o la video_url devuelta por /uploads. |
resolution | string | Sí | 1080p, 2k o 4k. |
Requisitos del vídeo
- Formatos: MP4, MOV y WebM.
- Duración: hasta 600 segundos.
- Tamaño: hasta 500MB para una
video_urlremota y 100MB mediante /uploads. - El servidor de
video_urldebe responder a unGETsimple con el archivo y una cabeceraContent-Length. Los enlaces firmados de S3, R2 o Google Cloud Storage funcionan. Las páginas para compartir, como YouTube o las vistas previas de Google Drive, no. - Se rechazan los MP4 fragmentados que no indican una duración total. Vuelve a codificarlos primero como MP4 normal.
- Los archivos WebM deben guardar su duración en la cabecera. Las grabaciones hechas en el navegador (MediaRecorder) a menudo no la incluyen; vuelve a codificarlas primero.
Ejemplo
curl https://videoupscaler.co/api/v1/upscale \
-H "Authorization: Bearer $VIDEOUPSCALER_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1234" \
-d '{"video_url": "https://example.com/clip.mp4", "resolution": "2k"}'const res = await fetch('https://videoupscaler.co/api/v1/upscale', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.VIDEOUPSCALER_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': 'order-1234',
},
body: JSON.stringify({ video_url: 'https://example.com/clip.mp4', resolution: '2k' }),
});
if (!res.ok) throw new Error((await res.json()).error.message);
const task = await res.json();res = requests.post(
"https://videoupscaler.co/api/v1/upscale",
headers={
"Authorization": f"Bearer {os.environ['VIDEOUPSCALER_API_KEY']}",
"Idempotency-Key": "order-1234",
},
json={"video_url": "https://example.com/clip.mp4", "resolution": "2k"},
timeout=300,
)
res.raise_for_status()
task = res.json()Respuesta
201 Created con la tarea:
{
"id": "0b6f3c1e-8a52-5d1e-9c43-3f1d2e7a9b10",
"status": "processing",
"resolution": "2k",
"video_url": "https://example.com/clip.mp4",
"duration_seconds": 12.4,
"processed_seconds": 12.4,
"credits_charged": 26,
"watermark": false,
"output_url": null,
"thumbnail_url": null,
"error": null,
"created_at": "2026-09-30T08:00:00.000Z",
"updated_at": "2026-09-30T08:00:02.000Z"
}Después, consulta la tarea hasta que esté completed.
Esta solicitud descarga el vídeo antes de responder, así que un archivo remoto grande puede tardar un rato. Espera hasta 5 minutos antes de considerar que ha expirado.
Idempotencia
Envía una Idempotency-Key en cada solicitud y reutilízala cuando reintentes tras un timeout o un error de red:
- La misma clave con la misma
video_urlyresolutiondevuelve la tarea original con200 OK. No se te vuelve a cobrar. - La misma clave con otra
video_urlu otraresolutiondevuelve409 idempotency_conflict. - Sin la cabecera, cada solicitud crea una tarea nueva y la cobra.
Facturación
El precio es la duración del vídeo en segundos enteros (redondeada hacia arriba) multiplicada por la tarifa de la resolución. Consulta Créditos y precios. Un vídeo de 12,4 segundos a 2K cuesta 13 × 2 = 26 créditos.
Si el trabajo falla, los créditos se reembolsan automáticamente y la tarea pasa a failed.
Errores
| Estado | Código | Cuándo |
|---|---|---|
400 | invalid_request | Falta video_url, resolution o Idempotency-Key, o no es válido |
401 | unauthorized | Falta la clave de API o no es válida |
403 | paid_plan_required | La cuenta nunca ha comprado créditos ni se ha suscrito |
402 | insufficient_credits | Tu saldo no alcanza para el vídeo |
409 | idempotency_conflict | La Idempotency-Key ya se usó con otros parámetros |
413 | file_too_large | El vídeo pesa más de 500MB |
422 | video_fetch_failed | No pudimos descargar video_url |
422 | unsupported_video | No es un MP4, MOV o WebM legible, o le falta la duración |
422 | video_too_long | El vídeo dura más de 600 segundos |
422 | video_not_found | Una video_url de subida no tiene archivo (la subida no terminó) |
504 | upstream_timeout | La descarga de video_url tardó más de 4 minutos |
Consulta Errores para ver el formato de los errores.