WhatsApp Business API para suporte — reação e confirmações
Este cenário combina sendReaction e readMessage durante a janela de atendimento ao cliente de 24 horas.
Visão geral do caso de uso
Esse cenário combina sendReaction e readMessage durante a janela de atendimento ao cliente de 24 horas. Uma reação de joinha na mensagem de entrada id sinaliza reconhecimento sem outra bolha de texto.
Exemplo de modelo
Sua mensagem foi registrada — estamos preparando uma resposta detalhada.

Quando usar isso
Acesse este cenário quando uma mensagem de cliente chega em uma sessão de suporte aberta no WhatsApp e você precisa que eles saibam que foi vista antes que a resposta completa esteja pronta. Isso se adequa a desenvolvedores programando bots de suporte, pequenas equipes lidando com filas de chat e agências aprimorando a experiência do suporte voltada para o cliente, onde cada bolha de texto extra adiciona ruído.
Fluxo de Trabalho
- Status rastreado
Uma mensagem de cliente chega via webhook com seu ID de mensagem.
status:"read" - Construir e enviar
Seu backend envia uma reação positiva para esse id.
POST/send_reaction - Registrar evento
readMessage marca a mensagem recebida como lida.
phone:"+…" - Entregue
O cliente vê um reconhecimento enquanto a resposta detalhada é preparada.
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 de 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
INBOUND_MESSAGE_ID="___" # inbound message ID for reaction/read
PHONE_NORM="$(printf '%s' "$TEST_PHONE" | tr -cd '0-9')"
REACTION_URL="${API_BASE_URL%/}/${CHANNEL_ID}/sendReaction"
read -r -d '' PAYLOAD <<JSON || true
{
"phone": "${PHONE_NORM}",
"body": "👍",
"quotedMsgId": "${INBOUND_MESSAGE_ID}"
}
JSON
RESPONSE="$(curl -s -w '\n%{http_code}' -X POST "$REACTION_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" -lt 200 ] || [ "$HTTP_CODE" -ge 300 ] || [ "$ok" -ne 1 ]; then
echo "$BODY" >&2
exit 1
fi
READ_URL="${API_BASE_URL%/}/${CHANNEL_ID}/readMessage"
read -r -d '' SECONDARY_PAYLOAD <<JSON || true
{ "messageId": "${INBOUND_MESSAGE_ID}" }
JSON
READ_RESPONSE="$(curl -s -w '\n%{http_code}' -X POST "$READ_URL" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${API_TOKEN}" \
-d "$SECONDARY_PAYLOAD")"
READ_CODE="$(printf '%s' "$READ_RESPONSE" | tail -n1)"
READ_BODY="$(printf '%s' "$READ_RESPONSE" | sed '$d')"
case "$READ_BODY" in
*'"result":"success"'*) read_ok=1 ;;
*) read_ok=0 ;;
esac
if [ "$READ_CODE" -lt 200 ] || [ "$READ_CODE" -ge 300 ] || [ "$read_ok" -ne 1 ]; then
echo "$READ_BODY" >&2
exit 1
fi
echo "Message sent to client."
Status de resposta e entrega
HTTP 2xx e JSON"sent": truemédia 1MSGaceitoa mensagem para envio — não que tenha chegado ao celular do cliente.idcampo.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; retornos de entrega.
hookInfoestão focados nisso
A entrega em si chega mais tarde, como uma chamada de retorno separada. 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 a chamada de retorno com o
idretornado pela chamada de enviotimestampSegundos Unix, como uma string
Se preferir não receber retornos de chamada, não se manifeste.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: 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. |

