Edit an endpoint
PUT/v1/webhooks/{id}
scope webhooks.manage
Change what an endpoint subscribes to, or replace its custom headers, WITHOUT reissuing its signing secret. Rotating a gateway credential should not force a redeploy of your signature verification — deleting and re-registering would, because a new endpoint gets a new secret. Send events, headers, or both; anything you leave out is untouched. Sending neither is nothing_to_update (400).
Request body#
| Field | Type | Required | Description |
|---|---|---|---|
events | array | optional | Replaces the subscription. An empty array means every event, including ones added later. An unrecognised name is unknown_event (400). |
headers | array|object | optional | REPLACES the whole set — we cannot show you what is stored, so there is nothing sensible to merge into. Send every header you want kept, or an empty list to remove them all. Same two shapes as registration: [{name, value}] or {"Name": "value"}. At most 5, valid token names, 500-character values, and no reserved names (invalid_header, 400). |
headers[]. | string | optional | The header name, e.g. X-Api-Key. A valid HTTP token: letters, digits and -. |
headers[]. | string | optional | What to send. Stored encrypted, never returned, and never written to a delivery record. |
Example
{
"headers": [
{
"name": "X-Api-Key",
"value": "the rotated value"
}
]
}Response#
| Field | Type | Description |
|---|---|---|
id | integer | The endpoint you edited. Unchanged. |
url | string | Where we POST events. Not editable — a different URL is a different endpoint. |
events | string[]|string | What it is subscribed to now, or the string all. |
is_active | boolean | Whether we are still delivering to it. Editing does not switch a disabled endpoint back on — use POST /v1/webhooks/{id}/enable. |
consecutive_failures | integer | Failures in a row. Editing does not reset it. |
disabled_at | string|null | ISO-8601 UTC of when it was switched off, or null while active. |
headers | array | The custom headers now in force, as {name, preview}. |
headers[]. | string | The header name we send. |
headers[]. | string | The first four characters of the value, then dots. Enough to tell two credentials apart, useless to anyone who does not already have it. |
secret_prefix | string | The first characters of the signing secret. UNCHANGED by this call — that is the point of it. |
created_at | string | ISO-8601 UTC of when the endpoint was registered. |
Example
{
"id": 1,
"url": "https://erp.example.com/hooks/biklo",
"events": [
"order.created"
],
"is_active": true,
"consecutive_failures": 0,
"disabled_at": null,
"headers": [
{
"name": "X-Api-Key",
"preview": "the ••••••••"
}
],
"secret_prefix": "whsec_64Ky4…",
"created_at": "2026-09-21T09:14:03Z"
}