{
  "name": "Wafly HTTP — conferir webhook sem responder (Cloud ou self-hosted)",
  "active": false,
  "nodes":[
    {"id":"webhook","name":"Webhook de teste privado","type":"n8n-nodes-base.webhook","typeVersion":2,"position":[0,0],"parameters":{"httpMethod":"POST","path":"wafly-teste-TROQUE_POR_SEGREDO_ALEATORIO","responseMode":"responseNode","options":{}}},
    {"id":"validate","name":"Conferir evento da instância própria","type":"n8n-nodes-base.code","typeVersion":2,"position":[250,0],"parameters":{"jsCode":"// Configure somente a sua instância de homologação.\nconst expectedInstance = 'SUA_INSTANCIA';\nif (expectedInstance === 'SUA_INSTANCIA') throw new Error('Configure a instância própria antes de ativar.');\nconst b = $input.first().json.body;\nconst accepted = Boolean(b && typeof b === 'object' && !Array.isArray(b) && b.instanceId === expectedInstance && b.type === 'ReceivedCallback' && b.fromMe === false && b.isGroup === false && b.isNewsletter !== true && b.isEdit !== true && b.isStatusReply !== true && b.broadcast !== true && typeof b.messageId === 'string' && b.messageId.length > 0 && typeof b.text?.message === 'string' && b.text.message.trim());\n// Não devolve telefone/texto/credenciais. Sem envio, IA, cobrança ou contagem de pessoas.\nreturn [{json:{accepted, reason:accepted ? 'texto_individual_validado' : 'evento_ignorado'}}];"}},
    {"id":"respond","name":"Confirmar somente o diagnóstico","type":"n8n-nodes-base.respondToWebhook","typeVersion":1.4,"position":[520,0],"parameters":{"respondWith":"json","responseBody":"={{ JSON.stringify($json) }}","options":{"responseCode":200}}},
    {"id":"note","name":"Limites do exemplo","type":"n8n-nodes-base.stickyNote","typeVersion":1,"position":[0,-400],"parameters":{"width":800,"height":340,"content":"## Receber sem disparar respostas\n1. Importe desativado. Troque o caminho do Webhook por segredo aleatório longo e configure SUA_INSTANCIA no Code. O segredo na URL é barreira compartilhada, não assinatura do provedor. Não publique a URL em prints/logs.\n2. Comece por Listen for test event e JSON sintético. Nunca rotule esse teste como lead real.\n3. Para callback real, valide HTTPS, proteção de borda e acesso. Preserve o callback anterior e configure somente a sua instância de homologação. Guia: https://wafly.com.br/tutoriais/webhook-whatsapp/\n4. Production URL exige workflow ativo; Test URL vale só durante escuta.\n5. Envie uma resposta nova do seu próprio aparelho. accepted:true confirma apenas este payload/contrato. Não autentica a origem por assinatura nem comprova entrega de uma mensagem enviada.\nO exemplo não armazena/deduplica eventos, não responde ao contato e não chama IA. Em produção, implemente persistência/idempotência por instanceId+messageId e política de retenção antes de ligar ações. Repetições podem gerar vários diagnósticos; não são pessoas diferentes. Restaurar o callback anterior ao terminar. Sem Header Auth no Webhook: o contrato atual não oferece assinatura comprovada; não fingir autenticação."}}
  ],
  "connections":{"Webhook de teste privado":{"main":[[{"node":"Conferir evento da instância própria","type":"main","index":0}]]},"Conferir evento da instância própria":{"main":[[{"node":"Confirmar somente o diagnóstico","type":"main","index":0}]]}},
  "settings":{"executionOrder":"v1","saveDataErrorExecution":"none","saveDataSuccessExecution":"none","saveManualExecutions":false,"saveExecutionProgress":false},
  "pinData":{},
  "tags":[]
}
