Skip to main content
PATCH
Update a webhook endpoint
A new url is validated exactly like registration (https, public address). Setting disabled to false also clears the failure streak, which is how an auto-disabled endpoint is brought back after the receiver is fixed. The signing secret is unchanged and is not re-issued.

Authorization

This route requires the write scope. A missing or invalid credential returns 401 authentication_error. A valid credential without the scope returns 403 permission_denied, and the problem body names the exact scope required.

Headers

These are request conventions the contract does not declare as parameters, so they do not appear in the schema tables below.

Success responses

Errors

Every error is an RFC 9457 application/problem+json body carrying a stable code, a requestId, and a suggestedAction where Exo has one. See Errors.

Notes

  • Setting disabled to false also clears the failure streak. That is how an auto-disabled endpoint is re-enabled.
  • The signing secret is unchanged. There is no rotation route in v1: register a new endpoint and delete the old one.

Authorizations

X-Exo-API-Key
string
header
required

An Exo API key (exo_...) sent as the X-Exo-API-Key header.

Path Parameters

webhook_id
string<uuid>
required

The webhook endpoint id returned at registration.

Body

application/json

Body for PATCH /v1/webhooks/{id}. Every field is optional.

disabled
boolean | null
eventTypes
string[] | null
Required array length: 1 - 20 elements
url
string | null
Maximum string length: 2048

Response

Successful Response

A registered webhook endpoint. The signing secret is never included.

consecutiveFailures
integer
required
createdAt
string<date-time>
required
disabled
boolean
required
eventTypes
string[]
required
id
string
required
url
string
required
disabledReason
string | null
inactiveEventTypes
string[]

Subscribed event types that no emitter publishes yet, so nothing will be delivered for them. The subscription is kept and starts delivering as soon as the emitter ships; this field exists so you never wait on an event silently.

lastDeliveryAt
string<date-time> | null
lastSuccessAt
string<date-time> | null
updatedAt
string<date-time> | null