Diferente do webhook receiver — onde você envia ao Retuno — nos callbacks o Retuno envia ao seu SaaS quando o agente precisa executar uma ação durante a conversa.
Para o contexto de uso e configuração no painel, veja o guia Callbacks.
Endpoint
Você expõe uma URL HTTPS no seu SaaS. A URL é registrada em Configurações → Callbacks no painel junto com um secret opcional e a lista de ações habilitadas.
- Método:
POST.
Content-Type: application/json.
- Timeout: 5 segundos. Se o Retuno não receber resposta nesse prazo, considera a ação falha.
Autenticação (HMAC)
Quando você configura um secret no painel, toda requisição inclui o header:
X-Retuno-Signature: sha256=<hmac>
Onde <hmac> é o HMAC-SHA256 do corpo cru da requisição, calculado com o secret.
Sem secret configurado, o header não é enviado. Nesse caso, proteja o endpoint por outros meios (IP allowlist, rota com token em URL, etc.).
Exemplo de verificação em Node.js:
import crypto from "node:crypto";
function verifyRetunoSignature(rawBody, signatureHeader, secret) {
const expected = "sha256=" + crypto
.createHmac("sha256", secret)
.update(rawBody)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signatureHeader)
);
}
Use comparação em tempo constante (timingSafeEqual) para evitar ataques de timing.
Ações suportadas
| Ação | Descrição |
|---|
apply_discount | Aplicar um desconto no plano do cliente. |
extend_trial | Estender o período gratuito do cliente. |
Ações habilitadas por conta são controladas no painel. Uma ação desabilitada nunca é enviada ao seu endpoint, mesmo que o agente proponha na conversa.
Payload de ação real
{
"action": "apply_discount",
"userId": "usr_42",
"value": 10,
"conversationId": "cnv_01HK9T7F2E6QZ0ABCD1234"
}
| Campo | Tipo | Descrição |
|---|
action | string | "apply_discount" ou "extend_trial". |
userId | string | Identificador do cliente final dentro do Retuno. |
value | number | Percentual quando apply_discount (ex.: 10 = 10%); dias quando extend_trial (ex.: 7 = 7 dias). |
conversationId | string | Identificador da conversa em que a ação foi decidida. Útil para idempotência no seu lado. |
Payload de teste
O botão Testar conexão no painel dispara um payload especial:
{
"action": "test",
"timestamp": "2026-04-23T14:30:00.000Z",
"organizationId": "org_9001"
}
Seu endpoint deve tratar esse payload sem efeito colateral — não aplicar desconto, não estender trial — e retornar 2xx. O Retuno usa a resposta para marcar o callback como Verificado no painel.
Resposta esperada
2xx — o Retuno considera a ação aplicada com sucesso; o agente confirma ao cliente na conversa.
- Qualquer outra resposta (incluindo 4xx e 5xx) ou timeout após 5s — o Retuno considera falha; o agente não confirma ao cliente e a conversa tende a escalar para humano conforme Modo Supervisão e Guardrails.
Recomendações de segurança
- Valide a assinatura HMAC sempre que o secret estiver configurado.
- Torne o endpoint idempotente usando
conversationId como chave de deduplicação — evite aplicar o mesmo desconto duas vezes caso haja reentrega.
- Responda rapidamente — o timeout é curto; use fila assíncrona se a ação depender de processamento demorado.
- Habilite apenas as ações que seu sistema sabe executar — não habilite
extend_trial se seu produto não tem trial.