WhatsApp Business API para resposta de sessão sobre disponibilidade
Este cenário envia uma mensagem pelo WhatsApp com sendMessage dentro da janela de atendimento de 24 horas, após o cliente perguntar se um item está disponível.
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 perguntar se um item está disponível.
Exemplo de modelo
Olá,{{1}}! «{{2}}» está atualmente{{3}}. Responda aqui se você quiser reservar, receber um alerta de reposição ou ver opções similares.
- {{1}}nome do cliente
- {{2}}nome do produto ou serviço
- {{3}}status de disponibilidade ou data esperada

Quando usar
Acesse isso quando um prospect perguntar se um produto ou serviço está em estoque ou disponível para reserva em um chat aberto no WhatsApp, e a resposta precisa chegar antes que ele vá para a concorrência. Isso é ideal para equipes de vendas que puxam o inventário ao vivo do OMS ou CRM, desenvolvedores que conectam respostas de sessão impulsionadas por webhook, e agências que gerenciam a disponibilidade para catálogos de clientes.
Fluxo de Trabalho
- Status rastreado
Uma mensagem de cliente de entrada com uma pergunta sobre disponibilidade chega via webhook.
status:"read" - Resolve o SKU
Seu backend resolve o SKU e o status atual do estoque ou slot.
status:"read" - Construa e envie
Uma mensagem de texto de sessão envia o nome do produto e um resumo de disponibilidade.
POST/sendMessage - Entregue
O cliente continua o diálogo para reservar ou escolher alternativas.
delivered

Implementação técnica
Pré-requisitos
- 1MSG API Key · Como obter a chave da API
- Conta do WhatsApp Business · Como Conectar WABA
- Janela de sessão aberta 24 horas · Como funciona a janela de 24 horas
- Consentimento do cliente · Como Gerenciar o Consentimento dos Clientes
- Endpoint de Webhook · 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_PRODUCTORSERVICENAME="___" # {{2}} product or service name
TEST_STATUS="___" # {{3}} status label
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_PRODUCTORSERVICENAME=$TEST_PRODUCTORSERVICENAME" \
"TEST_STATUS=$TEST_STATUS"; 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! «Premium Plan license» is currently in stock — ready to ship today. Reply here if you want to reserve, get a restock alert, or see similar options."
}
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": truemédia 1MSGAceito.Mensagem para enviar ao cliente.idcampowamid.…) para correlacionar os retornos de entrega.
{
"sent": true,
"id": "wamid.HBgLMzgwNjM5...",
"message": "Message accepted for delivery"
}sentAceito para envio.nãoainda no telefone do cliente
idArmazenar. Retornos de entrega.
hookInfoestão focados nisso
A entrega chega mais tarde, como um retorno separado. Registre um webhook.POST …/webhook) e 1MSG POSTs atualizações de status para o 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
idretornado pela chamadatimestampSegundos Unix, como uma string
Se você não deseja receber chamadas, escolha não participar.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 ela.
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. |

