WhatsApp Business API para resposta a solicitação de cliente
Esse cenário envia uma mensagem de texto livre pelo WhatsApp com sendMessage dentro da janela de atendimento de 24 horas após o cliente perguntar.
Visão geral do caso de uso
Este cenário envia uma mensagem de texto livre pelo WhatsApp com sendMessage dentro da janela de atendimento ao cliente de 24 horas, após o cliente ter escrito primeiro sobre um produto ou serviço.
Exemplo de modelo
Olá,{{1}}! Recebemos sua solicitação sobre «{{2}}».{{3}}está revisando e responderá em breve.
- {{1}}nome do cliente
- {{2}}solicitar tópico ou área de produto
- {{3}}nome do gerente de vendas designado

Quando usar isso?
Olá! Obrigado por entrar em contato pelo WhatsApp. Recebemos sua mensagem e um de nossos gerentes de vendas irá responder em breve com mais informações sobre o produto ou serviço que você perguntou.
Fluxo de Trabalho
- Status rastreado
Uma mensagem de cliente entrada chega via webhook.
status:"read" - Evento de captura
Seu backend mapeia o chat para um lead e extrai o tópico da solicitação.
POST/sendMessage - Construa e envie
Uma mensagem de texto da sessão reconhece o pedido e nomeia o gerente.
POST/sendMessage - Entregue
O gerente continua o diálogo com uma resposta detalhada na mesma sessão.
delivered

Implementação técnica
Pré-requisitos
- 1MSG API Key · Como obter a chave API
- Conta do WhatsApp Business · Como Conectar o WABA
- Janela de sessão aberta 24 horas · Como funciona a janela de 24 horas
- Opt-in do cliente · Como Gerenciar o Consentimento dos Clientes
- Webhook endpoint · Como Configurar Webhooks
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)
# === Test data ===
TEST_PHONE="___" # client phone in international format · requires open 24-hour session window
TEST_CUSTOMERNAME="___" # {{1}} customer name
TEST_TOPIC="___" # {{2}} topic or subject
TEST_MANAGERNAME="___" # {{3}} manager name
PHONE_NORM="$(printf '%s' "$TEST_PHONE" | tr -cd '0-9')"
for pair in "CHANNEL_ID=$CHANNEL_ID" "API_TOKEN=$API_TOKEN" "TEST_PHONE=$TEST_PHONE" \
"TEST_CUSTOMERNAME=$TEST_CUSTOMERNAME" \
"TEST_TOPIC=$TEST_TOPIC" \
"TEST_MANAGERNAME=$TEST_MANAGERNAME"; 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}/sendMessage"
read -r -d '' PAYLOAD <<JSON || true
{
"phone": "${PHONE_NORM}",
"body": "Hello, Alexey! We received your request about «CRM for a sales team». Manager Anna is reviewing it and will reply shortly."
}
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 de resposta e entrega
HTTP 2xx e JSON"sent": truemean 1MSGaceitoa mensagem para enviar — não que já tenha chegado ao telefone do cliente.idcampowamid.…para correlacionar retornos de entrega.
{
"sent": true,
"id": "wamid.HBgLMzgwNjM5...",
"message": "Message accepted for delivery"
}sentAceito para envio.nãoainda no telefone do cliente
idArmazene isso; retornos de chamada de entrega e
hookInfosão focados nisso
A entrega em si chega mais tarde, como um retorno separado. Registre um webhook (POST …/webhook) e 1MSG POSTs atualizações de status para seu endpoint HTTPS em um nível superiorhooks[]carga.
{
"hooks": [
{
"id": "gBGGeSaGViBfAgnlzOSHEwK9O6F",
"type": "message",
"status": "sent",
"timestamp": "1654864094",
"recipient_id": "556123122026"
}
]
}statussent,delivered,read— ou um status de falha quando aplicávelidCorrela o callback com o
idretornada pela chamada de enviotimestampSegundos Unix, como uma string
Se você preferir não receber ligações de retorno, não faça a pesquisa.GET {base}/{channel}/hookInfo?messageId=<id>em vez disso. Na prática, a entrega geralmente é concluída em segundos — mas o contrato da API não garante isso, então nunca bloqueie um fluxo esperando por isso.
Erros comuns
| Status | Resposta | Causa |
|---|---|---|
| 200 | Message was not sent: empty body | No body in the request. |
| 200 | Message was not sent: provide chatId, phone, bsuid, or username | No recipient the channel could resolve. |
| 200 | wrong file | The media could not be fetched or uploaded — not a reachable URL, not valid base64. |
| 403 | access denied | The token is wrong, or belongs to a different channel than the URL. |
| 200 | Message was not sent: filename | sendFile called without a filename, so the media has no extension to send. |

