WhatsApp Business API para notícias da empresa
O cenário envia um modelo de WhatsApp personalizado quando a empresa publica notícias sobre a empresa ou serviços.
Visão geral do caso de uso
O cenário envia um template personalizado de WhatsApp quando a empresa publica notícias sobre a empresa ou serviços. A mensagem inclui o nome do contato, o título da notícia e um resumo curto do que mudou. Um botão de URL estático abre a página do anúncio completo com os detalhes.
Exemplo de modelo
Olá,{{1}}! Atualização da empresa:{{2}}. {{3}}Toque no botão abaixo para ler o anúncio completo em nosso site.
- {{1}}nome do cliente
- {{2}}tópico ou título de notícias da empresa
- {{3}}resumo do que mudou ou o detalhe chave
- “Leia o anúncio”botão — fixo no modelo Meta

Quando usar isso
Use este cenário quando a empresa precisar que toda a base opt-in ouça as notícias da empresa ou serviço — uma nova filial, horário estendido, uma rebranding, uma parceria ou uma atualização de serviço — e o texto for um anúncio, não uma proposta de desconto ou um produto sendo lançado. Isso se encaixa em redes de varejo compartilhando notícias de localização, plataformas de SaaS divulgando atualizações de políticas ou parcerias, e agências realizando ondas de notícias da empresa para marcas de clientes no WhatsApp.
Fluxo de Trabalho
- Desencadear
O marketing ou as operações programam uma transmissão de notícias da empresa e definem o segmento de contato.
event·triggered - Capturar evento
O sistema resolve cada campo de telefone do destinatário e de personalização de notícias.
phone:"+…" - Construir e enviar
Um modelo de notícias personalizado é construído com três variáveis de corpo e um botão de URL estático.
POST/sendTemplate - Entregue
Cada contato recebe a mensagem de notícias da empresa pelo WhatsApp.
delivered - Status rastreado
As entregas e toques nos botões são registrados para relatórios de alcance de anúncios.
status:"read"

