Archivos Adjuntos

Envíe y reciba archivos adjuntos de medios — imágenes, audio, video, documentos — en conversaciones cifradas.

Visión General

Los mensajes de medios siguen el mismo esquema de cifrado de extremo a extremo que los mensajes de texto. El archivo se cifra con una clave AES-256-GCM por mensaje, y la clave se envuelve para las claves públicas RSA del destinatario y del remitente.

Subir Medios

Suba medios cifrados como multipart/form-data. Los bytes del archivo ya deben estar cifrados por el cliente; los campos del envelope describen cómo descriptografarlos. La respuesta es un objeto Message con un mediaId referenciando el archivo subido.

cURL
curl -X POST https://api.ixblix.app/api/media/company \
  -H "X-API-Key: smci_xxxx" \
  -F "conversationId=conv_xxxx" \
  -F "file=@foto_cifrada.bin" \
  -F "iv=base64-iv" \
  -F "authTag=base64-auth-tag" \
  -F "encryptedKey=base64-clave-aes-envuelta" \
  -F "selfEncryptedKey=base64-clave-aes-envuelta-para-si" \
  -F "keyId=operator-key-1"

Descargar Medios

Obtenga los bytes cifrados brutos y headers del envelope:

cURL
curl https://api.ixblix.app/api/media/{mediaId}/content \
  -H "X-API-Key: smci_xxxx"

Los metadatos (envelope + información del archivo) están disponibles en GET /api/media/{mediaId}.

Tipos de Contenido

contentTypeDescripción
textMensaje de texto plano (predeterminado).
imageAdjunto de imagen (JPEG, PNG, WebP).
audioMensaje de audio (OGG, MP3, M4A).
videoAdjunto de video (MP4, WebM).
documentAdjunto de documento (PDF, DOCX, etc.).
reactEmoji de reacción (usa replyToId).

Recibiendo Medios

Cuando reciba un webhook MESSAGE_RECEIVED para un mensaje de medios, obtenga los detalles con GET /api/messages/{conversationId}. La respuesta incluye el mediaId y campos del envelope. Descargue los bytes cifrados vía GET /api/media/{mediaId}/content y descriptografelos localmente.

Almacenamiento

Los archivos se almacenan cifrados en almacenamiento de objetos compatible con S3. El backend solo almacena ciphertext — nunca ve texto plano. El acceso se controla mediante la clave de API de la empresa o el token de la conversación.

Clase de almacenamiento

Los medios se escriben en uno de dos buckets, elegido por subida con el campo opcional storageClass del multipart:

ValorBucketRetención
TRANSIENT (predeterminado)Bucket con expiraciónBorrado por el job de retención cuando termina la ventana de retención de la conversación. La política de ciclo de vida del bucket también puede expirar el objeto.
PERMANENTBucket permanenteConservado indefinidamente. El job de retención lo preserva.
cURL
curl -X POST https://api.ixblix.app/api/media/company \
  -H "X-API-Key: smci_xxxx" \
  -F "conversationId=conv_xxxx" \
  -F "file=@contrato_cifrado.bin" \
  -F "storageClass=PERMANENT" \
  -F "iv=base64-iv" \
  -F "authTag=base64-auth-tag" \
  -F "encryptedKey=base64-clave-aes-envuelta" \
  -F "selfEncryptedKey=base64-clave-aes-envuelta-para-si" \
  -F "keyId=operator-key-1"

Use PERMANENT para archivos que deben sobrevivir a la ventana de retención (p. ej. contratos firmados, recibos, evidencia de auditoría). Cualquier otro valor se rechaza con VALIDATION_ERROR. La clase elegida se devuelve como storageClass en el objeto Media.

Nota: una solicitud explícita de borrado (LGPD/GDPR "derecho al olvido") también elimina archivos permanentes. PERMANENT solo exime al archivo del barrido automático de retención, no de un borrado solicitado por el cliente.