WhatsApp Business API para resposta de sessão — solicite mais.
Este cenário envia uma mensagem de texto livre pelo WhatsApp com sendMessage dentro da janela de atendimento ao cliente de 24 horas.
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. Use-o após um evento de webhook de entrada quando você já tiver uma sessão aberta e precisar solicitar detalhes de ticket que estão faltando.
Exemplo de modelo
Para continuar resolvendo o ticket{{1}}, por favor envie{{2}}.
- {{1}}número do ticket de suporte
- {{2}}o que você precisa do cliente (foto, documento, esclarecimento)

Quando usá-lo
Acesse este cenário quando um webhook de entrada mostrar que o cliente já escreveu no WhatsApp e sua equipe de suporte precisa de uma foto, documento ou esclarecimento específico antes de fechar o ticket. Isso se encaixa em acompanhamentos de helpdesk onde a janela de sessão de 24 horas está aberta e um modelo adicionaria custo e fricção a um diálogo em andamento.
Fluxo de Trabalho
- Status rastreado
Uma mensagem de cliente recebida chega via webhook.
status:"read" - Captura de evento
Seu backend mapeia o chat para um ticket e determina o detalhe que está faltando.
POST/sendMessage - Construir & enviar
Uma mensagem de texto da sessão é enviada mencionando o tíquete e o item aguardado.
POST/sendMessage - Entregue
O cliente responde com o material solicitado 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
- Opt-in 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_TICKETNUMBER="___" # {{1}} ticket number
TEST_AWAITEDITEM="___" # {{2}} awaited item
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_TICKETNUMBER=$TEST_TICKETNUMBER" \
"TEST_AWAITEDITEM=$TEST_AWAITEDITEM"; 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": "To continue resolving ticket TKT-1024, please send a photo of the damaged item."
}
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": truesignifica 1MSGaceitoa mensagem para enviar — não que já tenha chegado ao celular do cliente.idcampo (parece)wamid.…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; chamadas de retorno de entrega.
hookInfosão focados nisso
A entrega em si chega mais tarde, como uma chamada de retorno separada. Registre um webhook (POST …/webhook) e 1MSG envia 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
idretornado pela solicitação de enviotimestampSegundos Unix, como uma string
Se você prefere não receber retornos de chamada, escolha.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 ele.
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. |