Implementação técnica
Pré-requisitos
- Chave da API 1MSG · Como obter a chave da API
- Conta do WhatsApp Business · Como Conectar WABA
- Modelo de WhatsApp · Como Aprovar o Modelo WABA
- Consentimento do cliente · Como Gerenciar o Consentimento dos Clientes
Exemplos de código
#!/usr/bin/env bash
set -euo pipefail
# === Configuration (replace "___" placeholders) ===
API_BASE_URL="https://api.1msg.io" # production 1MSG API base URL
CHANNEL_ID="___" # channel ID from 1MSG dashboard
API_TOKEN="___" # channel JWT token (Bearer)
TEMPLATE_NAME="___" # approved template name
TEMPLATE_NAMESPACE="___" # template namespace (required — send fails without it)
TEMPLATE_LANGUAGE="___" # template language code, e.g. "en"
# === Test data ===
TEST_PHONE="___" # client phone in international format
TEST_CUSTOMERNAME="___" # {{1}} customer name
TEST_TOPIC="___" # {{2}} topic or subject
TEST_DETAILS="___" # {{3}} change details
PHONE_NORM="$(printf '%s' "$TEST_PHONE" | tr -cd '0-9')"
for pair in "CHANNEL_ID=$CHANNEL_ID" "API_TOKEN=$API_TOKEN" \
"TEMPLATE_NAME=$TEMPLATE_NAME" "TEMPLATE_NAMESPACE=$TEMPLATE_NAMESPACE" \
"TEMPLATE_LANGUAGE=$TEMPLATE_LANGUAGE" "TEST_PHONE=$TEST_PHONE" \
"TEST_CUSTOMERNAME=$TEST_CUSTOMERNAME" \
"TEST_TOPIC=$TEST_TOPIC" \
"TEST_DETAILS=$TEST_DETAILS"; do
val="${pair#*=}"
if [ -z "$val" ] || [ "$val" = "___" ]; then
echo "Missing configuration value: ${pair%%=*}" >&2
exit 1
fi
done
if [ -z "$PHONE_NORM" ]; then
echo "Error: phone number has no digits after normalization" >&2
exit 1
fi
URL="${API_BASE_URL%/}/${CHANNEL_ID}/sendTemplate"
# params carries body ONLY. Button text is fixed in the Meta template — no button param.
# {{1}} customer name → ${TEST_CUSTOMERNAME}
# {{2}} topic or subject → ${TEST_TOPIC}
# {{3}} change details → ${TEST_DETAILS}
read -r -d '' PAYLOAD <<JSON || true
{
"phone": "${PHONE_NORM}",
"template": "${TEMPLATE_NAME}",
"namespace": "${TEMPLATE_NAMESPACE}",
"language": { "policy": "deterministic", "code": "${TEMPLATE_LANGUAGE}" },
"params": [
{
"type": "body",
"parameters": [
{ "type": "text", "text": "${TEST_CUSTOMERNAME}" },
{ "type": "text", "text": "${TEST_TOPIC}" },
{ "type": "text", "text": "${TEST_DETAILS}" }
]
}
]
}
JSON
RESPONSE="$(curl -s -w '\n%{http_code}' -X POST "$URL" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${API_TOKEN}" \
-d "$PAYLOAD")"
HTTP_CODE="$(printf '%s' "$RESPONSE" | tail -n1)"
BODY="$(printf '%s' "$RESPONSE" | sed '$d')"
case "$BODY" in
*'"sent":true'*) ok=1 ;;
*) ok=0 ;;
esac
if [ "$HTTP_CODE" -ge 200 ] && [ "$HTTP_CODE" -lt 300 ] && [ "$ok" -eq 1 ]; then
echo "Message sent to client."
echo "API response: $BODY"
else
echo "Send failed. HTTP status: $HTTP_CODE" >&2
echo "$BODY" >&2
exit 1
fi
Status da resposta e da entrega
HTTP 2xx e JSON"sent": truemean 1MSGaceitoa mensagem para enviar — não que ela já tenha chegado ao telefone do cliente.idcampo (parece que)wamid.…) para correlacionar callbacks de entrega.
{
"sent": true,
"id": "wamid.HBgLMzgwNjM5...",
"message": "Message accepted for delivery"
}sentAceito para envio.nãoainda no telefone do cliente
idArmazene; chamadas de retorno de entrega.
hookInfosão focados nisso
A entrega em si chega mais tarde, como um callback separado. Registre um webhook (POST …/webhook) e 1MSG POSTs atualizações de status para o seu endpoint HTTPS em um nível superiorhooks[]carga útil.
{
"hooks": [
{
"id": "gBGGeSaGViBfAgnlzOSHEwK9O6F",
"type": "message",
"status": "sent",
"timestamp": "1654864094",
"recipient_id": "556123122026"
}
]
}statussent,delivered,read— ou um status de falha quando aplicávelidCorrela o retorno com a
idretornado pela chamada de enviotimestampSegundos Unix, como uma string
Se você preferir não receber ligações, desmarque.GET {base}/{channel}/hookInfo?messageId=<id>em vez disso. Na prática, a entrega muitas vezes é concluída em segundos — mas o contrato da API não garante isso, então nunca bloqueie um fluxo esperando por ela.
Erros comuns
| Status | Resposta | Causa |
|---|---|---|
| 200 | Message was not sent: template is not defined | namespace, template or language missing from the request body. |
| 200 | template name (…) does not exist in <language> | The template is approved in a different language than the one requested. |
| 200 | Message was not sent: provide chatId, phone, bsuid, or username | No recipient the channel could resolve. |
| 403 | access denied | The token is wrong, or belongs to a different channel than the URL. |
| 429 | too many requests. please try later | The channel is over its send rate. |

