Janela de atendimento de 24 horas
O WhatsApp só deixa a empresa mandar mensagens livres a um cliente durante uma janela de 24 horas, contada da última mensagem que o cliente enviou para o número. Cada mensagem nova do cliente reabre a janela por mais 24 h. Fora dela, só um modelo aprovado é entregue. A janela define o que pode ser enviado; ela não define se a mensagem é cobrada (veja Cobrança).
O que dá para enviar#
| Situação | Mensagem livre (texto, mídia, localização, contatos, reação, interativa) | Modelo (template) |
|---|---|---|
| Dentro da janela | Sim | Sim |
| Fora da janela (ou o cliente nunca escreveu) | Não: a Meta recusa com o código 131047 | Sim: é o único tipo entregue |
Mensagens interativas (botões, lista, Flow…) também só vão dentro da janela (Mensagens interativas). O que um cliente responde a um modelo de marketing abre a janela: a partir daí, mensagens livres valem por 24 h, e as de marketing enviadas nela não contam no limite por cliente que a Meta aplica a modelos de marketing.
Quando a janela fecha#
Cada status sent que a Meta manda no webhook pode trazer conversation.expiration_timestamp: o momento (em segundos desde 1970, como texto) em que a janela da conversa fecha. Guarde-o junto do cliente para saber, antes de enviar, se o modelo será necessário. Se preferir, guarde o timestamp da última mensagem recebida do cliente e some 24 h.
{
"statuses": [
{
"id": "wamid.HBgNNTUxMTk5OTk5OTk5ORUCABEYEjdGQjI0QzE4RTlBMDVENzQxAA==",
"status": "sent",
"timestamp": "1767225600",
"recipient_id": "5511999999999",
"conversation": {
"id": "b1a2c3d4e5f60718293a4b5c6d7e8f90",
"expiration_timestamp": "1767312000",
"origin": {
"type": "utility"
}
},
"pricing": {
"billable": true,
"pricing_model": "PMP",
"category": "utility"
}
}
]
}No Instagram#
A regra é parecida, com três diferenças:
| Janela | 24 h desde a última mensagem do cliente | 24 h desde a última mensagem direta da pessoa |
| Fora da janela | A Meta recusa a mensagem livre (131047); um modelo aprovado é entregue | Não há modelos: nada é enviado. A Synergy confere a janela antes e responde na hora, sem chamar a Meta |
| Resposta privada a um comentário | Não existe | Uma por comentário, em até 7 dias, sem precisar de janela aberta |
| Etiqueta Human Agent (janela de 7 dias) | Não existe | Só os atendentes na plataforma usam. A API nunca usa |
Na API, uma mensagem para uma pessoa fora da janela responde 400 com o código 10 e o subcódigo 2534022; uma pessoa que nunca escreveu para a conta (sem conversa) responde 400, código 100, subcódigo 2534014. Veja Instagram.
Para uma Jornada iniciada pela API (Jornadas), a janela do Instagram também precisa estar aberta: 400 com a mensagem The 24-hour window of this conversation is closed.
{
"error": {
"message": "(#10) This message is sent outside of allowed window.",
"type": "OAuthException",
"code": 10,
"error_subcode": 2534022,
"fbtrace_id": "syn-3f9a1c0b"
}
}O erro da Meta (131047)#
No WhatsApp a Synergy não confere a janela: o envio vai à Meta, e é ela quem recusa. O erro volta com o status e o corpo que a Meta mandou, normalmente um 400:
Ele também pode aparecer depois do 200, no status failed do webhook:
Outros códigos da Meta que aparecem em errors (do status failed ou de uma mensagem não suportada):
| Código | Quando |
|---|---|
| 131047 | Passaram mais de 24 h desde a última mensagem do cliente: use um modelo |
| 131026 | O destinatário não tem WhatsApp |
| 131049 | A Meta limitou modelos de marketing para este cliente; espere ao menos 24 h para reenviar |
| 131051 | Tipo de mensagem não suportado (numa mensagem recebida) |
Os códigos próprios da Synergy (faixa 139xxxx) estão em Erros. Em caso de dúvida sobre um código da Meta, vale a documentação de códigos de erro da Cloud API.
{
"error": {
"message": "Re-engagement message",
"code": 131047,
"fbtrace_id": "AbC"
}
}{
"statuses": [
{
"id": "wamid.HBgNNTUxMTk5OTk5OTk5ORUCABEYEjdGQjI0QzE4RTlBMDVENzQxAA==",
"status": "failed",
"timestamp": "1767225600",
"recipient_id": "5511999999999",
"errors": [
{
"code": 131047,
"title": "Re-engagement message",
"message": "Re-engagement message",
"error_data": {
"details": "Message failed to send because more than 24 hours have passed since the customer last replied to this number."
},
"href": "https://developers.facebook.com/docs/whatsapp/cloud-api/support/error-codes/"
}
]
}
]
}Como tratar no seu sistema#
Tente a mensagem livre e, se a Meta responder 131047, reenvie como modelo. O envio por modelo não precisa da janela (Modelos de mensagem (templates)).
Trate também o failed do webhook: um envio aceito (200) pode falhar depois com o mesmo código. Use o id do status para achar a mensagem e reenviar como modelo (Receber mensagens e status). Use uma Idempotency-Key diferente no reenvio, porque é outra requisição (Enviar mensagens).
JavaScript
async function post(body) {
return fetch('https://api.synergyconnect.com.br/v25.0/106540352242922/messages', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.SYNERGY_API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify(body),
});
}
async function notify(to, text, fallbackTemplate) {
let res = await post({ messaging_product: 'whatsapp', to, type: 'text', text: { body: text } });
if (res.status === 400 && (await res.clone().json()).error?.code === 131047) {
// fora da janela: só um modelo aprovado
res = await post({ messaging_product: 'whatsapp', to, type: 'template', template: fallbackTemplate });
}
return res;
}Python
import os
import requests
URL = "https://api.synergyconnect.com.br/v25.0/106540352242922/messages"
HEADERS = {"Authorization": f"Bearer {os.environ['SYNERGY_API_KEY']}"}
def notify(to, text, fallback_template):
res = requests.post(URL, headers=HEADERS, json={"messaging_product": "whatsapp", "to": to, "type": "text", "text": {"body": text}})
if res.status_code == 400 and res.json().get("error", {}).get("code") == 131047:
# fora da janela: só um modelo aprovado
res = requests.post(URL, headers=HEADERS, json={"messaging_product": "whatsapp", "to": to, "type": "template", "template": fallback_template})
return resO que não depende da janela#
Um modelo vale dentro e fora dela. Todo o resto depende da janela aberta.
Cobrança#
A janela de 24 h decide o que você pode enviar sem modelo, mas não isenta de cobrança. Desde 1º de outubro de 2026, a Meta cobra por mensagem toda mensagem que não é modelo (texto, mídia, interativas, botões, listas e Flow) como mensagem de serviço, seja enviada por uma pessoa, um bot ou uma automação. Modelos de utilidade dentro da janela também são cobrados. A Meta dá 1.000 mensagens de serviço gratuitas por mês, por número conectado; passou disso, ela cobra o excedente direto na conta do cliente na Meta (a forma de pagamento fica cadastrada lá). Fora essa franquia, só é gratuito o que vai dentro da janela de 72 h de entrada gratuita, que vale apenas para quem veio de um anúncio direto para o WhatsApp (Click-to-WhatsApp ou botão de CTA do Facebook). A Synergy não cobra essas taxas: elas vão direto da sua conta para a Meta. Valores e regras atuais: preços de mensagens não-template da Meta.
Ficou com dúvida? Escreva para suporte@synergyconnect.com.br.