Medios recibidos (descarga)
Cuando un contacto envía foto, audio, vídeo, documento o sticker, Meta entrega en el webhook solo el id del medio — no el archivo:
{ "type": "audio", "audio": { "id": "1436196501752591", "mime_type": "audio/ogg; codecs=opus", "sha256": "..." } }
Descargar directo de Meta exige el token de Meta (que Stevo nunca expone) y la URL caduca en minutos. Por eso hay tres formas de obtener el archivo — todas con el token de la API Oficial de tu instancia (la apikey que aparece en la pantalla de la instancia).
1. Por webhook — ya llega resuelto
Si la instancia tiene Webhook (API Oficial) configurado, cada mensaje con medios llega con un bloque extra stevo.media — el payload original de Meta sigue intacto:
{
"object": "whatsapp_business_account",
"entry": [ ... ],
"stevo": {
"instance": "mi-instancia",
"media": {
"id": "1436196501752591",
"type": "audio",
"mime_type": "audio/ogg",
"file_size": 344266,
"url": "https://hel1.your-objectstorage.com/stevo/api-oficial/mi-instancia/1787...-1436196501752591.ogg",
"download_path": "/v1/media/1436196501752591"
}
}
}
url es un enlace público y permanente (almacenamiento de Stevo). Si Stevo no logra descargar de Meta, el webhook llega igual, con stevo.media.error en lugar de url.
2. Por el gateway — GET /v1/media/{mediaId}
curl https://apimeta.shurima.cloud/v1/media/1436196501752591 \
-H "Authorization: Bearer SEU_TOKEN" \
-o audio.ogg
Respuesta: el binario con Content-Type correcto, Content-Length, Content-Disposition (nombre sugerido {id}.{ext}) y X-Media-Sha256.
Solo los metadatos, sin descargar:
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/..." }
Referencia completa: API Oficial (Scalar).
3. Por el SDK
const meta = await stevo.oficial(instanceId);
const media = await meta.downloadMedia('1436196501752591');
// media = { data: Uint8Array, mimeType, fileSize, sha256, fileName }
await fs.promises.writeFile(media.fileName ?? 'archivo.bin', media.data);
const info = await meta.getMediaInfo('1436196501752591'); // solo metadatos
Consejos
- Los audios de voz llegan como
audio/ogg; codecs=opus(16 kHz, mono). - Meta guarda el medio por tiempo limitado (~30 días): descarga apenas recibas el webhook y guárdalo de tu lado — o usa
stevo.media.url, que no caduca. - Medio inexistente/caducado en Meta →
404conerror: meta_error. - La descarga cuenta en el rate limit de gestión del gateway (headers
X-RateLimit-*).