Event occurrences
Poll for MCP events after a cursor instead of receiving webhooks.
Poll MCP events after a cursor
/v1/event-occurrencesevent-occurrences.pollRead only, any workspace member. Without cursor it returns no events and a cursor at now, and the workspace starts logging its MCP events (each poll keeps that going for 7 days). Pass back cursor unchanged. types is a comma-separated list of MCP event types (omitted: every one you may receive; GET /v1/webhook-event-types marks them mcp). campaignId and classification narrow events that carry them. limit is 1 to 100 (default 50). maxAgeMs skips older events instead of replaying them, with truncated: true. hasMore: true means poll again at once; otherwise wait nextPollMs. Events are kept 7 days. 404 when MCP events are not enabled for the workspace; unsupported for a type that is not an MCP event; 403 for a type whose page you cannot see.
Parameters
cursor of the previous poll. Omitted: start from now (no events, a fresh cursor).interested.400 workspace_required).Response 200
data is a EventOccurrencesModel.
maxAgeMs, or no longer kept): there is a gap before these.curl -X GET "https://api.ken.so/v1/event-occurrences" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": {
"events": [
{
"eventId": "string",
"name": "string",
"timestamp": "2026-09-23T15:02:11Z",
"data": null,
"cursor": "eyJpZCI6ODE1fQ"
}
],
"cursor": "eyJpZCI6ODE1fQ",
"hasMore": true,
"truncated": true,
"nextPollMs": 1
}
}