> ## Documentation Index
> Fetch the complete documentation index at: https://docs.firecrawl.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Pruebas

> Probar y depurar webhooks

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.

<div id="local-development">
  ## Desarrollo local
</div>

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

<div id="using-cloudflare-tunnels">
  ### Uso de Cloudflare Tunnels
</div>

[Cloudflare Tunnels](https://github.com/cloudflare/cloudflared/releases) ofrece una forma gratuita de exponer tu servidor local sin necesidad de abrir puertos en el firewall:

```bash theme={null}
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:

```json theme={null}
{
  "url": "https://abc123.trycloudflare.com/webhook"
}
```

<div id="troubleshooting">
  ## Resolución de problemas
</div>

<div id="webhooks-not-arriving">
  ### Los webhooks no llegan
</div>

* **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

<div id="signature-verification-failing">
  ### Error en la verificación de la firma
</div>

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](https://www.firecrawl.dev/app/settings?tab=advanced).

```javascript theme={null}
// 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');
});
```
