Bookings
Booked meetings: read, reschedule and cancel.
Reassign a former member's upcoming bookings
/v1/bookings/bulk-reassignbookings.bulk-reassignNeeds the scheduler feature on your workspace. Until it is on, calls answer 404.
Body { hostMemberId, cursor? }. Moves each of the next 20 upcoming bookings of a member who left to a free member at the same time (account owner, campaign sender, the type's team, then anyone with a meeting type on); the new host's calendar sends the invite and the old event is cancelled from the former member's calendar. Returns { succeeded, failed, results, hasMore, nextCursor }; each result has bookingId, status (reassigned, already_handled, no_free_member, host_busy, calendar_write_failed, failed), startAt, newBookingId, hostMemberId, calendarEventRemoved and, on a failure, error. Send nextCursor back as cursor while hasMore. 403 without the members feature; 409 invalid_state while the person is still a member.
Parameters
400 workspace_required).Request body
application/json, optional.
Response 200
data is a BookingLeaverResultModel.
curl -X POST "https://api.ken.so/v1/bookings/bulk-reassign" \
-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 '{
"hostMemberId": 812,
"cursor": "eyJpZCI6ODE1fQ"
}'{
"success": true,
"data": {
"succeeded": 1,
"failed": 1,
"results": [
{
"bookingId": 812,
"status": "string",
"startAt": "2026-09-23T15:02:11Z",
"newBookingId": 812,
"hostMemberId": 812,
"calendarEventRemoved": true,
"error": "string",
"errorCode": "string"
}
],
"hasMore": true,
"nextCursor": "eyJpZCI6ODE1fQ"
}
}Cancel a former member's upcoming bookings
/v1/bookings/bulk-cancelbookings.bulk-cancelNeeds the scheduler feature on your workspace. Until it is on, calls answer 404.
Body { hostMemberId, cursor? }. For each of the next 20 upcoming bookings of a member who left, removes the event from their calendar and cancels the booking as a workspace cancel. Same answer shape as bulk-reassign; status is cancelled, already_handled, host_busy, calendar_write_failed or failed. The calendar tells the booker only when calendarEventRemoved is true. A cancelled booking whose invite stayed on the former member's calendar has errorCode: booker_not_told and an error, and counts in failed: tell the booker yourself. 403 without the members feature; 409 invalid_state while the person is still a member.
Parameters
400 workspace_required).Request body
application/json, optional.
Response 200
data is a BookingLeaverResultModel.
curl -X POST "https://api.ken.so/v1/bookings/bulk-cancel" \
-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 '{
"hostMemberId": 812,
"cursor": "eyJpZCI6ODE1fQ"
}'{
"success": true,
"data": {
"succeeded": 1,
"failed": 1,
"results": [
{
"bookingId": 812,
"status": "string",
"startAt": "2026-09-23T15:02:11Z",
"newBookingId": 812,
"hostMemberId": 812,
"calendarEventRemoved": true,
"error": "string",
"errorCode": "string"
}
],
"hasMore": true,
"nextCursor": "eyJpZCI6ODE1fQ"
}
}List bookings
/v1/bookingsbookings.listNeeds the scheduler feature on your workspace. Until it is on, calls answer 404.
Ordered by start, then id. Filters: hostMemberId and organizerMemberId (both narrow the bookings the caller sees); status (confirmed, rescheduled, cancelled or no_show, comma = OR); startAfter (start at or after) and startBefore (start before); campaignId, personId and accountId. limit 1-200 (default 50), cursor from pagination.nextCursor. Needs the scheduler feature and the Calendar page (view).
Parameters
400 workspace_required).Response 200
data is a list of BookingModel. Each item has these fields. The response also carries pagination.
curl -X GET "https://api.ken.so/v1/bookings" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": [
{
"id": 812,
"status": "string",
"meetingTypeId": 812,
"hostMemberId": 812,
"organizerMemberId": 812,
"startAt": "2026-09-23T15:02:11Z",
"endAt": "2026-09-23T15:02:11Z",
"bookerTimeZone": "string",
"booker": {
"name": "string",
"email": "[email protected]",
"company": "string"
},
"bookerPhone": "string",
"answers": {
"key": null
},
"personId": 812,
"accountId": 812,
"meetingId": 812,
"source": "string",
"campaignId": 812,
"stepOrder": 1,
"touchId": 812,
"assetId": 812,
"bookingLinkId": 812,
"routingReason": "string",
"provider": "string",
"calendarEmail": "[email protected]",
"cancelReason": "string",
"cancelledAt": "2026-09-23T15:02:11Z",
"rescheduledFromBookingId": 812,
"createdAt": "2026-09-23T15:02:11Z",
"updatedAt": "2026-09-23T15:02:11Z"
}
],
"pagination": {
"nextCursor": "eyJpZCI6ODE1fQ",
"hasMore": true,
"total": 1,
"isTotalCapped": true
}
}Get a booking
/v1/bookings/{bookingId}bookings.getNeeds the scheduler feature on your workspace. Until it is on, calls answer 404.
404 for a booking in another workspace or one the caller cannot see.
Parameters
400 workspace_required).Response 200
data is a BookingModel.
curl -X GET "https://api.ken.so/v1/bookings/812" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": {
"id": 812,
"status": "string",
"meetingTypeId": 812,
"hostMemberId": 812,
"organizerMemberId": 812,
"startAt": "2026-09-23T15:02:11Z",
"endAt": "2026-09-23T15:02:11Z",
"bookerTimeZone": "string",
"booker": {
"name": "string",
"email": "[email protected]",
"company": "string"
},
"bookerPhone": "string",
"answers": {
"key": null
},
"personId": 812,
"accountId": 812,
"meetingId": 812,
"source": "string",
"campaignId": 812,
"stepOrder": 1,
"touchId": 812,
"assetId": 812,
"bookingLinkId": 812,
"routingReason": "string",
"provider": "string",
"calendarEmail": "[email protected]",
"cancelReason": "string",
"cancelledAt": "2026-09-23T15:02:11Z",
"rescheduledFromBookingId": 812,
"createdAt": "2026-09-23T15:02:11Z",
"updatedAt": "2026-09-23T15:02:11Z"
}
}Mark a booking as a no-show
/v1/bookings/{bookingId}/no-showbookings.no-showNeeds the scheduler feature on your workspace. Until it is on, calls answer 404.
The host, the organizer or an admin who can see the booking marks a confirmed booking whose start has passed. Logs meeting.no_show on the meeting timeline and puts a "Sorry we missed you" draft with a fresh single-use link in Today for approval. Marking it again answers 200 and changes nothing. 404 for a booking in another workspace, one the caller cannot see (as on GET) or one the caller may not mark. 409 invalid_state before the start or for a cancelled or rescheduled booking. Needs the scheduler feature and the Calendar page (view).
Parameters
400 workspace_required).Response 200
data is a BookingModel.
curl -X POST "https://api.ken.so/v1/bookings/812/no-show" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": {
"id": 812,
"status": "string",
"meetingTypeId": 812,
"hostMemberId": 812,
"organizerMemberId": 812,
"startAt": "2026-09-23T15:02:11Z",
"endAt": "2026-09-23T15:02:11Z",
"bookerTimeZone": "string",
"booker": {
"name": "string",
"email": "[email protected]",
"company": "string"
},
"bookerPhone": "string",
"answers": {
"key": null
},
"personId": 812,
"accountId": 812,
"meetingId": 812,
"source": "string",
"campaignId": 812,
"stepOrder": 1,
"touchId": 812,
"assetId": 812,
"bookingLinkId": 812,
"routingReason": "string",
"provider": "string",
"calendarEmail": "[email protected]",
"cancelReason": "string",
"cancelledAt": "2026-09-23T15:02:11Z",
"rescheduledFromBookingId": 812,
"createdAt": "2026-09-23T15:02:11Z",
"updatedAt": "2026-09-23T15:02:11Z"
}
}