Skip to content
Dashboard

Update a webhook

PATCH/v2/webhooks/{id}

Updates a webhook’s properties. Supports partial updates - only provided fields will be updated.

Path Parameters

  • id - The webhook ID (24-character ObjectId)

Request Body

All fields are optional. Only provided fields will be updated.

FieldTypeDescription
namestringHuman-readable name (max 100 chars)
urlstringWebhook endpoint URL (must be HTTPS)
descriptionstring/nullDescription (null to clear)
topicsstring[]Event topics to subscribe to
statusstring”active” to reactivate, “paused” to pause delivery
requestConfigobjectRequest configuration
requestConfig.headersobjectCustom headers to send (max 10)

Pausing and Reactivating Webhooks

You can pause a webhook to temporarily stop receiving events:

{
  "status": "paused"
}

Webhooks may also be automatically paused or suspended due to delivery failures. To reactivate:

{
  "status": "active"
}

Reactivating a webhook resets the health metrics and allows it to receive events again.

Example: Update Topics

{
  "topics": ["post.created", "post.updated", "post.deleted"]
}

Example: Update Request Config

{
  "requestConfig": {
    "headers": {
      "X-Custom-Header": "new-value"
    }
  }
}

Version Availability

This endpoint is only available in API version 2026-01-01.nova and newer.

Path ParametersExpand Collapse
id: string

Webhook unique identifier

Header ParametersExpand Collapse
"Featurebase-Version": optional "2026-01-01.nova" or "2025-12-12.clover"
One of the following:
"2026-01-01.nova"
"2025-12-12.clover"
Body ParametersJSONExpand Collapse
description: optional string

Optional description of the webhook purpose (null to clear)

maxLength500
name: optional string

Human-readable name for the webhook

minLength1
maxLength255
requestConfig: optional WebhookRequestConfigInput { headers }

Request configuration for webhook delivery

headers: optional map[string]

Custom headers to send with webhook requests (max 10)

status: optional "active" or "paused"

Set to “active” to reactivate or “paused” to pause webhook delivery

One of the following:
"active"
"paused"
topics: optional array of "post.created" or "post.updated" or "post.deleted" or 24 more

Array of event topics to subscribe to

One of the following:
"post.created"
"post.updated"
"post.deleted"
"post.voted"
"ticket.created"
"ticket.updated"
"ticket.deleted"
"changelog.published"
"comment.created"
"comment.updated"
"comment.deleted"
"conversation.user.created"
"conversation.user.replied"
"conversation.admin.replied"
"conversation.admin.closed"
"conversation.handover_requested"
"conversation.admin.assigned"
"conversation.admin.noted"
"conversation.admin.snoozed"
"conversation.admin.unsnoozed"
"conversation.admin.opened"
"conversation.priority.updated"
"conversation.deleted"
"conversation.contact.attached"
"conversation.contact.detached"
"conversation.read"
"conversation_part.redacted"
url: optional string

Webhook endpoint URL (must be HTTPS)

ReturnsExpand Collapse
Webhook object { id, createdAt, description, 11 more }
id: string

Unique identifier

createdAt: string

ISO timestamp when the webhook was created

description: string

Optional description of the webhook purpose

health: object { avgResponseTime, consecutiveFailures, errorsSinceLastSuccess, 2 more }
avgResponseTime: number

Average response time in milliseconds

consecutiveFailures: number

Number of consecutive delivery failures

errorsSinceLastSuccess: number

Number of errors since last successful delivery

lastResponseTime: number

Last response time in milliseconds

lastSuccessAt: string

ISO timestamp of last successful delivery

lastStatus: object { code, message, timestamp }

Last delivery attempt status

code: number

HTTP status code from last delivery attempt

message: string

Status message from last delivery attempt

timestamp: string

ISO timestamp of last status update

name: string

Human-readable webhook name

object: "webhook"

Object type identifier

requestConfig: object { timeoutMs, headers }
timeoutMs: number

Request timeout in milliseconds (1000-30000)

minimum1000
maximum30000
headers: optional map[string]

Custom headers to send with webhook requests

secret: string

Webhook signing secret for verifying payloads

status: "active" or "paused" or "suspended"

Current status of the webhook

One of the following:
"active"
"paused"
"suspended"
topics: array of "post.created" or "post.updated" or "post.deleted" or 24 more

Array of event topics the webhook subscribes to

One of the following:
"post.created"
"post.updated"
"post.deleted"
"post.voted"
"ticket.created"
"ticket.updated"
"ticket.deleted"
"changelog.published"
"comment.created"
"comment.updated"
"comment.deleted"
"conversation.user.created"
"conversation.user.replied"
"conversation.admin.replied"
"conversation.admin.closed"
"conversation.handover_requested"
"conversation.admin.assigned"
"conversation.admin.noted"
"conversation.admin.snoozed"
"conversation.admin.unsnoozed"
"conversation.admin.opened"
"conversation.priority.updated"
"conversation.deleted"
"conversation.contact.attached"
"conversation.contact.detached"
"conversation.read"
"conversation_part.redacted"
updatedAt: string

ISO timestamp when the webhook was last updated

url: string

Webhook endpoint URL

version: string

API version for webhook payloads

Update a webhook

curl https://do.featurebase.app/v2/webhooks/$ID \
    -X PATCH \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer $FEATUREBASE_API_KEY" \
    -d '{
          "description": "Handles all production events",
          "name": "Production Webhook",
          "status": "active",
          "topics": [
            "post.created",
            "post.updated"
          ],
          "url": "https://example.com/webhooks"
        }'
{
  "id": "507f1f77bcf86cd799439011",
  "createdAt": "2025-01-15T10:30:00.000Z",
  "description": "Handles all production events",
  "health": {
    "avgResponseTime": 200,
    "consecutiveFailures": 0,
    "errorsSinceLastSuccess": 0,
    "lastResponseTime": 150,
    "lastSuccessAt": "2025-01-15T10:30:00.000Z"
  },
  "lastStatus": {
    "code": 200,
    "message": "Success",
    "timestamp": "2025-01-15T10:30:00.000Z"
  },
  "name": "Production Webhook",
  "object": "webhook",
  "requestConfig": {
    "timeoutMs": 5000,
    "headers": {
      "X-Custom-Header": "value"
    }
  },
  "secret": "whsec_abc123def456ghi789",
  "status": "active",
  "topics": [
    "post.created",
    "post.updated"
  ],
  "updatedAt": "2025-01-15T10:30:00.000Z",
  "url": "https://example.com/webhooks",
  "version": "1.0"
}
Returns Examples
{
  "id": "507f1f77bcf86cd799439011",
  "createdAt": "2025-01-15T10:30:00.000Z",
  "description": "Handles all production events",
  "health": {
    "avgResponseTime": 200,
    "consecutiveFailures": 0,
    "errorsSinceLastSuccess": 0,
    "lastResponseTime": 150,
    "lastSuccessAt": "2025-01-15T10:30:00.000Z"
  },
  "lastStatus": {
    "code": 200,
    "message": "Success",
    "timestamp": "2025-01-15T10:30:00.000Z"
  },
  "name": "Production Webhook",
  "object": "webhook",
  "requestConfig": {
    "timeoutMs": 5000,
    "headers": {
      "X-Custom-Header": "value"
    }
  },
  "secret": "whsec_abc123def456ghi789",
  "status": "active",
  "topics": [
    "post.created",
    "post.updated"
  ],
  "updatedAt": "2025-01-15T10:30:00.000Z",
  "url": "https://example.com/webhooks",
  "version": "1.0"
}