Media
POST /v1/media — upload de arquivos (imagem/vídeo/documento/áudio) e retorna media_id para uso em mensagens.
Faz upload de mídia e retorna um media_id para usar em POST /v1/messages.
Query: account_id (opcional; default = conexão padrão).
Headers: Idempotency-Key (opcional).
Body: multipart/form-data com o campo file (binário).
O account_id vai na query string, não como campo multipart. Parsing em stream não enxerga campos após o blob.
| Limite | Valor |
|---|---|
| Tamanho (gateway) | 64 MB |
| Tamanho (Meta) | limites por tipo, mais restritos |
Resposta 201
Resposta 201
{ "media_id": "1234567890" } O media_id da Meta tem TTL de ~30 dias — após isso, o upload precisa ser refeito.
Exemplo
curl -X POST "https://api.wablastmessage.com/v1/media?account_id=ckv..." \
-H "Authorization: Bearer wak_sua_chave" \
-F "file=@/caminho/imagem.jpg"import { readFileSync } from 'node:fs';
import FormData from 'form-data';
const form = new FormData();
form.append('file', readFileSync('/caminho/imagem.jpg'), 'imagem.jpg');
const res = await fetch('https://api.wablastmessage.com/v1/media?account_id=ckv...', {
method: 'POST',
headers: { 'Authorization': 'Bearer ' + process.env.WABLAST_API_KEY },
body: form,
});
console.log(res.status, await res.json());import os, requests
with open('/caminho/imagem.jpg', 'rb') as f:
res = requests.post(
'https://api.wablastmessage.com/v1/media',
params={'account_id': 'ckv...'},
headers={'Authorization': 'Bearer ' + os.environ['WABLAST_API_KEY']},
files={'file': ('imagem.jpg', f, 'image/jpeg')},
)
print(res.status_code, res.json())<?php
$ch = curl_init('https://api.wablastmessage.com/v1/media?account_id=ckv...');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . getenv('WABLAST_API_KEY'),
]);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
'file' => new CURLFile('/caminho/imagem.jpg', 'image/jpeg', 'imagem.jpg'),
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$res = curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE) . " " . $res; Use o media_id retornado no campo media.id de POST /v1/messages:
{
"to": "+5511999990000",
"type": "image",
"media": { "id": "1234567890", "caption": "Veja o produto" }
}
GET /v1/media/{id}
Baixa os bytes de uma mídia recebida (o media.id do webhook message.received, não o media_id de upload).
Path: id (string, obrigatório) — o media.id recebido no webhook.
Resposta 200: stream binário com o Content-Type real do arquivo (imagem/áudio/vídeo/documento).
A Meta apaga mídia recebida ~7 dias após o recebimento. Baixe e guarde logo — depois disso a API retorna 410 MEDIA_EXPIRED.
| Status | Erro | Significado |
|---|---|---|
| 404 | MEDIA_NOT_FOUND | mídia não encontrada |
| 410 | MEDIA_EXPIRED | mídia expirada (apagada pela Meta) |
| 502 | MEDIA_DOWNLOAD_FAILED | falha no download junto à Meta |
Exemplo
curl -o midia.jpg "https://api.wablastmessage.com/v1/media/1234567890" \
-H "Authorization: Bearer wak_sua_chave"import { writeFileSync } from 'node:fs';
const res = await fetch('https://api.wablastmessage.com/v1/media/1234567890', {
headers: { 'Authorization': 'Bearer ' + process.env.WABLAST_API_KEY },
});
writeFileSync('midia.jpg', Buffer.from(await res.arrayBuffer()));
console.log(res.status, res.headers.get('content-type'));import os, requests
res = requests.get(
'https://api.wablastmessage.com/v1/media/1234567890',
headers={'Authorization': 'Bearer ' + os.environ['WABLAST_API_KEY']},
)
with open('midia.jpg', 'wb') as f:
f.write(res.content)
print(res.status_code, res.headers.get('Content-Type'))<?php
$ch = curl_init('https://api.wablastmessage.com/v1/media/1234567890');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . getenv('WABLAST_API_KEY'),
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$res = curl_exec($ch);
file_put_contents('midia.jpg', $res);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE) . " " . curl_getinfo($ch, CURLINFO_CONTENT_TYPE); DELETE /v1/media/{id}
Apaga uma mídia recebida do lado da Meta, completando o CRUD de mídia (upload + download + delete).
Path: id (string, obrigatório) — o media.id do webhook.
Resposta 200
Resposta 200
{ "success": true } | Status | Erro | Significado |
|---|---|---|
| 404 | MEDIA_NOT_FOUND | mídia não encontrada |
Exemplo
curl -X DELETE "https://api.wablastmessage.com/v1/media/1234567890" \
-H "Authorization: Bearer wak_sua_chave"const res = await fetch('https://api.wablastmessage.com/v1/media/1234567890', {
method: 'DELETE',
headers: { 'Authorization': 'Bearer ' + process.env.WABLAST_API_KEY },
});
console.log(res.status, await res.json());import os, requests
res = requests.delete(
'https://api.wablastmessage.com/v1/media/1234567890',
headers={'Authorization': 'Bearer ' + os.environ['WABLAST_API_KEY']},
)
print(res.status_code, res.json())<?php
$ch = curl_init('https://api.wablastmessage.com/v1/media/1234567890');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . getenv('WABLAST_API_KEY'),
]);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$res = curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE) . " " . $res;