# Fix webhook delivery errors

Every delivery attempt is logged under **Settings › Integrations › Webhooks › Deliveries**, with the status code your endpoint returned. Find the code below.

| Response      | Likely cause                                        | Fix                                              |
| ------------- | --------------------------------------------------- | ------------------------------------------------ |
| `401` / `403` | Your endpoint requires auth Relaypoint doesn't send | Verify the `Relaypoint-Signature` header instead |
| `404`         | The URL changed                                     | Update the endpoint URL                          |
| `413`         | Your server limits request size                     | Allow bodies up to 1 MB                          |
| `5xx`         | Your server crashed handling the event              | Check your logs; replay once fixed               |
| Timeout       | Your endpoint took over 10 seconds                  | Respond first, process in the background         |

## Signature doesn't match

The most common cause is verifying a **parsed** body instead of the raw bytes. Frameworks often re-serialise JSON, which changes whitespace and key order.

```javascript
// Express: keep the raw body for this route only
app.post('/hooks/relaypoint', express.raw({ type: 'application/json' }), (req, res) => {
  if (!isValid(req.body, req.get('Relaypoint-Signature'), process.env.RELAYPOINT_SECRET)) {
    return res.sendStatus(400);
  }
  res.sendStatus(204);
  queue.add('relaypoint-event', JSON.parse(req.body));
});
```

:::warning Paused endpoints
After 3 days of failed deliveries the endpoint is paused. Fix the cause, then select **Resume** and **Replay failed** to resend everything that was missed.
:::
