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/upscale

Inicia 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

CabeceraObligatoriaDescripción
AuthorizationSíBearer <your API key>
Content-TypeSíapplication/json
Idempotency-KeyRecomendadaCualquier cadena de 1–255 caracteres ASCII imprimibles. Reintentar con la misma clave nunca cobra dos veces. Consulta Idempotencia.

Cuerpo

CampoTipoObligatorioDescripción
video_urlstringSíUna URL pública http(s) del vídeo o la video_url devuelta por /uploads.
resolutionstringSí1080p, 2k o 4k.

Requisitos del vídeo

  • Formatos: MP4, MOV y WebM.
  • Duración: hasta 1200 segundos en 1080p y 600 segundos en 2k y 4k.
  • Tamaño: hasta 500MB para una video_url remota y 100MB mediante /uploads.
  • El servidor de video_url debe responder a un GET simple con el archivo y una cabecera Content-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_url y resolution devuelve la tarea original con 200 OK. No se te vuelve a cobrar.
  • La misma clave con otra video_url u otra resolution devuelve 409 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

EstadoCódigoCuándo
400invalid_requestFalta video_url, resolution o Idempotency-Key, o no es válido
401unauthorizedFalta la clave de API o no es válida
403paid_plan_requiredLa cuenta nunca ha comprado créditos ni se ha suscrito
402insufficient_creditsTu saldo no alcanza para el vídeo
409idempotency_conflictLa Idempotency-Key ya se usó con otros parámetros
413file_too_largeEl vídeo pesa más de 500MB
422video_fetch_failedNo pudimos descargar video_url
422unsupported_videoNo es un MP4, MOV o WebM legible, o le falta la duración
422video_too_longEl vídeo supera el límite de su resolución (1200 segundos en 1080p, 600 en 2k y 4k)
422video_not_foundUna video_url de subida no tiene archivo (la subida no terminó)
504upstream_timeoutLa descarga de video_url tardó más de 4 minutos

Consulta Errores para ver el formato de los errores.