Subida de archivos

Sube archivos (documentos, audio, video, imágenes) a Videsk usando tu API Key.

Las subidas son un flujo de dos pasos:

  1. Solicitar una autorización a https://api.videsk.io con tu API key. Recibes un JWT de corta duración y la URL de subida.

  2. Enviar el archivo a la URL de subida usando ese JWT.

La autorización tiene en la práctica semántica de un solo uso: expira en 5 minutos y queda acotada a un único bucket, prefijo de key, lista de mime types permitidos y tamaño máximo. Reutilizarla es técnicamente posible hasta exp, pero deberías pedir una nueva por cada archivo.

Autenticación

Ambos pasos usan Authorization: Bearer <token> pero con tokens distintos:

Paso
Endpoint
Token

1. Autorización

https://api.videsk.io

Tu API key

2. Subida

uploadUrl (devuelta en el paso 1)

El JWT devuelto en el paso 1


Paso 1: Solicitar una autorización de subida

Endpoint

Headers

Body

Campos

Campo
Tipo
Requerido
Descripción

purpose

string

Uno de los propósitos soportados (ver abajo).

projectId

string

condicional

Requerido cuando purpose=cip. Debe referenciar un proyecto AI que pertenezca a tu cuenta.

filename

string

no

Nombre original del archivo. Se usa para componer el key del objeto. Sanitizado server-side.

size

number

no

Tamaño declarado en bytes. Informativo; el servicio aplica maxBytes igual.

mime

string

no

Mime declarado. El servicio detecta el mime real desde los magic bytes.

Respuesta

Campo
Descripción

token

JWT firmado con EdDSA. Pasalo como Authorization: Bearer <token> en el paso 2.

exp

Timestamp Unix (segundos) en el que el token expira. ~5 minutos desde su emisión.

uploadUrl

URL exacta a la que enviar el archivo. Usala tal cual.

credentialId

Credencial de almacenamiento utilizada (informativo, para auditoría).

Errores

Status
Código
Significado

400

unknown purpose

purpose no está en la lista permitida.

400

cip grants require projectId

Falta projectId para purpose=cip.

401

unauthorized

API key faltante o inválida.

404

project not found

El projectId no existe o pertenece a otra cuenta.


Paso 2: Enviar el archivo

Endpoint

Debes usar el uploadUrl devuelto en el paso 1 tal cual:

Headers

Body

Un único multipart/form-data con la parte llamada file:

Respuesta (éxito)

Campo
Descripción

mime

Mime detectado a partir de los magic bytes del archivo (no del Content-Type declarado).

bytes

Tamaño final después del strip de EXIF / re-encoding.

sha256

Digest hexadecimal del contenido subido. Útil para deduplicación.

key

Path completo del objeto almacenado.

Errores

Status
Código
Significado

401

unauthorized

JWT faltante, mal formado, expirado o firmado con clave incorrecta.

403

forbidden_credential / forbidden_bucket

La autorización referencia una credencial o bucket no permitido. No debería ocurrir con autorizaciones emitidas por la API.

413

too_large

El archivo excede el maxBytes de la autorización.

415

invalid_mime

Los magic bytes no coinciden con los allowedMimes de la autorización. El Content-Type declarado se ignora.

400

bad_request

No es multipart, falta la parte file, etc.


Ejemplos


Buenas prácticas

Una autorización por archivo

Las autorizaciones son de corta duración. Aunque técnicamente sean reutilizables hasta exp, conviene que cada archivo tenga la suya para que los logs de auditoría mapeen 1:1 contra los objetos almacenados.

Confía en la detección de mime del servidor

El servicio ignora el Content-Type que declaras y lee los magic bytes reales del archivo. Un .csv con Content-Type: image/png se rechaza con invalid_mime. Siempre entrega el archivo original sin modificar.

Política de reintentos

  • 400, 401, 403, 413, 415: no reintentar, la respuesta no va a cambiar.

  • 5xx, errores de red: reintentar con backoff exponencial, pidiendo una autorización nueva si la anterior ya expiró.

Rate limits

Endpoint de autorización: 60 requests/minuto por API key. Endpoint de subida: sin límite por key, pero la concurrencia del servicio puede encolar requests en picos altos.


Seguridad

  • Los tokens de autorización están firmados con EdDSA (Ed25519). El servicio de subida verifica cada request contra la clave pública.

  • Cada autorización codifica el bucket exacto, prefijo de key, lista de mimes y tope de bytes. Un token comprometido no puede usarse fuera de ese alcance.

  • Las imágenes pasan por sharp().rotate(), que elimina toda la metadata EXIF (incluyendo GPS) y aplica el flag de orientación antes de escribir al almacenamiento.

  • El servicio cumple con SOC 2: las credenciales de almacenamiento están acotadas por bucket, así que el alcance de una credencial no puede alcanzar otro bucket.

Última actualización

¿Te fue útil?