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

contentTypeDescrição
textMensagem de texto simples (padrão).
imageAnexo de imagem (JPEG, PNG, WebP).
audioMensagem de áudio (OGG, MP3, M4A).
videoAnexo de vídeo (MP4, WebM).
documentAnexo de documento (PDF, DOCX, etc.).
reactEmoji 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:

ValorBucketRetenção
TRANSIENT (padrão)Bucket com expiraçãoApagado 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.
PERMANENTBucket permanenteMantido indefinidamente. O job de retenção o 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_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.