Update a webhook endpoint
Updates url, description, enabled_events, or status. URL changes re-run SSRF validation. api_version is immutable - create a new endpoint to move to a newer date version.
Setting status: "enabled" is also the API path for recovering an auto_disabled endpoint (after 50 consecutive failures or a 410 response). Investigate the receiver first - re-enabling without a fix just re-runs the failure curve.
Scope: webhooks:manage.
Authorizations
Your secret API key as a Bearer token: Authorization: Bearer vxn_sk_.... Keys are created and scoped in the dashboard - see Authentication.
Headers
Recommended on PATCH and DELETE for safe retries.
255^[a-zA-Z0-9_-]+$Path Parameters
Endpoint identifier (whk_ prefix).
^whk_[A-Za-z0-9]+$Body
Mutable fields: url, description, enabled_events, status. URL changes re-run SSRF validation. api_version is IMMUTABLE - create a new endpoint to move versions. Setting status: "enabled" is also how you recover an auto_disabled endpoint.
New delivery URL - re-runs SSRF validation.
New label, or null to clear.
200Replacement subscription list (SET semantics).
1What an endpoint SUBSCRIBES to: either one of the 22 catalog event names, or the wildcard * meaning every event, current and future.
This is deliberately distinct from WebhookEventName. A DELIVERED event always carries a concrete name, so * is never valid as WebhookEvent.type, WebhookDelivery.event_type, the event_type you send to POST /v1/webhook_endpoints/{id}/test, or the event_type filter on the deliveries list. It is valid ONLY inside enabled_events.
* must be sent alone: ["*", "customer.created"] returns 422 validation_failed.
customer.created, customer.updated, customer.deleted, customer.pass_installed, customer.pass_uninstalled, card.created, card.updated, card.deleted, custom_field.created, custom_field.updated, custom_field.deleted, product.created, product.updated, transaction.created, transaction.reversed, notification.sent, notification.delivery_updated, location.updated, team_member.added, team_member.updated, team_member.removed, webhook_endpoint.delivery_failed "customer.created"
Toggle delivery. Setting enabled re-activates an auto_disabled endpoint (you cannot set auto_disabled yourself).
enabled, disabled Response
Updated webhook endpoint (full object).
A registered outbound webhook receiver. Each endpoint is independently scoped (event subscription list), secured (own HMAC secret), paused, and monitored. The secret is NEVER present on GET - it is returned exactly once by create and rotate.
Endpoint identifier, whk_ prefixed opaque string. Never a database id.
^whk_[A-Za-z0-9]+$"whk_01HW9RBZ4GH7N8MTX1RVWHKDEF"
Always "webhook_endpoint".
"webhook_endpoint"HTTPS URL we POST events to. Validated against SSRF rules at registration AND re-validated per delivery attempt (DNS rebinding defense: every attempt re-resolves and re-checks the IP against the blocklist - no private ranges, no cloud metadata endpoints, no localhost).
"https://hooks.demo-coffee.example/vexion"
Explicit array of event names from the 22-event catalog. The wildcard ["*"] subscribes to every current AND future event - we recommend explicit names so a new event does not surprise your receiver.
What an endpoint SUBSCRIBES to: either one of the 22 catalog event names, or the wildcard * meaning every event, current and future.
This is deliberately distinct from WebhookEventName. A DELIVERED event always carries a concrete name, so * is never valid as WebhookEvent.type, WebhookDelivery.event_type, the event_type you send to POST /v1/webhook_endpoints/{id}/test, or the event_type filter on the deliveries list. It is valid ONLY inside enabled_events.
* must be sent alone: ["*", "customer.created"] returns 422 validation_failed.
customer.created, customer.updated, customer.deleted, customer.pass_installed, customer.pass_uninstalled, card.created, card.updated, card.deleted, custom_field.created, custom_field.updated, custom_field.deleted, product.created, product.updated, transaction.created, transaction.reversed, notification.sent, notification.delivery_updated, location.updated, team_member.added, team_member.updated, team_member.removed, webhook_endpoint.delivery_failed "customer.created"
enabled/disabled are merchant-toggled. auto_disabled is set by the platform after 50 consecutive failures OR a single 410 Gone response - requires explicit re-enable (dashboard or PATCH with status: "enabled"), forcing investigation before more events flow.
enabled, disabled, auto_disabled "enabled"
Consecutive FAILED delivery attempts across every event to this endpoint, reset to 0 on any successful delivery. The platform auto-disables the endpoint (status flips to auto_disabled) once this reaches 50, OR instantly on a single 410 Gone response regardless of this count. Watch this to alert before auto-disable happens rather than after.
x >= 00
Date-based API version all event payloads to this endpoint serialize against - pinned at creation, immutable (a live consumer's payload shape never changes under it). The platform launches on 2026-07; when a new version ships, upgrade with zero downtime: create a second endpoint on the new version, verify with the test endpoint, cut your consumer over, delete the old one.
"2026-07"
Unix seconds.
1750691700
Free-text merchant-facing label. Optional.
200"Loyalty events to ERP"
Unix seconds of last change.
1750691700