# Update a webhook endpoint

Source: https://docs.usetone.ai/reference/integrations/updateWebhook

> Change the URL, the subscribed events, or disable it.

`PATCH /v1/integrations/webhooks/{id}`
Change the URL, the subscribed events, or disable it. Disabling stops delivery without losing the endpoint, its secret or its history.

Requires the `admin` scope.

## Parameters

| Name | In | | Meaning |
|---|---|---|---|
| `id` | path | required | The webhook endpoint's id. |

## Request body

| Field | Type | | Meaning |
|---|---|---|---|
| `description` | string | optional | Your label for this endpoint. Shown in the delivery log. |
| `enabled` | boolean | optional | Whether deliveries are sent. Disable to stop delivery without losing the endpoint, its secret or its history. |
| `events` | string[] | optional | Which events to send to this endpoint. Subscribe only to what you consume — every delivery is retried up to 14 times over roughly a day, and 20 consecutive failures across all deliveries disables the endpoint. Open set — handle an unrecognised value rather than throwing. Today: `call.initiated`, `call.answered`, `call.completed`, `call.failed`, `campaign.completed`, `campaign.paused`, `compliance.check.blocked`, `wallet.balance.low`, `number.suspended`, `number.reactivated`, `knowledge.build.completed`, `knowledge.build.failed`. |
| `url` | string | optional | Where to POST deliveries. Must be a public https:// URL — private and link-local addresses are refused at save time rather than discovered at delivery time. Answer 2xx within 10 seconds; anything slower is retried and will manufacture duplicates. |

### Example request

```json
{
  "description": "Production CRM sync",
  "enabled": true,
  "events": [
    "call.completed",
    "call.failed"
  ],
  "url": "https://hooks.example.com/tone"
}
```

## Response

| Field | Type | | Meaning |
|---|---|---|---|
| `consecutiveFailures` | integer | required | Resets to 0 on the first success. |
| `createdAt` | string | required | RFC 3339, UTC. |
| `description` | string | null | required | Your label for this endpoint. |
| `disabledReason` | string | null | required | Why we switched it off, when we did — never silent, and the owners are emailed. Sustained failures disable an endpoint after the retry ladder is exhausted. |
| `enabled` | boolean | required | Whether deliveries are being sent. Set false by you, or automatically after 20 consecutive delivery failures. |
| `events` | string[] | required | Which events this endpoint receives. Open set — handle an unrecognised value rather than throwing. Today: `call.initiated`, `call.answered`, `call.completed`, `call.failed`, `campaign.completed`, `campaign.paused`, `compliance.check.blocked`, `wallet.balance.low`, `number.suspended`, `number.reactivated`, `knowledge.build.completed`, `knowledge.build.failed`. |
| `id` | string | required | The webhook endpoint's unique id. |
| `url` | string | required | Where deliveries are POSTed. Vetted at save time — a private-range URL is refused by the form, not discovered at delivery. |

### Example response

```json
{
  "data": {
    "consecutiveFailures": 0,
    "createdAt": "2026-08-25T09:14:22Z",
    "description": "Production — order service",
    "disabledReason": null,
    "enabled": true,
    "events": [
      "call.completed",
      "campaign.finished"
    ],
    "id": "9f1c2d84-4e3a-4f6c-b902-7d1e8a33c451",
    "url": "https://hooks.acme.example/tone"
  }
}
```
