{"id":142,"date":"2026-10-25T12:58:34","date_gmt":"2026-10-25T12:58:34","guid":{"rendered":"https:\/\/vectalk.com.br\/blog\/probar-webhook-whatsapp-localmente\/"},"modified":"2026-10-25T13:09:54","modified_gmt":"2026-10-25T13:09:54","slug":"probar-webhook-whatsapp-localmente","status":"publish","type":"post","link":"https:\/\/vectalk.com.br\/blog\/es\/probar-webhook-whatsapp-localmente\/","title":{"rendered":"C\u00f3mo probar el webhook de WhatsApp localmente con ngrok"},"content":{"rendered":"\n<p><em>Actualizado el 25\/10\/2026<\/em><\/p>\n\n\n\n<p>Para probar el webhook de WhatsApp localmente, ejecuta tu servidor en tu m\u00e1quina, expone el puerto con un t\u00fanel HTTPS (ngrok o cloudflared) y registra la URL p\u00fablica como Callback URL en el panel de la app de Meta. El servidor debe responder al GET de verificaci\u00f3n devolviendo el <code>hub.challenge<\/code> y, en los POST, validar el encabezado <code>X-Hub-Signature-256<\/code> con la clave secreta de la app. As\u00ed ves los eventos reales llegar a tu terminal, sin deploy.<\/p>\n\n\n\n<p>Esta gu\u00eda incluye un servidor Node.js completo, los comandos de los dos t\u00faneles, el bot\u00f3n de prueba del panel de Meta y los errores m\u00e1s comunes en esta etapa.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Por qu\u00e9 necesitas un t\u00fanel<\/h2>\n\n\n\n<p>Meta solo entrega webhooks a una URL p\u00fablica con HTTPS. La <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/webhooks\/create-webhook-endpoint\" target=\"_blank\" rel=\"noreferrer noopener\">documentaci\u00f3n de webhooks<\/a> exige un certificado TLS v\u00e1lido y aclara que no se admiten certificados autofirmados. <code>http:\/\/localhost:3000<\/code> no cumple ninguno de los dos requisitos.<\/p>\n\n\n\n<p>Un t\u00fanel lo resuelve: el agente corre en tu m\u00e1quina, abre una conexi\u00f3n saliente con el servicio y obtiene una URL p\u00fablica con HTTPS que reenv\u00eda las solicitudes a tu puerto local. No hace falta abrir puertos en el router ni tener IP fija.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Herramienta<\/th><th>Comando<\/th><th>URL generada<\/th><th>Observaciones<\/th><\/tr><\/thead><tbody><tr><td>ngrok<\/td><td><code>ngrok http 3000<\/code><\/td><td>HTTPS, se muestra en la consola del agente<\/td><td>Requiere cuenta y authtoken; tiene inspector de tr\u00e1fico y reenv\u00edo de solicitudes<\/td><\/tr><tr><td>cloudflared (Quick Tunnel)<\/td><td><code>cloudflared tunnel --url http:\/\/localhost:3000<\/code><\/td><td>Subdominio temporal en <code>trycloudflare.com<\/code><\/td><td>No requiere cuenta; la direcci\u00f3n cambia en cada ejecuci\u00f3n; solo para pruebas<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">C\u00f3mo se comunica Meta con tu endpoint<\/h2>\n\n\n\n<p>Son dos solicitudes distintas en la misma URL:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>GET de verificaci\u00f3n.<\/strong> Cuando guardas o editas la Callback URL o el token de verificaci\u00f3n en el panel, Meta env\u00eda un GET con <code>hub.mode=subscribe<\/code>, <code>hub.challenge<\/code> (texto aleatorio) y <code>hub.verify_token<\/code> (el valor que escribiste en el panel). Si el token coincide, responde <code>200<\/code> con el valor de <code>hub.challenge<\/code> en el cuerpo. Si no coincide, responde <code>403<\/code> u otro c\u00f3digo distinto de 200.<\/li>\n\n\n<li><strong>POST de eventos.<\/strong> Cada mensaje recibido o cambio de estado llega como JSON, con el encabezado <code>X-Hub-Signature-256: sha256=&lt;hash&gt;<\/code>. El hash es un HMAC-SHA256 del cuerpo, con la clave secreta de la app como llave. Responde <code>200<\/code> para confirmar.<\/li>\n\n<\/ol>\n\n\n\n<p>Si el POST falla, Meta reintenta de inmediato y luego varias veces m\u00e1s, con frecuencia decreciente, durante hasta 7 d\u00edas. Las entregas no confirmadas en ese plazo se descartan. Por eso, el mismo evento puede llegar m\u00e1s de una vez y el servidor debe deduplicar. Meta tambi\u00e9n avisa que no hay API para recuperar webhooks antiguos: guarda lo que recibas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Servidor Node.js de prueba<\/h2>\n\n\n\n<p>El ejemplo usa Express. El detalle clave es guardar el <strong>cuerpo crudo<\/strong> de la solicitud para calcular la firma. Si calculas el HMAC sobre un JSON vuelto a serializar, los bytes pueden cambiar y la comparaci\u00f3n falla.<\/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 el cuerpo crudo para validar la firma\napp.use(express.json({\n  verify: (req, _res, buf) =&gt; { req.rawBody = buf; }\n}));\n\n\/\/ 1) Verificaci\u00f3n (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('Firma 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('mensaje', m.from, m.type, m.id);\n      for (const s of v.statuses || []) console.log('estado', s.id, s.status);\n    }\n  }\n});\n\napp.listen(PORT, () =&gt; console.log(`Escuchando en http:\/\/localhost:${PORT}`));<\/code><\/pre>\n\n\n\n<p>Para ejecutarlo, agrega <code>\"type\": \"module\"<\/code> al <code>package.json<\/code> e in\u00edcialo con las variables:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-bash\">VERIFY_TOKEN=un-texto-que-elijas APP_SECRET=clave_secreta_de_la_app node server.js<\/code><\/pre>\n\n\n\n<p>El <code>VERIFY_TOKEN<\/code> es cualquier texto que defines y repites en el panel. El <code>APP_SECRET<\/code> es la clave secreta de la app, en <strong>Configuraci\u00f3n de la app \u2192 B\u00e1sica<\/strong> del panel de desarrolladores. Nunca la subas al repositorio.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Paso a paso con ngrok<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Crea una cuenta en ngrok e instala el agente (en macOS, <code>brew install ngrok<\/code>).<\/li>\n\n\n<li>Conecta el agente a tu cuenta:<\/li>\n\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-bash\">ngrok config add-authtoken TU_AUTHTOKEN<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Con el servidor corriendo en el puerto 3000, abre el 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>Copia la URL HTTPS de reenv\u00edo que aparece en la consola.<\/li>\n\n\n<li>En el panel de la app de Meta, ve a <strong>WhatsApp \u2192 Webhooks \u2192 Configuraci\u00f3n<\/strong> (el nombre del men\u00fa puede variar), pega <code>https:\/\/TU-URL\/webhook<\/code> en <strong>Callback URL<\/strong>, escribe el mismo <code>VERIFY_TOKEN<\/code> en <strong>Token de verificaci\u00f3n<\/strong> y haz clic en <strong>Verificar y guardar<\/strong>. La terminal deber\u00eda mostrar &#8220;Webhook verificado&#8221;.<\/li>\n\n\n<li>En la lista de campos, suscr\u00edbete al campo <code>messages<\/code>.<\/li>\n\n\n<li>Haz clic en <strong>Probar<\/strong> junto a <code>messages<\/code>. Meta env\u00eda un payload de ejemplo que deber\u00eda aparecer en tu terminal. Seg\u00fan la <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/webhooks\/set-up-whatsapp-echo-bot\" target=\"_blank\" rel=\"noreferrer noopener\">gu\u00eda de webhook de prueba de Meta<\/a>, la prueba del campo <code>messages<\/code> funciona con la app en modo desarrollo o publicada.<\/li>\n\n\n<li>Env\u00eda un mensaje real desde tu celular al n\u00famero de prueba o de producci\u00f3n conectado a la app y mira c\u00f3mo llega el evento.<\/li>\n\n<\/ol>\n\n\n\n<p>El agente de ngrok tiene un inspector de tr\u00e1fico, normalmente en <code>http:\/\/localhost:4040<\/code>, que muestra encabezados, cuerpo y respuesta de cada solicitud. Con el modo de captura completa activado en la cuenta, el <a href=\"https:\/\/ngrok.com\/docs\/obs\/traffic-inspection\" target=\"_blank\" rel=\"noreferrer noopener\">Traffic Inspector<\/a> permite reenviar una solicitud a tu servidor sin esperar a Meta, lo que acelera mucho la depuraci\u00f3n del parser.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Paso a paso con cloudflared<\/h2>\n\n\n\n<p>Si no quieres crear una cuenta, el Quick Tunnel de Cloudflare sirve para pruebas r\u00e1pidas:<\/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>El comando imprime una URL en <code>trycloudflare.com<\/code>. \u00dasala en el panel de Meta de la misma forma. Seg\u00fan la <a href=\"https:\/\/developers.cloudflare.com\/cloudflare-one\/networks\/connectors\/cloudflare-tunnel\/do-more-with-tunnels\/trycloudflare\/\" target=\"_blank\" rel=\"noreferrer noopener\">documentaci\u00f3n de Cloudflare<\/a>, el Quick Tunnel es para pruebas y desarrollo, no tiene garant\u00eda de disponibilidad, admite hasta 200 solicitudes simult\u00e1neas y genera una direcci\u00f3n nueva en cada ejecuci\u00f3n. Como la URL cambia, debes volver a verificar en el panel cada vez que reinicies el t\u00fanel.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Errores comunes y c\u00f3mo resolverlos<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>S\u00edntoma<\/th><th>Causa probable<\/th><th>Soluci\u00f3n<\/th><\/tr><\/thead><tbody><tr><td>&#8220;No se pudo validar la URL de devoluci\u00f3n de llamada&#8221; en el panel<\/td><td>Token distinto, servidor ca\u00eddo, ruta incorrecta o respuesta en JSON en lugar del texto del challenge<\/td><td>Responde solo el valor de <code>hub.challenge<\/code>, con estado 200, en la ruta exacta registrada<\/td><\/tr><tr><td>El GET de verificaci\u00f3n funciona, pero no llega ning\u00fan POST<\/td><td>Campo <code>messages<\/code> sin suscribir, o la cuenta de WhatsApp no est\u00e1 vinculada a la app<\/td><td>Suscr\u00edbete al campo y revisa la app vinculada a la cuenta<\/td><\/tr><tr><td>Todas las firmas salen inv\u00e1lidas<\/td><td>HMAC calculado sobre JSON reserializado, clave equivocada o encabezado comparado sin el prefijo <code>sha256=<\/code><\/td><td>Usa el cuerpo crudo y la clave secreta de la app (no el token de acceso)<\/td><\/tr><tr><td>El mismo evento llega varias veces<\/td><td>Respuesta lenta o distinta de 200, que provoca reintentos<\/td><td>Responde 200 antes de procesar y deduplica por <code>id<\/code><\/td><\/tr><tr><td>Dej\u00f3 de funcionar al reiniciar el t\u00fanel<\/td><td>Cambi\u00f3 la URL p\u00fablica<\/td><td>Actualiza la Callback URL y vuelve a verificar<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Un cuidado m\u00e1s: el webhook se configura por app. Si apuntas la Callback URL de la app de producci\u00f3n a tu m\u00e1quina, producci\u00f3n deja de recibir eventos. Usa una app de desarrollo separada para las pruebas locales.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">De la prueba a producci\u00f3n<\/h2>\n\n\n\n<p>El t\u00fanel es una herramienta de desarrollo. En producci\u00f3n, el endpoint necesita dominio propio, certificado v\u00e1lido, una cola para procesar los eventos fuera de la solicitud y almacenamiento de los payloads. La gu\u00eda de <a href=\"https:\/\/vectalk.com.br\/blog\/es\/estado-mensaje-webhook-whatsapp\/\">estados de mensaje<\/a> muestra c\u00f3mo manejar <code>sent<\/code>, <code>delivered<\/code>, <code>read<\/code> y <code>failed<\/code>. Cuando el webhook traiga errores, la tabla de <a href=\"https:\/\/vectalk.com.br\/blog\/es\/errores-api-whatsapp\/\">errores de la API de WhatsApp<\/a> ayuda a decidir qu\u00e9 hacer. Si la app todav\u00eda usa un token temporal, c\u00e1mbialo por un <a href=\"https:\/\/vectalk.com.br\/blog\/es\/token-permanente-api-whatsapp-es\/\">token permanente<\/a> antes de publicar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">C\u00f3mo funciona con Vectalk<\/h2>\n\n\n\n<p>En Vectalk, los eventos son los mismos de Meta, con el mismo formato <code>entry[].changes[].value<\/code>, as\u00ed que el parser de arriba funciona sin cambios. Lo que cambia es el registro: en lugar del panel de Meta, registras la URL por API con <code>instance_id<\/code>, <code>url<\/code> (HTTPS) y <code>name<\/code>, y puedes tener varias URL por instancia, todas recibiendo el mismo 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 TU_TOKEN\" \\\n  -H \"Content-Type: application\/json\" \\\n  -d '{\n    \"instance_id\": \"TU_INSTANCIA\",\n    \"url\": \"https:\/\/TU-URL-DEL-TUNEL\/webhook\",\n    \"name\": \"Dev local\"\n  }'<\/code><\/pre>\n\n\n\n<p>Esto permite registrar la URL del t\u00fanel como un webhook adicional, sin quitar el de producci\u00f3n, y desactivarlo despu\u00e9s con <code>active: false<\/code> en el endpoint de <a href=\"https:\/\/docs.vectalk.com.br\/api-reference\/webhooks\/update\">actualizar webhook<\/a>. Vectalk espera un <code>200<\/code> en menos de 20 segundos y reenv\u00eda el evento si no lo recibe, seg\u00fan la <a href=\"https:\/\/docs.vectalk.com.br\/concepts\/webhooks\">documentaci\u00f3n de webhooks<\/a>. Antes de exigir validaci\u00f3n de firma en este flujo, revisa en la documentaci\u00f3n y en el inspector del t\u00fanel qu\u00e9 encabezados llegan.<\/p>\n\n\n\n<p>Crea tu cuenta en <a href=\"https:\/\/apps.vectalk.com.br\/register\">apps.vectalk.com.br\/register<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Preguntas frecuentes<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u00bfPuedo registrar http:\/\/localhost como webhook de WhatsApp?<\/h3>\n\n\n\n<p>No. Meta exige una URL p\u00fablica con HTTPS y certificado v\u00e1lido. Para probar en tu m\u00e1quina, usa un t\u00fanel como ngrok o cloudflared.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00bfQu\u00e9 debo responder en el GET de verificaci\u00f3n?<\/h3>\n\n\n\n<p>Estado 200 con el valor de <code>hub.challenge<\/code> en el cuerpo, sin JSON y sin comillas, siempre que <code>hub.verify_token<\/code> sea igual al token que registraste.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00bfQu\u00e9 clave uso para validar X-Hub-Signature-256?<\/h3>\n\n\n\n<p>La clave secreta de la app (App Secret), no el token de acceso ni el token de verificaci\u00f3n. El hash es un HMAC-SHA256 del cuerpo de la solicitud, comparado con el valor despu\u00e9s de <code>sha256=<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00bfPor qu\u00e9 recibo el mismo webhook dos veces?<\/h3>\n\n\n\n<p>Porque Meta reintenta cuando no recibe un 200, durante hasta 7 d\u00edas. Responde r\u00e1pido y deduplica por el <code>id<\/code> del mensaje o del estado.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00bfPuedo usar ngrok en producci\u00f3n?<\/h3>\n\n\n\n<p>Est\u00e1 pensado para exponer servicios locales durante el desarrollo. Para producci\u00f3n, aloja el endpoint en un servidor con dominio y certificado propios.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Fuentes oficiales consultadas el 25\/10\/2026:<\/strong> <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/webhooks\/create-webhook-endpoint\" target=\"_blank\" rel=\"noreferrer noopener\">Crear un 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 prueba con echo bot<\/a>, <a href=\"https:\/\/developers.facebook.com\/docs\/graph-api\/webhooks\/getting-started\" target=\"_blank\" rel=\"noreferrer noopener\">Webhooks de la Graph API: primeros pasos<\/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\">Documentaci\u00f3n de Vectalk: webhooks<\/a>, <a href=\"https:\/\/docs.vectalk.com.br\/api-reference\/webhooks\/update\">Documentaci\u00f3n de Vectalk: actualizar webhook<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Paso a paso para recibir los webhooks de la API de WhatsApp en localhost con ngrok o cloudflared, responder el hub.challenge y validar la firma 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":[12],"tags":[],"class_list":["post-142","post","type-post","status-publish","format-standard","hentry","category-uncategorized-es"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Probar webhook de WhatsApp en local con ngrok | Vectalk<\/title>\n<meta name=\"description\" content=\"C\u00f3mo probar el webhook de WhatsApp en tu m\u00e1quina: t\u00fanel con ngrok o cloudflared, verificaci\u00f3n hub.challenge y firma X-Hub-Signature-256 en 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\/es\/probar-webhook-whatsapp-localmente\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Probar webhook de WhatsApp en local con ngrok | Vectalk\" \/>\n<meta property=\"og:description\" content=\"C\u00f3mo probar el webhook de WhatsApp en tu m\u00e1quina: t\u00fanel con ngrok o cloudflared, verificaci\u00f3n hub.challenge y firma X-Hub-Signature-256 en Node.js.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vectalk.com.br\/blog\/es\/probar-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:54+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\\\/es\\\/probar-webhook-whatsapp-localmente\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/es\\\/probar-webhook-whatsapp-localmente\\\/\"},\"author\":{\"name\":\"wanderleyfcunha\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/ff36ecd9d8257856f227f8e5d639db2b\"},\"headline\":\"C\u00f3mo probar el webhook de WhatsApp localmente con ngrok\",\"datePublished\":\"2026-10-25T12:58:34+00:00\",\"dateModified\":\"2026-10-25T13:09:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/es\\\/probar-webhook-whatsapp-localmente\\\/\"},\"wordCount\":1504,\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/es\\\/probar-webhook-whatsapp-localmente\\\/\",\"url\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/es\\\/probar-webhook-whatsapp-localmente\\\/\",\"name\":\"Probar webhook de WhatsApp en local con ngrok | Vectalk\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#website\"},\"datePublished\":\"2026-10-25T12:58:34+00:00\",\"dateModified\":\"2026-10-25T13:09:54+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/ff36ecd9d8257856f227f8e5d639db2b\"},\"description\":\"C\u00f3mo probar el webhook de WhatsApp en tu m\u00e1quina: t\u00fanel con ngrok o cloudflared, verificaci\u00f3n hub.challenge y firma X-Hub-Signature-256 en Node.js.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/es\\\/probar-webhook-whatsapp-localmente\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/es\\\/probar-webhook-whatsapp-localmente\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/es\\\/probar-webhook-whatsapp-localmente\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"C\u00f3mo probar el webhook de WhatsApp localmente con 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":"Probar webhook de WhatsApp en local con ngrok | Vectalk","description":"C\u00f3mo probar el webhook de WhatsApp en tu m\u00e1quina: t\u00fanel con ngrok o cloudflared, verificaci\u00f3n hub.challenge y firma X-Hub-Signature-256 en 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\/es\/probar-webhook-whatsapp-localmente\/","og_locale":"en_US","og_type":"article","og_title":"Probar webhook de WhatsApp en local con ngrok | Vectalk","og_description":"C\u00f3mo probar el webhook de WhatsApp en tu m\u00e1quina: t\u00fanel con ngrok o cloudflared, verificaci\u00f3n hub.challenge y firma X-Hub-Signature-256 en Node.js.","og_url":"https:\/\/vectalk.com.br\/blog\/es\/probar-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:54+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\/es\/probar-webhook-whatsapp-localmente\/#article","isPartOf":{"@id":"https:\/\/vectalk.com.br\/blog\/es\/probar-webhook-whatsapp-localmente\/"},"author":{"name":"wanderleyfcunha","@id":"https:\/\/vectalk.com.br\/blog\/#\/schema\/person\/ff36ecd9d8257856f227f8e5d639db2b"},"headline":"C\u00f3mo probar el webhook de WhatsApp localmente con ngrok","datePublished":"2026-10-25T12:58:34+00:00","dateModified":"2026-10-25T13:09:54+00:00","mainEntityOfPage":{"@id":"https:\/\/vectalk.com.br\/blog\/es\/probar-webhook-whatsapp-localmente\/"},"wordCount":1504,"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/vectalk.com.br\/blog\/es\/probar-webhook-whatsapp-localmente\/","url":"https:\/\/vectalk.com.br\/blog\/es\/probar-webhook-whatsapp-localmente\/","name":"Probar webhook de WhatsApp en local con ngrok | Vectalk","isPartOf":{"@id":"https:\/\/vectalk.com.br\/blog\/#website"},"datePublished":"2026-10-25T12:58:34+00:00","dateModified":"2026-10-25T13:09:54+00:00","author":{"@id":"https:\/\/vectalk.com.br\/blog\/#\/schema\/person\/ff36ecd9d8257856f227f8e5d639db2b"},"description":"C\u00f3mo probar el webhook de WhatsApp en tu m\u00e1quina: t\u00fanel con ngrok o cloudflared, verificaci\u00f3n hub.challenge y firma X-Hub-Signature-256 en Node.js.","breadcrumb":{"@id":"https:\/\/vectalk.com.br\/blog\/es\/probar-webhook-whatsapp-localmente\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vectalk.com.br\/blog\/es\/probar-webhook-whatsapp-localmente\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/vectalk.com.br\/blog\/es\/probar-webhook-whatsapp-localmente\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vectalk.com.br\/blog\/"},{"@type":"ListItem","position":2,"name":"C\u00f3mo probar el webhook de WhatsApp localmente con 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\/142","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=142"}],"version-history":[{"count":2,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/posts\/142\/revisions"}],"predecessor-version":[{"id":395,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/posts\/142\/revisions\/395"}],"wp:attachment":[{"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/media?parent=142"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/categories?post=142"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/tags?post=142"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}