curl --request PATCH \
--url https://api.nohead.io/v1/webhooks/{webhook_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "<string>",
"description": "<string>",
"event_types": [],
"published_only": true,
"enabled": true
}
'import { Nohead } from "@nohead/sdk"
const nohead = new Nohead()
const result = await nohead.webhooks.update("wh_01J9ZQ3F8X", { enabled: false })
from nohead import Nohead
nohead = Nohead()
result = nohead.webhooks.update("wh_01J9ZQ3F8X", enabled=False)
require "nohead"
nohead = Nohead::Client.new
result = nohead.webhooks.update("wh_01J9ZQ3F8X", enabled: false)
{
"id": "wh_01J9ZQ3F8X5W2K7M4N6P0R1S2T",
"object": "webhook",
"project_id": "<string>",
"url": "<string>",
"description": "<string>",
"event_types": [
"record.created"
],
"published_only": true,
"enabled": true,
"deleted_at": "2023-11-07T05:31:56Z",
"purge_after": "2023-11-07T05:31:56Z",
"created_at": "2026-09-27T12:00:00.000Z",
"updated_at": "2026-09-27T12:00:00.000Z"
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"request_id": "req_01J9ZQ3F8X5W2K7M4N6P0R1S2T",
"details": [
{
"code": "<string>",
"message": "<string>",
"field": "<string>",
"usage": 123,
"limit": 123,
"current_revision": 123,
"record_id": "<string>",
"draft_id": "<string>"
}
]
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"request_id": "req_01J9ZQ3F8X5W2K7M4N6P0R1S2T",
"details": [
{
"code": "<string>",
"message": "<string>",
"field": "<string>",
"usage": 123,
"limit": 123,
"current_revision": 123,
"record_id": "<string>",
"draft_id": "<string>"
}
]
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"request_id": "req_01J9ZQ3F8X5W2K7M4N6P0R1S2T",
"details": [
{
"code": "<string>",
"message": "<string>",
"field": "<string>",
"usage": 123,
"limit": 123,
"current_revision": 123,
"record_id": "<string>",
"draft_id": "<string>"
}
]
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"request_id": "req_01J9ZQ3F8X5W2K7M4N6P0R1S2T",
"details": [
{
"code": "<string>",
"message": "<string>",
"field": "<string>",
"usage": 123,
"limit": 123,
"current_revision": 123,
"record_id": "<string>",
"draft_id": "<string>"
}
]
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"request_id": "req_01J9ZQ3F8X5W2K7M4N6P0R1S2T",
"details": [
{
"code": "<string>",
"message": "<string>",
"field": "<string>",
"usage": 123,
"limit": 123,
"current_revision": 123,
"record_id": "<string>",
"draft_id": "<string>"
}
]
}
}{
"error": {
"type": "validation_error",
"message": "Record validation failed",
"request_id": "req_01J9ZQ3F8X5W2K7M4N6P0R1S2T",
"details": [
{
"field": "title",
"code": "required",
"message": "is required"
}
]
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"request_id": "req_01J9ZQ3F8X5W2K7M4N6P0R1S2T",
"details": [
{
"code": "<string>",
"message": "<string>",
"field": "<string>",
"usage": 123,
"limit": 123,
"current_revision": 123,
"record_id": "<string>",
"draft_id": "<string>"
}
]
}
}Update a webhook
Change the URL, description, event types, or turn it off (enabled: false).
409 with detail code deleted while the webhook is deleted.
curl --request PATCH \
--url https://api.nohead.io/v1/webhooks/{webhook_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "<string>",
"description": "<string>",
"event_types": [],
"published_only": true,
"enabled": true
}
'import { Nohead } from "@nohead/sdk"
const nohead = new Nohead()
const result = await nohead.webhooks.update("wh_01J9ZQ3F8X", { enabled: false })
from nohead import Nohead
nohead = Nohead()
result = nohead.webhooks.update("wh_01J9ZQ3F8X", enabled=False)
require "nohead"
nohead = Nohead::Client.new
result = nohead.webhooks.update("wh_01J9ZQ3F8X", enabled: false)
{
"id": "wh_01J9ZQ3F8X5W2K7M4N6P0R1S2T",
"object": "webhook",
"project_id": "<string>",
"url": "<string>",
"description": "<string>",
"event_types": [
"record.created"
],
"published_only": true,
"enabled": true,
"deleted_at": "2023-11-07T05:31:56Z",
"purge_after": "2023-11-07T05:31:56Z",
"created_at": "2026-09-27T12:00:00.000Z",
"updated_at": "2026-09-27T12:00:00.000Z"
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"request_id": "req_01J9ZQ3F8X5W2K7M4N6P0R1S2T",
"details": [
{
"code": "<string>",
"message": "<string>",
"field": "<string>",
"usage": 123,
"limit": 123,
"current_revision": 123,
"record_id": "<string>",
"draft_id": "<string>"
}
]
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"request_id": "req_01J9ZQ3F8X5W2K7M4N6P0R1S2T",
"details": [
{
"code": "<string>",
"message": "<string>",
"field": "<string>",
"usage": 123,
"limit": 123,
"current_revision": 123,
"record_id": "<string>",
"draft_id": "<string>"
}
]
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"request_id": "req_01J9ZQ3F8X5W2K7M4N6P0R1S2T",
"details": [
{
"code": "<string>",
"message": "<string>",
"field": "<string>",
"usage": 123,
"limit": 123,
"current_revision": 123,
"record_id": "<string>",
"draft_id": "<string>"
}
]
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"request_id": "req_01J9ZQ3F8X5W2K7M4N6P0R1S2T",
"details": [
{
"code": "<string>",
"message": "<string>",
"field": "<string>",
"usage": 123,
"limit": 123,
"current_revision": 123,
"record_id": "<string>",
"draft_id": "<string>"
}
]
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"request_id": "req_01J9ZQ3F8X5W2K7M4N6P0R1S2T",
"details": [
{
"code": "<string>",
"message": "<string>",
"field": "<string>",
"usage": 123,
"limit": 123,
"current_revision": 123,
"record_id": "<string>",
"draft_id": "<string>"
}
]
}
}{
"error": {
"type": "validation_error",
"message": "Record validation failed",
"request_id": "req_01J9ZQ3F8X5W2K7M4N6P0R1S2T",
"details": [
{
"field": "title",
"code": "required",
"message": "is required"
}
]
}
}{
"error": {
"type": "invalid_request",
"message": "<string>",
"request_id": "req_01J9ZQ3F8X5W2K7M4N6P0R1S2T",
"details": [
{
"code": "<string>",
"message": "<string>",
"field": "<string>",
"usage": 123,
"limit": 123,
"current_revision": 123,
"record_id": "<string>",
"draft_id": "<string>"
}
]
}
}Authorizations
Project-scoped API key, e.g. nohead_sk_k7fz0a9c3m2q_<secret>, or
nohead_pk_… for a published-only key. Used by servers, CI, the CLI
and coding agents.
Headers
A unique value (1-255 printable ASCII characters) that makes retrying
this request safe. The first response (below 500) is stored for 24
hours per user or API key; retries with the same key and the same
request get it again with an Idempotent-Replayed: true header. The
same key with a different request is refused with 400; a retry while
the first request is still running gets 409.
1 - 255First-party client identifier recorded in history (e.g. cli/0.3.1). Informational only.
Path Parameters
Body
1An event webhooks can subscribe to: the same names as the activity
log's actions. A subscription can also be every type of a resource
(record.*, draft.*, collection.*, field.*, asset.*) or * for all.
record.created, record.updated, record.published, record.unpublished, record.deleted, record.restored, record.reverted, record.redacted, record.scheduled, record.unscheduled, record.schedule_failed, draft.created, draft.updated, draft.discarded, draft.scheduled, draft.unscheduled, draft.schedule_failed, collection.created, collection.updated, collection.deleted, collection.restored, collection.fields_reordered, field.created, field.updated, field.deleted, field.restored, field.migrated, field.alias_removed, asset.created, asset.updated, asset.deleted, asset.restored, asset.purged Send only events that change what a published-only API key can read (false by default). It can't be combined with event types it never sends, such as draft.*.
Response
The webhook.
"wh_01J9ZQ3F8X5W2K7M4N6P0R1S2T"
The subscribed event types and wildcards (record.*, or * for all).
An event webhooks can subscribe to: the same names as the activity
log's actions. A subscription can also be every type of a resource
(record.*, draft.*, collection.*, field.*, asset.*) or * for all.
record.created, record.updated, record.published, record.unpublished, record.deleted, record.restored, record.reverted, record.redacted, record.scheduled, record.unscheduled, record.schedule_failed, draft.created, draft.updated, draft.discarded, draft.scheduled, draft.unscheduled, draft.schedule_failed, collection.created, collection.updated, collection.deleted, collection.restored, collection.fields_reordered, field.created, field.updated, field.deleted, field.restored, field.migrated, field.alias_removed, asset.created, asset.updated, asset.deleted, asset.restored, asset.purged Send only events that change what a published-only API key can read: a record's change while it is published (or that publishes, unpublishes, deletes or restores it), schema changes, and changes to assets that published records use. Drafts, schedules, history redactions, uploads and purges are never sent. webhook.test always is.
When the webhook was deleted; null unless it is.
When a deleted webhook is removed for good, with its delivery log, unless restored first.
ISO 8601 timestamp in UTC.
"2026-09-27T12:00:00.000Z"
ISO 8601 timestamp in UTC.
"2026-09-27T12:00:00.000Z"