Saltar al contenido principal

Documentation Index

Fetch the complete documentation index at: https://firecrawl-mog-search-exclude-include-domains.mintlify.app/llms.txt

Use this file to discover all available pages before exploring further.

Verifica que tu integración de webhooks funcione antes de desplegarla en producción. Esta página explica cómo recibir webhooks en tu máquina local y cómo diagnosticar errores comunes de entrega y verificación.

Desarrollo local

Los webhooks requieren una URL accesible públicamente, por lo que tendrás que exponer tu servidor local a Internet durante el desarrollo.

Uso de Cloudflare Tunnels

Cloudflare Tunnels ofrece una forma gratuita de exponer tu servidor local sin necesidad de abrir puertos en el firewall:
cloudflared tunnel --url localhost:3000
Obtendrás una URL pública como https://abc123.trycloudflare.com. Utiliza esta URL en la configuración de tu webhook:
{
  "url": "https://abc123.trycloudflare.com/webhook"
}

Resolución de problemas

Los webhooks no llegan

  • Endpoint no accesible: Comprueba que tu servidor sea accesible públicamente y que los firewalls permitan conexiones entrantes
  • Uso de HTTP: Las URLs de webhook deben usar HTTPS
  • Eventos incorrectos: Revisa el filtro de events en la configuración de tu webhook
  • Errores de timeout: Asegúrate de que tu endpoint responda en menos de 10 segundos

Error en la verificación de la firma

La causa más común es usar el cuerpo JSON ya parseado en lugar del cuerpo bruto de la solicitud. Otra causa es usar un secreto incorrecto, así que confirma que el tuyo coincida con el valor de la configuración de tu cuenta.
// Incorrecto: usando el body parseado
const signature = crypto
  .createHmac('sha256', secret)
  .update(JSON.stringify(req.body))
  .digest('hex');

// Correcto: usando el body en crudo
app.use('/webhook', express.raw({ type: 'application/json' }));
app.post('/webhook', (req, res) => {
  const signature = crypto
    .createHmac('sha256', secret)
    .update(req.body) // Buffer en crudo
    .digest('hex');
});