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

# Update webhook

> Modify webhook callback URL, subscribed events, or active status

Update an existing webhook subscription. Modify the destination callback URL, adjust the array of subscribed events, or toggle the subscription active status (`is_active`).

***

### Authentication

This endpoint requires Bearer token authentication.

```http theme={null}
Authorization: Bearer <token>
```

| Header          | Type     | Required | Description                                     | Format           |
| :-------------- | :------- | :------- | :---------------------------------------------- | :--------------- |
| `Authorization` | `string` | **Yes**  | Scoped organization API key or Bearer JWT token | `Bearer <token>` |

***

### Input parameters

<ParamField path="webhook_id" type="string" required>
  Unique UUID identifier of the webhook subscription to update. Example: `8f3b0e2a-71d3-4a5f-9e6b-123456789abc`.
</ParamField>

<ParamField header="Authorization" type="string" required>
  Bearer token for authentication. Format: `Bearer <token>`.
</ParamField>

<ParamField body="url" type="string">
  Updated HTTPS callback URL. Must start with `http://` or `https://`.
</ParamField>

<ParamField body="events" type="string[]">
  Updated list of subscribed events from `ALLOWED_EVENTS`.
</ParamField>

<ParamField body="is_active" type="boolean">
  Toggle whether Sayvy AI actively dispatches webhook payloads to this endpoint (`true` or `false`).
</ParamField>

***

### Response Fields

Returns the updated [WebhookSubscriptionResponse](/api-reference/webhooks/get-webhook#response-fields) object:

<ResponseField name="id" type="string">Webhook UUID.</ResponseField>
<ResponseField name="organization_id" type="string">Organization UUID.</ResponseField>
<ResponseField name="url" type="string">Updated callback URL.</ResponseField>
<ResponseField name="secret" type="string">HMAC SHA-256 signing secret.</ResponseField>
<ResponseField name="events" type="string[]">Updated subscribed events list.</ResponseField>
<ResponseField name="is_active" type="boolean">Updated active state.</ResponseField>
<ResponseField name="created_at" type="string">Creation timestamp.</ResponseField>
<ResponseField name="updated_at" type="string">Modification timestamp.</ResponseField>

***

<RequestExample>
  ```bash cURL theme={null}
  curl -X PUT "https://api.sayvy.ai/api/v1/webhooks/8f3b0e2a-71d3-4a5f-9e6b-123456789abc" \
    -H "Authorization: Bearer <token>" \
    -H "Content-Type: application/json" \
    -d '{
      "url": "https://example.com/api/webhooks/v2/sayvy",
      "events": [
        "call.completed",
        "call.started",
        "ai.tool.executed"
      ],
      "is_active": true
    }'
  ```

  ```python Python theme={null}
  import requests

  url = "https://api.sayvy.ai/api/v1/webhooks/8f3b0e2a-71d3-4a5f-9e6b-123456789abc"

  payload = {
      "url": "https://example.com/api/webhooks/v2/sayvy",
      "events": [
          "call.completed",
          "call.started",
          "ai.tool.executed"
      ],
      "is_active": True
  }

  headers = {
      "Authorization": "Bearer <token>",
      "Content-Type": "application/json"
  }

  response = requests.put(url, json=payload, headers=headers)
  print(response.status_code)
  print(response.json())
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch("https://api.sayvy.ai/api/v1/webhooks/8f3b0e2a-71d3-4a5f-9e6b-123456789abc", {
    method: "PUT",
    headers: {
      "Authorization": "Bearer <token>",
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      url: "https://example.com/api/webhooks/v2/sayvy",
      is_active: false
    })
  });

  const data = await response.json();
  console.log(data);
  ```

  ```java Java theme={null}
  HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://api.sayvy.ai/api/v1/webhooks/8f3b0e2a-71d3-4a5f-9e6b-123456789abc"))
      .header("Authorization", "Bearer <token>")
      .header("Content-Type", "application/json")
      .PUT(HttpRequest.BodyPublishers.ofString("""
        {
          "is_active": false
        }
      """))
      .build();

  HttpResponse<String> response =
      HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
  System.out.println(response.body());
  ```
</RequestExample>

<ResponseExample>
  ```json 200 OK theme={null}
  {
    "id": "8f3b0e2a-71d3-4a5f-9e6b-123456789abc",
    "organization_id": "93f35dc2-5d46-4e58-a9ee-038c35d9bcf1",
    "url": "https://example.com/api/webhooks/v2/sayvy",
    "secret": "whsec_3b9f8a12e4c7d018b249aef567890123",
    "events": [
      "call.completed",
      "call.started",
      "ai.tool.executed"
    ],
    "is_active": true,
    "created_at": "2026-09-07T12:30:00Z",
    "updated_at": "2026-09-07T14:45:00Z"
  }
  ```

  ```json 400 Bad Request theme={null}
  {
    "detail": "URL must start with http:// or https://"
  }
  ```

  ```json 401 Unauthorized theme={null}
  {
    "detail": "Unauthorized"
  }
  ```

  ```json 404 Not Found theme={null}
  {
    "detail": "Webhook not found"
  }
  ```
</ResponseExample>

***

<div
  style={{
display: "flex",
alignItems: "center",
justifyContent: "space-between",
backgroundColor: "rgba(255, 255, 255, 0.03)",
border: "1px solid rgba(255, 255, 255, 0.08)",
borderRadius: "16px",
padding: "10px 18px",
marginTop: "40px",
gap: "16px",
flexWrap: "wrap"
}}
>
  <a
    href="/api-reference/webhooks/get-webhook"
    style={{
display: "inline-flex",
alignItems: "center",
gap: "6px",
color: "#94A3B8",
textDecoration: "none",
fontSize: "14px",
fontWeight: "500",
padding: "4px 8px"
}}
  >
    <span style={{ fontSize: "16px" }}>‹</span> Previous
  </a>

  <div
    style={{
display: "flex",
alignItems: "center",
gap: "16px",
backgroundColor: "rgba(255, 255, 255, 0.04)",
border: "1px solid rgba(255, 255, 255, 0.06)",
borderRadius: "12px",
padding: "8px 16px",
marginLeft: "auto"
}}
  >
    <div style={{ textAlign: "right" }}>
      <div style={{ fontSize: "13px", fontWeight: "700", color: "#F8FAFC" }}>Delete webhook</div>

      <div style={{ fontSize: "11px", color: "#94A3B8", maxWidth: "260px", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}>
        DELETE /api/v1/webhooks/\{webhook\_id}
      </div>
    </div>

    <div style={{ width: "1px", height: "24px", backgroundColor: "rgba(255, 255, 255, 0.1)" }} />

    <a
      href="/api-reference/webhooks/delete-webhook"
      style={{
  display: "inline-flex",
  alignItems: "center",
  gap: "6px",
  color: "#94A3B8",
  textDecoration: "none",
  fontSize: "14px",
  fontWeight: "500"
}}
    >
      Next <span style={{ fontSize: "16px" }}>›</span>
    </a>
  </div>
</div>
