# update_site_webhook

Source: https://modulify.ai/docs/api/webhooks/update-site-webhook

Changes the name, destination URL, payload type or event list of one webhook.

- Title: Edit a webhook
- Scope: `config:write`
- Access: Makes changes
- Endpoint: `POST /v1/update_site_webhook`

Only the fields you send change, and the rest keep their current values. `list_site_webhooks` returns only the host, so leave `url` out unless you have a new one, and never rebuild the URL from the host.

The event list you send replaces the old one, and at least one event is required. An empty name resets the label to the destination host. Changing the URL does not rotate the signing secret, so the receiving end keeps verifying with the secret it already has.

The edited webhook comes back with its destination as `Host` only. See [Webhooks](https://modulify.ai/docs/automations/webhooks#add-a-webhook).

## Request

Call it with a `POST` to `https://api.modulify.ai/v1/update_site_webhook`, sending the inputs below as a JSON object. The token needs the `config:write` scope.

It makes changes, so send an [Idempotency-Key](https://modulify.ai/docs/api/idempotency) header whenever you might retry it. A retry with the same key gets the first answer back instead of running again.

```bash
curl -X POST https://api.modulify.ai/v1/update_site_webhook \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"projectId":"PROJECT_ID","webhookId":"WEBHOOK_ID"}'
```

Over MCP, the same method is the [update_site_webhook tool](https://modulify.ai/docs/mcp/webhooks/update-site-webhook).

## Inputs

| Input | Type | Required | Description |
| --- | --- | --- | --- |
| `projectId` | string | Yes | The site id. |
| `webhookId` | string | Yes | The webhook id from `list_site_webhooks`. |
| `url` | string | No | The new destination URL. It must use `https` and be at most 2,048 characters, and private and loopback addresses are refused. Leave it out to keep the current one. |
| `events` | array of strings | No | The full event list, from `publish.succeeded`, `publish.failed` and `publish.cancelled`, which replaces the old one. At least one is required, and an event outside that list is refused. Leave it out to keep the current events. |
| `name` | string | No | The new label, cut to 64 characters. Leave it out to keep the current one. |
| `type` | string | No | The new payload shape, `raw`, `slack`, `discord` or `ping`. Leave it out to keep the current one. |

## Response

Every call answers with the [JSON envelope](https://modulify.ai/docs/api/requests-and-responses#the-response) of `success`, `message`, `data`, `code` and `version`. `data` holds the result described above, and on a method that returns a total, `count` carries it. The [response headers](https://modulify.ai/docs/api/requests-and-responses#headers-on-every-method-call) carry the call's `X-Request-Id` and what is left of your per-minute budget in `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset`. [Errors](https://modulify.ai/docs/api/errors) explains every status code a call can answer with.