Event subscriptions
Event webhook subscriptions for MCP clients: create, renew, list and remove.
List your MCP event webhook subscriptions in the current workspace
/v1/event-subscriptionsevent-subscriptions.listOnly your own, newest first; expired and terminated ones stay listed for 7 days. The signing secret is never returned.
Parameters
400 workspace_required).Response 200
data is a list of EventSubscriptionModel. Each item has these fields. The response also carries pagination.
campaignId, classification).active, expired or terminated.deliveryStatus. lastError is a category, never the endpoint's own text.curl -X GET "https://api.ken.so/v1/event-subscriptions" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": [
{
"id": "string",
"name": "string",
"arguments": null,
"url": "https://example.com",
"status": "string",
"refreshBefore": "2026-09-23T15:02:11Z",
"verifiedAt": "2026-09-23T15:02:11Z",
"deliveryStatus": {
"active": true,
"lastDeliveryAt": "2026-09-23T15:02:11Z",
"lastError": "string",
"failedSince": "2026-09-23T15:02:11Z"
},
"createdAt": "2026-09-23T15:02:11Z",
"updatedAt": "2026-09-23T15:02:11Z"
}
],
"pagination": {
"nextCursor": "eyJpZCI6ODE1fQ",
"hasMore": true,
"total": 1,
"isTotalCapped": true
}
}Create or renew an MCP event webhook subscription
/v1/event-subscriptionsevent-subscriptions.upsertRequires the integrations feature and the event group's page; a machine key without a member is 403. Keyed by (you, delivery.url, name, arguments): the same key renews (200), a new one creates (201). delivery.mode is webhook; delivery.url is https and must resolve to a public address; delivery.secret is whsec_ + base64 of 24 to 64 random bytes, stored encrypted and never returned (a renewal may rotate it). The first subscription to a URL POSTs a signed {"type":"verification","challenge":...} and needs {"challenge":...} echoed in a 2xx body, else callback_verification_failed with the category in error.details[0].code. The grant (refreshBefore) is at most one hour: subscribe again before it. cursor starts a new or lapsed subscription there (null: now; maxAgeMs bounds the replay); a live one keeps its own. At most 50 active subscriptions per workspace (resource_exhausted). 404 when MCP events are not enabled for the workspace.
Parameters
400 workspace_required).Request body
application/json, optional.
meeting.booked.campaignId, classification, as the type supports them.Response 201
Also answers 200. data is a EventSubscriptionGrantModel.
X-MCP-Subscription-Id on every delivery.deliveryStatus. lastError is a category, never the endpoint's own text.curl -X POST "https://api.ken.so/v1/event-subscriptions" \
-H "Authorization: Bearer $KEN_API_KEY" \
-H "Ken-Version: 2026-11-02" \
-H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID" \
-H "Content-Type: application/json" \
-d '{
"name": "string",
"arguments": {
"key": null
},
"delivery": {
"mode": "string",
"url": "https://example.com",
"secret": "string"
},
"cursor": "eyJpZCI6ODE1fQ",
"maxAgeMs": 1,
"ttlMs": 1
}'{
"success": true,
"data": {
"id": "string",
"refreshBefore": "2026-09-23T15:02:11Z",
"cursor": "eyJpZCI6ODE1fQ",
"truncated": true,
"deliveryStatus": {
"active": true,
"lastDeliveryAt": "2026-09-23T15:02:11Z",
"lastError": "string",
"failedSince": "2026-09-23T15:02:11Z"
}
}
}Get one of your MCP event webhook subscriptions
/v1/event-subscriptions/{eventSubscriptionId}event-subscriptions.getParameters
400 workspace_required).Response 200
data is a EventSubscriptionModel.
campaignId, classification).active, expired or terminated.deliveryStatus. lastError is a category, never the endpoint's own text.curl -X GET "https://api.ken.so/v1/event-subscriptions/string" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": {
"id": "string",
"name": "string",
"arguments": null,
"url": "https://example.com",
"status": "string",
"refreshBefore": "2026-09-23T15:02:11Z",
"verifiedAt": "2026-09-23T15:02:11Z",
"deliveryStatus": {
"active": true,
"lastDeliveryAt": "2026-09-23T15:02:11Z",
"lastError": "string",
"failedSince": "2026-09-23T15:02:11Z"
},
"createdAt": "2026-09-23T15:02:11Z",
"updatedAt": "2026-09-23T15:02:11Z"
}
}Delete one of your MCP event webhook subscriptions
/v1/event-subscriptions/{eventSubscriptionId}event-subscriptions.deleteRequires the integrations feature. Deliveries stop at once and the signing secret is deleted. Another member's subscription is not found.
Parameters
400 workspace_required).Response 204
curl -X DELETE "https://api.ken.so/v1/event-subscriptions/string" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
HTTP/1.1 204 No Content
Unsubscribe by event, arguments and URL
/v1/event-subscriptions/unsubscribeevent-subscriptions.unsubscribeSEP-3415 events/unsubscribe: name, arguments and delivery.url must match one of your subscriptions exactly, else 404. Requires the integrations feature. Deliveries stop at once and the signing secret is deleted.
Parameters
400 workspace_required).Request body
application/json, optional.
Response 204
curl -X POST "https://api.ken.so/v1/event-subscriptions/unsubscribe" \
-H "Authorization: Bearer $KEN_API_KEY" \
-H "Ken-Version: 2026-11-02" \
-H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID" \
-H "Content-Type: application/json" \
-d '{
"name": "string",
"arguments": {
"key": null
},
"delivery": {
"url": "https://example.com"
}
}'HTTP/1.1 204 No Content