Mídia recebida (download)
Quando um contato manda foto, áudio, vídeo, documento ou sticker, a Meta entrega no webhook apenas o id da mídia — não o arquivo:
{ "type": "audio", "audio": { "id": "1436196501752591", "mime_type": "audio/ogg; codecs=opus", "sha256": "..." } }
Baixar direto da Meta exige o token da Meta (que a Stevo nunca expõe) e a URL expira em minutos. Por isso existem três jeitos de pegar o arquivo — todos com o token da API Oficial da sua instância (a apikey que aparece na tela da instância).
1. Pelo webhook — já vem resolvido
Se a instância tem Webhook (API Oficial) configurado, toda mensagem com mídia chega com um bloco extra stevo.media — o payload original da Meta continua intacto:
{
"object": "whatsapp_business_account",
"entry": [ ... ],
"stevo": {
"instance": "minha-instancia",
"media": {
"id": "1436196501752591",
"type": "audio",
"mime_type": "audio/ogg",
"file_size": 344266,
"url": "https://hel1.your-objectstorage.com/stevo/api-oficial/minha-instancia/1787...-1436196501752591.ogg",
"download_path": "/v1/media/1436196501752591"
}
}
}
url é um link público e permanente (armazenamento da Stevo). Se a Stevo não conseguir baixar da Meta, o webhook vem normal, com stevo.media.error no lugar de url.
2. Pelo gateway — GET /v1/media/{mediaId}
curl https://apimeta.shurima.cloud/v1/media/1436196501752591 \
-H "Authorization: Bearer SEU_TOKEN" \
-o audio.ogg
Resposta: o binário com Content-Type correto, Content-Length, Content-Disposition (nome sugerido {id}.{ext}) e X-Media-Sha256.
Só os metadados, sem baixar:
curl "https://apimeta.shurima.cloud/v1/media/1436196501752591?metadata=1" \
-H "Authorization: Bearer SEU_TOKEN"
# { "id": "...", "mime_type": "audio/ogg", "sha256": "...", "file_size": 344266, "download_path": "/v1/media/..." }
Referência completa: API Oficial (Scalar).
3. Pelo SDK
const meta = await stevo.oficial(instanceId);
const midia = await meta.downloadMedia('1436196501752591');
// midia = { data: Uint8Array, mimeType, fileSize, sha256, fileName }
await fs.promises.writeFile(midia.fileName ?? 'arquivo.bin', midia.data);
const info = await meta.getMediaInfo('1436196501752591'); // só metadados
Veja SDK oficial — stevo-sdk.
Dicas
- Áudios de voz chegam como
audio/ogg; codecs=opus(16 kHz, mono). - A Meta guarda a mídia por tempo limitado (~30 dias): baixe assim que receber o webhook e guarde do seu lado — ou use o
stevo.media.url, que não expira. - Mídia inexistente/expirada na Meta →
404comerror: meta_error. - O download conta no rate limit de gestão do gateway (headers
X-RateLimit-*).