{"id":140,"date":"2026-10-25T12:58:34","date_gmt":"2026-10-25T12:58:34","guid":{"rendered":"https:\/\/vectalk.com.br\/blog\/testar-webhook-whatsapp-localmente\/"},"modified":"2026-10-25T13:09:51","modified_gmt":"2026-10-25T13:09:51","slug":"testar-webhook-whatsapp-localmente","status":"publish","type":"post","link":"https:\/\/vectalk.com.br\/blog\/testar-webhook-whatsapp-localmente\/","title":{"rendered":"Como testar o webhook do WhatsApp localmente com ngrok"},"content":{"rendered":"\n<p><em>Atualizado em 25\/10\/2026<\/em><\/p>\n\n\n\n<p>Para testar o webhook do WhatsApp localmente, rode seu servidor na m\u00e1quina, exponha a porta com um t\u00fanel HTTPS (ngrok ou cloudflared) e cadastre a URL p\u00fablica como Callback URL no painel do app da Meta. O servidor precisa responder ao GET de verifica\u00e7\u00e3o devolvendo o <code>hub.challenge<\/code> e, nos POSTs, validar o cabe\u00e7alho <code>X-Hub-Signature-256<\/code> com o segredo do app. Com isso, voc\u00ea v\u00ea os eventos reais chegando no seu terminal, sem deploy.<\/p>\n\n\n\n<p>Este guia traz um servidor Node.js completo, os comandos dos dois t\u00faneis, o bot\u00e3o de teste do painel da Meta e os erros mais comuns nessa etapa.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Por que precisa de t\u00fanel<\/h2>\n\n\n\n<p>A Meta s\u00f3 entrega webhooks para uma URL p\u00fablica com HTTPS. A <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/webhooks\/create-webhook-endpoint\" target=\"_blank\" rel=\"noreferrer noopener\">documenta\u00e7\u00e3o de webhooks<\/a> exige um certificado TLS v\u00e1lido e diz que certificados autoassinados n\u00e3o s\u00e3o aceitos. <code>http:\/\/localhost:3000<\/code> n\u00e3o atende a nenhum dos dois requisitos.<\/p>\n\n\n\n<p>Um t\u00fanel resolve isso: o agente roda na sua m\u00e1quina, abre uma conex\u00e3o de sa\u00edda com o servi\u00e7o e recebe uma URL p\u00fablica com HTTPS que encaminha as requisi\u00e7\u00f5es para a sua porta local. N\u00e3o \u00e9 preciso abrir porta no roteador nem ter IP fixo.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Ferramenta<\/th><th>Comando<\/th><th>URL gerada<\/th><th>Observa\u00e7\u00f5es<\/th><\/tr><\/thead><tbody><tr><td>ngrok<\/td><td><code>ngrok http 3000<\/code><\/td><td>HTTPS, mostrada no console do agente<\/td><td>Pede conta e authtoken; tem inspetor de tr\u00e1fego e reenvio de requisi\u00e7\u00f5es<\/td><\/tr><tr><td>cloudflared (Quick Tunnel)<\/td><td><code>cloudflared tunnel --url http:\/\/localhost:3000<\/code><\/td><td>Subdom\u00ednio tempor\u00e1rio em <code>trycloudflare.com<\/code><\/td><td>N\u00e3o pede conta; o endere\u00e7o muda a cada execu\u00e7\u00e3o; uso s\u00f3 para teste<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Como a Meta conversa com o seu endpoint<\/h2>\n\n\n\n<p>S\u00e3o duas requisi\u00e7\u00f5es diferentes na mesma URL:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>GET de verifica\u00e7\u00e3o.<\/strong> Quando voc\u00ea salva ou edita a Callback URL ou o token de verifica\u00e7\u00e3o no painel, a Meta manda um GET com <code>hub.mode=subscribe<\/code>, <code>hub.challenge<\/code> (texto aleat\u00f3rio) e <code>hub.verify_token<\/code> (o valor que voc\u00ea digitou no painel). Se o token confere, responda <code>200<\/code> com o valor de <code>hub.challenge<\/code> no corpo. Se n\u00e3o confere, responda <code>403<\/code> ou outro c\u00f3digo diferente de 200.<\/li>\n\n\n<li><strong>POST de eventos.<\/strong> Cada mensagem recebida ou mudan\u00e7a de status chega como JSON, com o cabe\u00e7alho <code>X-Hub-Signature-256: sha256=&lt;hash&gt;<\/code>. O hash \u00e9 um HMAC-SHA256 do corpo, com o segredo do app como chave. Responda <code>200<\/code> para confirmar.<\/li>\n\n<\/ol>\n\n\n\n<p>Se o POST falhar, a Meta tenta de novo na hora e depois v\u00e1rias vezes, com frequ\u00eancia decrescente, por at\u00e9 7 dias. Entregas n\u00e3o confirmadas nesse prazo s\u00e3o descartadas. Por isso, o mesmo evento pode chegar mais de uma vez, e o servidor precisa deduplicar. A Meta tamb\u00e9m avisa que n\u00e3o h\u00e1 API para buscar webhooks antigos: guarde o que receber.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Servidor Node.js de teste<\/h2>\n\n\n\n<p>O exemplo usa Express. O ponto mais importante \u00e9 guardar o <strong>corpo bruto<\/strong> da requisi\u00e7\u00e3o para calcular a assinatura. Se voc\u00ea calcular o HMAC sobre um JSON reserializado, os bytes podem mudar e a compara\u00e7\u00e3o falha.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-bash\">mkdir webhook-local &amp;&amp; cd webhook-local\nnpm init -y\nnpm install express<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-js\">\/\/ server.js\nimport express from 'express';\nimport crypto from 'node:crypto';\n\nconst { VERIFY_TOKEN, APP_SECRET, PORT = 3000 } = process.env;\nconst app = express();\n\n\/\/ Guarda o corpo bruto para validar a assinatura\napp.use(express.json({\n  verify: (req, _res, buf) =&gt; { req.rawBody = buf; }\n}));\n\n\/\/ 1) Verifica\u00e7\u00e3o (GET)\napp.get('\/webhook', (req, res) =&gt; {\n  const mode = req.query['hub.mode'];\n  const token = req.query['hub.verify_token'];\n  const challenge = req.query['hub.challenge'];\n\n  if (mode === 'subscribe' &amp;&amp; token === VERIFY_TOKEN) {\n    console.log('Webhook verificado');\n    return res.status(200).send(challenge);\n  }\n  return res.sendStatus(403);\n});\n\n\/\/ 2) Eventos (POST)\napp.post('\/webhook', (req, res) =&gt; {\n  const header = req.get('x-hub-signature-256') || '';\n  const expected = 'sha256=' + crypto\n    .createHmac('sha256', APP_SECRET)\n    .update(req.rawBody || '')\n    .digest('hex');\n\n  const valid = header.length === expected.length &amp;&amp;\n    crypto.timingSafeEqual(Buffer.from(header), Buffer.from(expected));\n\n  if (!valid) {\n    console.warn('Assinatura inv\u00e1lida');\n    return res.sendStatus(401);\n  }\n\n  res.sendStatus(200); \/\/ confirma r\u00e1pido\n\n  for (const entry of req.body.entry || []) {\n    for (const change of entry.changes || []) {\n      const v = change.value || {};\n      for (const m of v.messages || []) console.log('mensagem', m.from, m.type, m.id);\n      for (const s of v.statuses || []) console.log('status', s.id, s.status);\n    }\n  }\n});\n\napp.listen(PORT, () =&gt; console.log(`Ouvindo em http:\/\/localhost:${PORT}`));<\/code><\/pre>\n\n\n\n<p>Para rodar, adicione <code>\"type\": \"module\"<\/code> no <code>package.json<\/code> e inicie com as vari\u00e1veis:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-bash\">VERIFY_TOKEN=um-texto-que-voce-escolhe APP_SECRET=segredo_do_app node server.js<\/code><\/pre>\n\n\n\n<p>O <code>VERIFY_TOKEN<\/code> \u00e9 qualquer texto que voc\u00ea define e repete no painel. O <code>APP_SECRET<\/code> \u00e9 a chave secreta do app, em <strong>Configura\u00e7\u00f5es do app \u2192 B\u00e1sico<\/strong> no painel de desenvolvedores. Nunca coloque essa chave no reposit\u00f3rio.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Passo a passo com ngrok<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Crie uma conta no ngrok e instale o agente (no macOS, <code>brew install ngrok<\/code>).<\/li>\n\n\n<li>Conecte o agente \u00e0 conta:<\/li>\n\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-bash\">ngrok config add-authtoken SEU_AUTHTOKEN<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Com o servidor rodando na porta 3000, abra o t\u00fanel:<\/li>\n\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-bash\">ngrok http 3000<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Copie a URL HTTPS de encaminhamento que aparece no console.<\/li>\n\n\n<li>No painel do app da Meta, v\u00e1 em <strong>WhatsApp \u2192 Webhooks \u2192 Configura\u00e7\u00e3o<\/strong> (o nome do menu pode variar), cole <code>https:\/\/SUA-URL\/webhook<\/code> em <strong>Callback URL<\/strong>, digite o mesmo <code>VERIFY_TOKEN<\/code> em <strong>Token de verifica\u00e7\u00e3o<\/strong> e clique em <strong>Verificar e salvar<\/strong>. O terminal deve mostrar &#8220;Webhook verificado&#8221;.<\/li>\n\n\n<li>Na lista de campos, assine o campo <code>messages<\/code>.<\/li>\n\n\n<li>Clique em <strong>Testar<\/strong> ao lado de <code>messages<\/code>. A Meta envia um payload de exemplo, que deve aparecer no seu terminal. Segundo o <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/webhooks\/set-up-whatsapp-echo-bot\" target=\"_blank\" rel=\"noreferrer noopener\">guia de webhook de teste da Meta<\/a>, o teste do campo <code>messages<\/code> funciona com o app em modo de desenvolvimento ou publicado.<\/li>\n\n\n<li>Mande uma mensagem real do seu celular para o n\u00famero de teste ou de produ\u00e7\u00e3o conectado ao app e veja o evento chegar.<\/li>\n\n<\/ol>\n\n\n\n<p>O agente do ngrok tem um inspetor de tr\u00e1fego, normalmente em <code>http:\/\/localhost:4040<\/code>, que mostra cabe\u00e7alhos, corpo e resposta de cada requisi\u00e7\u00e3o. Com o modo de captura completa ativado na conta, o <a href=\"https:\/\/ngrok.com\/docs\/obs\/traffic-inspection\" target=\"_blank\" rel=\"noreferrer noopener\">Traffic Inspector<\/a> permite reenviar uma requisi\u00e7\u00e3o para o seu servidor sem esperar a Meta, o que acelera muito a depura\u00e7\u00e3o do parser.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Passo a passo com cloudflared<\/h2>\n\n\n\n<p>Se n\u00e3o quiser criar conta, o Quick Tunnel da Cloudflare resolve para testes r\u00e1pidos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-bash\">cloudflared tunnel --url http:\/\/localhost:3000<\/code><\/pre>\n\n\n\n<p>O comando imprime uma URL em <code>trycloudflare.com<\/code>. Use-a no painel da Meta do mesmo jeito. Pela <a href=\"https:\/\/developers.cloudflare.com\/cloudflare-one\/networks\/connectors\/cloudflare-tunnel\/do-more-with-tunnels\/trycloudflare\/\" target=\"_blank\" rel=\"noreferrer noopener\">documenta\u00e7\u00e3o da Cloudflare<\/a>, o Quick Tunnel \u00e9 para teste e desenvolvimento, n\u00e3o tem garantia de disponibilidade, aceita at\u00e9 200 requisi\u00e7\u00f5es simult\u00e2neas e gera um endere\u00e7o novo a cada execu\u00e7\u00e3o. Como a URL muda, voc\u00ea precisa refazer a verifica\u00e7\u00e3o no painel toda vez que reiniciar o t\u00fanel.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Erros comuns e como resolver<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Sintoma<\/th><th>Causa prov\u00e1vel<\/th><th>Como resolver<\/th><\/tr><\/thead><tbody><tr><td>&#8220;N\u00e3o foi poss\u00edvel validar a URL de callback&#8221; no painel<\/td><td>Token diferente, servidor fora do ar, rota errada ou resposta com JSON em vez do texto do challenge<\/td><td>Responda s\u00f3 o valor de <code>hub.challenge<\/code>, com status 200, na rota exata cadastrada<\/td><\/tr><tr><td>GET de verifica\u00e7\u00e3o funciona, mas nenhum POST chega<\/td><td>Campo <code>messages<\/code> n\u00e3o assinado, ou a conta do WhatsApp n\u00e3o est\u00e1 ligada ao app<\/td><td>Assine o campo e confira o app vinculado \u00e0 conta<\/td><\/tr><tr><td>Toda assinatura d\u00e1 inv\u00e1lida<\/td><td>HMAC calculado sobre JSON reserializado, segredo errado ou cabe\u00e7alho sem o prefixo <code>sha256=<\/code><\/td><td>Use o corpo bruto e o segredo do app (n\u00e3o o token de acesso)<\/td><\/tr><tr><td>O mesmo evento chega v\u00e1rias vezes<\/td><td>Resposta lenta ou diferente de 200, gerando novas tentativas<\/td><td>Responda 200 antes de processar e deduplique pelo <code>id<\/code><\/td><\/tr><tr><td>Parou de funcionar depois de reiniciar o t\u00fanel<\/td><td>A URL p\u00fablica mudou<\/td><td>Atualize a Callback URL e verifique de novo<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Um cuidado extra: o webhook \u00e9 configurado por app. Se voc\u00ea apontar a Callback URL do app de produ\u00e7\u00e3o para a sua m\u00e1quina, a produ\u00e7\u00e3o para de receber eventos. Use um app de desenvolvimento separado para testes locais.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Do teste para a produ\u00e7\u00e3o<\/h2>\n\n\n\n<p>O t\u00fanel \u00e9 ferramenta de desenvolvimento. Em produ\u00e7\u00e3o, o endpoint precisa de dom\u00ednio pr\u00f3prio, certificado v\u00e1lido, fila para processar os eventos fora da requisi\u00e7\u00e3o e armazenamento dos payloads. O artigo <a href=\"https:\/\/vectalk.com.br\/blog\/webhook-whatsapp-api\/\">webhooks da API do WhatsApp<\/a> cobre a arquitetura, e o guia de <a href=\"https:\/\/vectalk.com.br\/blog\/status-mensagem-webhook-whatsapp\/\">status de mensagem<\/a> mostra como tratar <code>sent<\/code>, <code>delivered<\/code>, <code>read<\/code> e <code>failed<\/code>. Quando o webhook trouxer erros, a tabela de <a href=\"https:\/\/vectalk.com.br\/blog\/erros-api-whatsapp\/\">erros da API do WhatsApp<\/a> ajuda a decidir o que fazer. Se o app estiver usando um token tempor\u00e1rio, troque por um <a href=\"https:\/\/vectalk.com.br\/blog\/token-permanente-api-whatsapp\/\">token permanente<\/a> antes de publicar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Como isso funciona na Vectalk<\/h2>\n\n\n\n<p>Na Vectalk, os eventos s\u00e3o os mesmos da Meta, no mesmo formato <code>entry[].changes[].value<\/code>, ent\u00e3o o parser do exemplo acima serve sem mudan\u00e7as. O que muda \u00e9 o cadastro: em vez do painel da Meta, voc\u00ea registra a URL por API, com <code>instance_id<\/code>, <code>url<\/code> (HTTPS) e <code>name<\/code>, e pode ter v\u00e1rias URLs por inst\u00e2ncia, todas recebendo o mesmo evento.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-bash\">curl -X POST https:\/\/apis.vectalk.com.br\/api\/webhooks \\\n  -H \"Authorization: Bearer SEU_TOKEN\" \\\n  -H \"Content-Type: application\/json\" \\\n  -d '{\n    \"instance_id\": \"SUA_INSTANCIA\",\n    \"url\": \"https:\/\/SUA-URL-DO-TUNEL\/webhook\",\n    \"name\": \"Dev local\"\n  }'<\/code><\/pre>\n\n\n\n<p>Isso permite registrar a URL do t\u00fanel como um webhook extra, sem tirar o de produ\u00e7\u00e3o, e desativ\u00e1-lo depois com <code>active: false<\/code> no endpoint de <a href=\"https:\/\/docs.vectalk.com.br\/api-reference\/webhooks\/update\">atualizar webhook<\/a>. A Vectalk espera <code>200<\/code> em menos de 20 segundos e reenvia o evento se n\u00e3o receber, segundo a <a href=\"https:\/\/docs.vectalk.com.br\/concepts\/webhooks\">documenta\u00e7\u00e3o de webhooks<\/a>. Antes de exigir valida\u00e7\u00e3o de assinatura nesse fluxo, confira na documenta\u00e7\u00e3o e no inspetor do t\u00fanel quais cabe\u00e7alhos chegam.<\/p>\n\n\n\n<p>Crie sua conta em <a href=\"https:\/\/apps.vectalk.com.br\/register\">apps.vectalk.com.br\/register<\/a>. Para a vis\u00e3o geral da plataforma, veja o guia da <a href=\"https:\/\/vectalk.com.br\/blog\/api-oficial-do-whatsapp\/\">API oficial do WhatsApp<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Perguntas frequentes<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Posso cadastrar http:\/\/localhost como webhook do WhatsApp?<\/h3>\n\n\n\n<p>N\u00e3o. A Meta exige uma URL p\u00fablica com HTTPS e certificado v\u00e1lido. Para testar na sua m\u00e1quina, use um t\u00fanel como ngrok ou cloudflared.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">O que devo responder no GET de verifica\u00e7\u00e3o?<\/h3>\n\n\n\n<p>Status 200 com o valor de <code>hub.challenge<\/code> no corpo, sem JSON e sem aspas, desde que <code>hub.verify_token<\/code> seja igual ao token que voc\u00ea cadastrou.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Qual segredo uso para validar o X-Hub-Signature-256?<\/h3>\n\n\n\n<p>A chave secreta do app (App Secret), n\u00e3o o token de acesso nem o token de verifica\u00e7\u00e3o. O hash \u00e9 HMAC-SHA256 do corpo da requisi\u00e7\u00e3o, comparado ao valor depois de <code>sha256=<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Por que recebo o mesmo webhook duas vezes?<\/h3>\n\n\n\n<p>Porque a Meta tenta reenviar quando n\u00e3o recebe 200, por at\u00e9 7 dias. Responda r\u00e1pido e deduplique pelo <code>id<\/code> da mensagem ou do status.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">D\u00e1 para usar o ngrok em produ\u00e7\u00e3o?<\/h3>\n\n\n\n<p>Ele \u00e9 pensado para expor servi\u00e7os locais em desenvolvimento. Para produ\u00e7\u00e3o, hospede o endpoint em um servidor com dom\u00ednio e certificado pr\u00f3prios.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Fontes oficiais consultadas em 25\/10\/2026:<\/strong> <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/webhooks\/create-webhook-endpoint\" target=\"_blank\" rel=\"noreferrer noopener\">Criar endpoint de webhook (WhatsApp)<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/webhooks\/set-up-whatsapp-echo-bot\" target=\"_blank\" rel=\"noreferrer noopener\">Webhook de teste com echo bot<\/a>, <a href=\"https:\/\/developers.facebook.com\/docs\/graph-api\/webhooks\/getting-started\" target=\"_blank\" rel=\"noreferrer noopener\">Webhooks da Graph API: primeiros passos<\/a>, <a href=\"https:\/\/ngrok.com\/docs\/share-localhost\/quickstart\" target=\"_blank\" rel=\"noreferrer noopener\">ngrok: Share Localhost Quickstart<\/a>, <a href=\"https:\/\/ngrok.com\/docs\/share-localhost\/webhooks\" target=\"_blank\" rel=\"noreferrer noopener\">ngrok: Test Webhooks Locally<\/a>, <a href=\"https:\/\/ngrok.com\/docs\/obs\/traffic-inspection\" target=\"_blank\" rel=\"noreferrer noopener\">ngrok: Traffic Inspector<\/a>, <a href=\"https:\/\/developers.cloudflare.com\/cloudflare-one\/networks\/connectors\/cloudflare-tunnel\/do-more-with-tunnels\/trycloudflare\/\" target=\"_blank\" rel=\"noreferrer noopener\">Cloudflare Quick Tunnels<\/a>, <a href=\"https:\/\/docs.vectalk.com.br\/concepts\/webhooks\">Webhooks na documenta\u00e7\u00e3o da Vectalk<\/a>, <a href=\"https:\/\/docs.vectalk.com.br\/api-reference\/webhooks\/update\">Atualizar webhook na documenta\u00e7\u00e3o da Vectalk<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Passo a passo para receber os webhooks da API do WhatsApp no localhost com ngrok ou cloudflared, validar o hub.challenge e conferir a assinatura X-Hub-Signature-256.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[8],"tags":[],"class_list":["post-140","post","type-post","status-publish","format-standard","hentry","category-uncategorized-pt"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Testar webhook do WhatsApp localmente com ngrok | Vectalk<\/title>\n<meta name=\"description\" content=\"Como testar webhook do WhatsApp na sua m\u00e1quina: t\u00fanel com ngrok ou cloudflared, verifica\u00e7\u00e3o hub.challenge e assinatura X-Hub-Signature-256 em Node.js.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vectalk.com.br\/blog\/testar-webhook-whatsapp-localmente\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Testar webhook do WhatsApp localmente com ngrok | Vectalk\" \/>\n<meta property=\"og:description\" content=\"Como testar webhook do WhatsApp na sua m\u00e1quina: t\u00fanel com ngrok ou cloudflared, verifica\u00e7\u00e3o hub.challenge e assinatura X-Hub-Signature-256 em Node.js.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vectalk.com.br\/blog\/testar-webhook-whatsapp-localmente\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog Vectalk\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-25T12:58:34+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-25T13:09:51+00:00\" \/>\n<meta name=\"author\" content=\"wanderleyfcunha\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"wanderleyfcunha\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/testar-webhook-whatsapp-localmente\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/testar-webhook-whatsapp-localmente\\\/\"},\"author\":{\"name\":\"wanderleyfcunha\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/ff36ecd9d8257856f227f8e5d639db2b\"},\"headline\":\"Como testar o webhook do WhatsApp localmente com ngrok\",\"datePublished\":\"2026-10-25T12:58:34+00:00\",\"dateModified\":\"2026-10-25T13:09:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/testar-webhook-whatsapp-localmente\\\/\"},\"wordCount\":1506,\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/testar-webhook-whatsapp-localmente\\\/\",\"url\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/testar-webhook-whatsapp-localmente\\\/\",\"name\":\"Testar webhook do WhatsApp localmente com ngrok | Vectalk\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#website\"},\"datePublished\":\"2026-10-25T12:58:34+00:00\",\"dateModified\":\"2026-10-25T13:09:51+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/ff36ecd9d8257856f227f8e5d639db2b\"},\"description\":\"Como testar webhook do WhatsApp na sua m\u00e1quina: t\u00fanel com ngrok ou cloudflared, verifica\u00e7\u00e3o hub.challenge e assinatura X-Hub-Signature-256 em Node.js.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/testar-webhook-whatsapp-localmente\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/testar-webhook-whatsapp-localmente\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/testar-webhook-whatsapp-localmente\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Como testar o webhook do WhatsApp localmente com ngrok\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/\",\"name\":\"Blog Vectalk\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/ff36ecd9d8257856f227f8e5d639db2b\",\"name\":\"wanderleyfcunha\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g\",\"caption\":\"wanderleyfcunha\"},\"sameAs\":[\"https:\\\/\\\/vectalk.com.br\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Testar webhook do WhatsApp localmente com ngrok | Vectalk","description":"Como testar webhook do WhatsApp na sua m\u00e1quina: t\u00fanel com ngrok ou cloudflared, verifica\u00e7\u00e3o hub.challenge e assinatura X-Hub-Signature-256 em Node.js.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vectalk.com.br\/blog\/testar-webhook-whatsapp-localmente\/","og_locale":"en_US","og_type":"article","og_title":"Testar webhook do WhatsApp localmente com ngrok | Vectalk","og_description":"Como testar webhook do WhatsApp na sua m\u00e1quina: t\u00fanel com ngrok ou cloudflared, verifica\u00e7\u00e3o hub.challenge e assinatura X-Hub-Signature-256 em Node.js.","og_url":"https:\/\/vectalk.com.br\/blog\/testar-webhook-whatsapp-localmente\/","og_site_name":"Blog Vectalk","article_published_time":"2026-10-25T12:58:34+00:00","article_modified_time":"2026-10-25T13:09:51+00:00","author":"wanderleyfcunha","twitter_card":"summary_large_image","twitter_misc":{"Written by":"wanderleyfcunha","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vectalk.com.br\/blog\/testar-webhook-whatsapp-localmente\/#article","isPartOf":{"@id":"https:\/\/vectalk.com.br\/blog\/testar-webhook-whatsapp-localmente\/"},"author":{"name":"wanderleyfcunha","@id":"https:\/\/vectalk.com.br\/blog\/#\/schema\/person\/ff36ecd9d8257856f227f8e5d639db2b"},"headline":"Como testar o webhook do WhatsApp localmente com ngrok","datePublished":"2026-10-25T12:58:34+00:00","dateModified":"2026-10-25T13:09:51+00:00","mainEntityOfPage":{"@id":"https:\/\/vectalk.com.br\/blog\/testar-webhook-whatsapp-localmente\/"},"wordCount":1506,"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/vectalk.com.br\/blog\/testar-webhook-whatsapp-localmente\/","url":"https:\/\/vectalk.com.br\/blog\/testar-webhook-whatsapp-localmente\/","name":"Testar webhook do WhatsApp localmente com ngrok | Vectalk","isPartOf":{"@id":"https:\/\/vectalk.com.br\/blog\/#website"},"datePublished":"2026-10-25T12:58:34+00:00","dateModified":"2026-10-25T13:09:51+00:00","author":{"@id":"https:\/\/vectalk.com.br\/blog\/#\/schema\/person\/ff36ecd9d8257856f227f8e5d639db2b"},"description":"Como testar webhook do WhatsApp na sua m\u00e1quina: t\u00fanel com ngrok ou cloudflared, verifica\u00e7\u00e3o hub.challenge e assinatura X-Hub-Signature-256 em Node.js.","breadcrumb":{"@id":"https:\/\/vectalk.com.br\/blog\/testar-webhook-whatsapp-localmente\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vectalk.com.br\/blog\/testar-webhook-whatsapp-localmente\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/vectalk.com.br\/blog\/testar-webhook-whatsapp-localmente\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vectalk.com.br\/blog\/"},{"@type":"ListItem","position":2,"name":"Como testar o webhook do WhatsApp localmente com ngrok"}]},{"@type":"WebSite","@id":"https:\/\/vectalk.com.br\/blog\/#website","url":"https:\/\/vectalk.com.br\/blog\/","name":"Blog Vectalk","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vectalk.com.br\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/vectalk.com.br\/blog\/#\/schema\/person\/ff36ecd9d8257856f227f8e5d639db2b","name":"wanderleyfcunha","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g","caption":"wanderleyfcunha"},"sameAs":["https:\/\/vectalk.com.br\/blog"]}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/posts\/140","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/comments?post=140"}],"version-history":[{"count":2,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/posts\/140\/revisions"}],"predecessor-version":[{"id":393,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/posts\/140\/revisions\/393"}],"wp:attachment":[{"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/media?parent=140"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/categories?post=140"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/tags?post=140"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}