Update a webhook
Updates only the fields sent; all others keep their stored values. At least one field is
required. To deactivate or reactivate an endpoint, use POST /api/webhooks/{webhookId}/disable
and /enable (is_active is not accepted). To replace the secret, use
POST /api/webhooks/{webhookId}/rotate-secret.
eventsreplaces the whole list. A name the endpoint already lists remains accepted even if the catalog no longer offers it; a new name must be available for subscription.filtersreplaces the stored object;nullremoves every filter.headersreplaces all custom headers;nullor{}removes them. Reads return each value as"[configured]", so the object returned by a read can be sent back as is: a header whose value is"[configured]"keeps its stored value, and a masked header with no stored value is dropped. Send a new value to change a header.description: nullclears the label.- The rule against call filters on
audit.log_recordedis evaluated on the resulting configuration (stored values merged with the values sent). - A new
urlis subject to the same checks as on create.
Changing url or headers redirects a live integration (or changes the credential it sends), so
it requires a signed-in owner or admin; API keys are rejected with 403 regardless of scope. All
other fields can be changed with a full key.
Side effects. Updates the endpoint and updated_at. The next delivery attempt, including
pending retries, uses the new configuration. Written to the audit log with url and
headers redacted.
Idempotency. Safe to retry: sending the same body again leaves the endpoint in the same state.
Webhook events. Emits audit.log_recorded to endpoints subscribed to it. See Webhooks.
Access
- Required scope:
full(a signed-in session forurlandheaders). Human users need the owner or admin role. - Rate limit: General API (120–600 requests/min per workspace, by plan) plus the configuration-mutations limit — 10 requests/min per workspace, shared with other configuration changes. See Rate limits.
- Plan: Requires an active subscription (
active,trialingorpast_due); without one the request is refused with403 BILLING_ERROR(metadata.kind: subscription_required). See Billing and usage.
Authentication
Workspace API key: jl_ followed by 64 lowercase hex characters, created by the workspace owner in the
dashboard (Settings → API Keys) and sent as Authorization: Bearer jl_.... The plaintext is shown once,
at creation; Jelliu stores only a SHA-256 hash. A workspace can hold up to 25 active keys.
Operations restricted to admins or owners reject keys without the full scope with 403, and say so in
their description. No key, whatever its scope, can mint or revoke API keys or rotate a webhook secret —
that requires a signed-in owner session. A revoked key stops authenticating within about 10 seconds.
See Authentication.
Path parameters
UUID of the outbound webhook endpoint, returned as id by GET /api/webhooks. It must belong to the authenticated workspace; an id from another workspace, an unknown id or a value that is not a UUID answers 404.
Request
New endpoint. Same checks as on create. Signed-in session only.
Replaces the whole list. A name the endpoint already lists remains accepted even if the catalog no longer offers it; a new name must be available for subscription.
New label; null clears it.
Replaces the stored filters; null removes them. The audit-filter rule is checked on the result.
Replaces all custom headers; null or {} removes them. Same rules as on create. A value of
"[configured]" (as returned by reads) keeps the stored value for that name; a masked header with
no stored value is dropped. Signed-in session only.
Response
An outbound webhook endpoint as returned by the API. The signing secret is never included; it is
returned once by POST /api/webhooks (as an additional secret field) and by rotate-secret.
Custom headers keep their names, but every value is "[configured]". Members below admin (and
API keys without the full scope) see only the origin of url.

