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 -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 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
| contentType | Descripción |
|---|---|
text | Mensaje de texto plano (predeterminado). |
image | Adjunto de imagen (JPEG, PNG, WebP). |
audio | Mensaje de audio (OGG, MP3, M4A). |
video | Adjunto de video (MP4, WebM). |
document | Adjunto de documento (PDF, DOCX, etc.). |
react | Emoji 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:
| Valor | Bucket | Retención |
|---|---|---|
TRANSIENT (predeterminado) | Bucket con expiración | Borrado 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. |
PERMANENT | Bucket permanente | Conservado indefinidamente. El job de retención lo preserva. |
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.