Anexos de Mídia
Envie e receba anexos de mídia — imagens, áudio, vídeo, documentos — em conversas criptografadas.
Visão Geral
Mensagens de mídia seguem o mesmo esquema de criptografia ponta a ponta que mensagens de texto. O arquivo de mídia é criptografado com uma chave AES-256-GCM por mensagem, e a chave é envolvida para as chaves públicas RSA do destinatário e do remetente.
Upload de Mídia
Envie mídia criptografada como multipart/form-data. Os bytes do arquivo já devem estar criptografados pelo cliente; os campos do envelope descrevem como descriptografá-los. A resposta é um objeto Message com um mediaId referenciando o arquivo enviado.
curl -X POST https://api.ixblix.app/api/media/company \
-H "X-API-Key: smci_xxxx" \
-F "conversationId=conv_xxxx" \
-F "file=@foto_criptografada.bin" \
-F "iv=base64-iv" \
-F "authTag=base64-auth-tag" \
-F "encryptedKey=base64-chave-aes-envolvida" \
-F "selfEncryptedKey=base64-chave-aes-envolvida-para-si" \
-F "keyId=operator-key-1" Download de Mídia
Busque os bytes criptografados brutos e headers do envelope:
curl https://api.ixblix.app/api/media/{mediaId}/content \
-H "X-API-Key: smci_xxxx" Metadados (envelope + informações do arquivo) estão disponíveis em GET /api/media/{mediaId}.
Tipos de Conteúdo
| contentType | Descrição |
|---|---|
text | Mensagem de texto simples (padrão). |
image | Anexo de imagem (JPEG, PNG, WebP). |
audio | Mensagem de áudio (OGG, MP3, M4A). |
video | Anexo de vídeo (MP4, WebM). |
document | Anexo de documento (PDF, DOCX, etc.). |
react | Emoji de reação (usa replyToId). |
Recebendo Mídia
Quando receber um webhook MESSAGE_RECEIVED para uma mensagem de mídia, busque os detalhes com GET /api/messages/{conversationId}. A resposta inclui o mediaId e campos do envelope. Baixe os bytes criptografados via GET /api/media/{mediaId}/content e descriptografe localmente.
Armazenamento
Arquivos de mídia são armazenados criptografados em armazenamento de objetos compatível com S3. O backend armazena apenas ciphertext — nunca vê texto plano. O acesso é controlado via chave de API da empresa ou token da conversa.
Classe de armazenamento
A mídia é gravada em um de dois buckets, escolhido por upload com o campo opcional storageClass do multipart:
| Valor | Bucket | Retenção |
|---|---|---|
TRANSIENT (padrão) | Bucket com expiração | Apagado pelo job de retenção quando a janela de retenção da conversa termina. A política de ciclo de vida do bucket também pode expirar o objeto. |
PERMANENT | Bucket permanente | Mantido indefinidamente. O job de retenção o preserva. |
curl -X POST https://api.ixblix.app/api/media/company \
-H "X-API-Key: smci_xxxx" \
-F "conversationId=conv_xxxx" \
-F "file=@contrato_criptografado.bin" \
-F "storageClass=PERMANENT" \
-F "iv=base64-iv" \
-F "authTag=base64-auth-tag" \
-F "encryptedKey=base64-chave-aes-envolvida" \
-F "selfEncryptedKey=base64-chave-aes-envolvida-para-si" \
-F "keyId=operator-key-1" Use PERMANENT para arquivos que devem sobreviver à janela de retenção (ex.: contratos assinados, recibos, evidências de auditoria). Qualquer outro valor é rejeitado com VALIDATION_ERROR. A classe escolhida é retornada como storageClass no objeto Media.
Nota: uma solicitação explícita de exclusão (LGPD/GDPR "direito ao esquecimento") também remove arquivos permanentes. PERMANENT apenas isenta o arquivo da varredura automática de retenção, não de uma exclusão solicitada pelo cliente.