WhatsApp Business API para resposta de sessão — preços
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 sobre Preços.
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 quanto custa um produto ou serviço.
Exemplo de modelo
Olá,{{1}}! O preço para «{{2}}» é{{3}}. Se você precisar de um orçamento personalizado ou desconto por volume, responda aqui e nosso gerente irá ajudar.
- {{1}}nome do cliente
- {{2}}nome do produto ou serviço
- {{3}}preço formatado com moeda

Quando usar isso?
Alcance este cenário quando um potencial cliente perguntar quanto custa um produto ou serviço em uma conversa aberta no WhatsApp e você precisar da cotação antes que eles sigam em frente. Isso se aplica a equipes de vendas que puxam preços ao vivo do CRM ou de uma API de catálogo, pequenas empresas que lidam com solicitações de orçamento no chat, e agências que conectam lojas de clientes a respostas de sessão em vez de templates de início frio.
Fluxo de Trabalho
- Status rastreado
Uma mensagem de cliente inbound com uma pergunta sobre preços chega via webhook.
status:"read" - Captura de evento
Seu backend resolve o SKU do produto e o preço atual da lista.
phone:"+…" - Construa e envie
Uma mensagem de texto da sessão envia a citação com o nome do produto e o valor formatado.
POST/sendMessage - Entregue
O cliente continua o diálogo para descontos ou finalização da compra na mesma sessão.
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_PAYMENTAMOUNT="___" # {{3}} payment amount
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_PAYMENTAMOUNT=$TEST_PAYMENTAMOUNT"; 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! The price for «Premium Plan (annual)» is 49 900 RUB. If you need a custom quote or volume discount, reply here and our manager will help."
}
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": true1MSGaceitoA mensagem para envio ainda não chegou ao telefone do 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
idArmazene isso; retornos de entrega.
hookInfofocam nisso
A entrega em si chega mais tarde, como um callback separado. Registre um webhookPOST …/webhook) e 1MSG envia 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ávelidCorrelaciona o callback.
idretornado pela chamada de enviotimestampSegundos Unix, como uma string
Se você preferir não receber retornos de chamada, cancele.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. |

