● Control plane
Webhook endpoints
Register endpoints and receive signed event envelopes with automatic retries.
| POST | /v1/webhook_endpoints | Create a webhook endpoint |
| GET | /v1/webhook_endpoints | List webhook endpoints |
| GET | /v1/webhook_endpoints/{webhook_endpoint_id} | Retrieve a webhook endpoint |
| PATCH | /v1/webhook_endpoints/{webhook_endpoint_id} | Update a webhook endpoint |
| DELETE | /v1/webhook_endpoints/{webhook_endpoint_id} | Delete a webhook endpoint |
| GET | /v1/webhook_endpoints/{webhook_endpoint_id}/deliveries | List webhook deliveries |
POST/v1/webhook_endpoints
Create a webhook endpoint
Registers an HTTPS endpoint for signed event deliveries. The signing_secret is returned once, on this response only - store it; you need it to verify Anvil-Signature headers.
§ Body
| Field | Type |
|---|---|
| url required | string · HTTPS URL that receives event POSTs. |
| enabled_events optional | array · Event types to deliver. Omit (or pass ["*"]) for all events. |
# sandbox: full surface, no production data curl -X POST https://api.kineticanvil.com/v1/webhook_endpoints \ -H "Authorization: Bearer kx_test_xxxxxxxxxxxxxxxx" \ -H "Anvil-Version: 2026-07-05" \ -H "Content-Type: application/json" \ -d '{"url":"string","enabled_events":[]}'
import requests
resp = requests.post(
"https://api.kineticanvil.com/v1/webhook_endpoints",
headers={
"Authorization": "Bearer kx_test_xxxxxxxxxxxxxxxx",
"Anvil-Version": "2026-07-05",
},
json={"url":"string","enabled_events":[]},
)
print(resp.json())const resp = await fetch("https://api.kineticanvil.com/v1/webhook_endpoints", { method: "POST", headers: { "Authorization": "Bearer kx_test_xxxxxxxxxxxxxxxx", "Anvil-Version": "2026-07-05", "Content-Type": "application/json", }, body: JSON.stringify({"url":"string","enabled_events":[]}), }); console.log(await resp.json());
● 201Anvil-Request-Id: req_01J…
201 Response
{
"webhook_endpoint_id": "string",
"url": "string",
"enabled_events": [
"string"
],
"status": "enabled",
"created_at": "2026-07-05T00:00:00Z",
"signing_secret": "string"
}GET/v1/webhook_endpoints
List webhook endpoints
§ Query parameters
| Parameter | Type |
|---|---|
| limit optional · query | integer |
| starting_after optional · query | string |
| ending_before optional · query | string |
# sandbox: full surface, no production data curl https://api.kineticanvil.com/v1/webhook_endpoints \ -H "Authorization: Bearer kx_test_xxxxxxxxxxxxxxxx" \ -H "Anvil-Version: 2026-07-05"
import requests
resp = requests.get(
"https://api.kineticanvil.com/v1/webhook_endpoints",
headers={
"Authorization": "Bearer kx_test_xxxxxxxxxxxxxxxx",
"Anvil-Version": "2026-07-05",
},
)
print(resp.json())const resp = await fetch("https://api.kineticanvil.com/v1/webhook_endpoints", { method: "GET", headers: { "Authorization": "Bearer kx_test_xxxxxxxxxxxxxxxx", "Anvil-Version": "2026-07-05", }, }); console.log(await resp.json());
● 200Anvil-Request-Id: req_01J…
200 Response
{
"object": "list",
"data": [
{
"webhook_endpoint_id": "string",
"url": "string",
"enabled_events": [],
"status": "enabled",
"created_at": "2026-07-05T00:00:00Z"
}
],
"has_more": true
}GET/v1/webhook_endpoints/{webhook_endpoint_id}
Retrieve a webhook endpoint
§ Path parameters
| Parameter | Type |
|---|---|
| webhook_endpoint_id required · path | string |
# sandbox: full surface, no production data curl https://api.kineticanvil.com/v1/webhook_endpoints/{webhook_endpoint_id} \ -H "Authorization: Bearer kx_test_xxxxxxxxxxxxxxxx" \ -H "Anvil-Version: 2026-07-05"
import requests
resp = requests.get(
"https://api.kineticanvil.com/v1/webhook_endpoints/{webhook_endpoint_id}",
headers={
"Authorization": "Bearer kx_test_xxxxxxxxxxxxxxxx",
"Anvil-Version": "2026-07-05",
},
)
print(resp.json())const resp = await fetch("https://api.kineticanvil.com/v1/webhook_endpoints/{webhook_endpoint_id}", { method: "GET", headers: { "Authorization": "Bearer kx_test_xxxxxxxxxxxxxxxx", "Anvil-Version": "2026-07-05", }, }); console.log(await resp.json());
● 200Anvil-Request-Id: req_01J…
200 Response
{
"webhook_endpoint_id": "string",
"url": "string",
"enabled_events": [
"string"
],
"status": "enabled",
"created_at": "2026-07-05T00:00:00Z"
}PATCH/v1/webhook_endpoints/{webhook_endpoint_id}
Update a webhook endpoint
Update the URL, event filter, or status. Disabled endpoints stop receiving deliveries immediately.
§ Path parameters
| Parameter | Type |
|---|---|
| webhook_endpoint_id required · path | string |
§ Body
| Field | Type |
|---|---|
| url optional | string |
| enabled_events optional | array |
| status optional | string · enabled | disabled |
# sandbox: full surface, no production data curl -X PATCH https://api.kineticanvil.com/v1/webhook_endpoints/{webhook_endpoint_id} \ -H "Authorization: Bearer kx_test_xxxxxxxxxxxxxxxx" \ -H "Anvil-Version: 2026-07-05" \ -H "Content-Type: application/json" \ -d '{"url":"string","enabled_events":[],"status":"enabled"}'
import requests
resp = requests.patch(
"https://api.kineticanvil.com/v1/webhook_endpoints/{webhook_endpoint_id}",
headers={
"Authorization": "Bearer kx_test_xxxxxxxxxxxxxxxx",
"Anvil-Version": "2026-07-05",
},
json={"url":"string","enabled_events":[],"status":"enabled"},
)
print(resp.json())const resp = await fetch("https://api.kineticanvil.com/v1/webhook_endpoints/{webhook_endpoint_id}", { method: "PATCH", headers: { "Authorization": "Bearer kx_test_xxxxxxxxxxxxxxxx", "Anvil-Version": "2026-07-05", "Content-Type": "application/json", }, body: JSON.stringify({"url":"string","enabled_events":[],"status":"enabled"}), }); console.log(await resp.json());
● 200Anvil-Request-Id: req_01J…
200 Response
{
"webhook_endpoint_id": "string",
"url": "string",
"enabled_events": [
"string"
],
"status": "enabled",
"created_at": "2026-07-05T00:00:00Z"
}DELETE/v1/webhook_endpoints/{webhook_endpoint_id}
Delete a webhook endpoint
§ Path parameters
| Parameter | Type |
|---|---|
| webhook_endpoint_id required · path | string |
# sandbox: full surface, no production data curl -X DELETE https://api.kineticanvil.com/v1/webhook_endpoints/{webhook_endpoint_id} \ -H "Authorization: Bearer kx_test_xxxxxxxxxxxxxxxx" \ -H "Anvil-Version: 2026-07-05"
import requests
resp = requests.delete(
"https://api.kineticanvil.com/v1/webhook_endpoints/{webhook_endpoint_id}",
headers={
"Authorization": "Bearer kx_test_xxxxxxxxxxxxxxxx",
"Anvil-Version": "2026-07-05",
},
)
print(resp.json())const resp = await fetch("https://api.kineticanvil.com/v1/webhook_endpoints/{webhook_endpoint_id}", { method: "DELETE", headers: { "Authorization": "Bearer kx_test_xxxxxxxxxxxxxxxx", "Anvil-Version": "2026-07-05", }, }); console.log(await resp.json());
● 200Anvil-Request-Id: req_01J…
200 Response
{
"webhook_endpoint_id": "string",
"deleted": true
}GET/v1/webhook_endpoints/{webhook_endpoint_id}/deliveries
List webhook deliveries
Read-only delivery log for one of your webhook endpoints, most recent first. Each row records the outcome of delivery attempts for a single event. Payloads, signatures, signing secrets, and request headers are never exposed through this endpoint.
§ Path parameters
| Parameter | Type |
|---|---|
| webhook_endpoint_id required · path | string |
§ Query parameters
| Parameter | Type |
|---|---|
| limit optional · query | integer |
| starting_after optional · query | string |
| ending_before optional · query | string |
# sandbox: full surface, no production data curl https://api.kineticanvil.com/v1/webhook_endpoints/{webhook_endpoint_id}/deliveries \ -H "Authorization: Bearer kx_test_xxxxxxxxxxxxxxxx" \ -H "Anvil-Version: 2026-07-05"
import requests
resp = requests.get(
"https://api.kineticanvil.com/v1/webhook_endpoints/{webhook_endpoint_id}/deliveries",
headers={
"Authorization": "Bearer kx_test_xxxxxxxxxxxxxxxx",
"Anvil-Version": "2026-07-05",
},
)
print(resp.json())const resp = await fetch("https://api.kineticanvil.com/v1/webhook_endpoints/{webhook_endpoint_id}/deliveries", { method: "GET", headers: { "Authorization": "Bearer kx_test_xxxxxxxxxxxxxxxx", "Anvil-Version": "2026-07-05", }, }); console.log(await resp.json());
● 200Anvil-Request-Id: req_01J…
200 Response
{
"object": "list",
"data": [
{
"id": "string",
"object": "webhook_delivery",
"webhook_endpoint_id": "string",
"event_id": "string",
"event_type": "string",
"status": "queued",
"attempts": 0,
"last_status_code": 0,
"last_error": "string",
"created_at": "2026-07-05T00:00:00Z",
"next_attempt_at": "2026-07-05T00:00:00Z",
"delivered_at": "2026-07-05T00:00:00Z"
}
],
"has_more": true
}