Edit a webhook
update_site_webhook
Changes the name, destination URL, payload type or event list of one 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.
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 header whenever you might retry it. A retry with the same key gets the first answer back instead of running again.
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.
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 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 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 explains every status code a call can answer with.