Kenso

Bookings

Booked meetings: read, reschedule and cancel.

Meetings and calling5 endpointsKen-Version: 2026-11-02AuthenticationWorkspacesErrors

Reassign a former member's upcoming bookings

POST/v1/bookings/bulk-reassignbookings.bulk-reassign

Needs the scheduler feature on your workspace. Until it is on, calls answer 404.

Try it on developer.ken.so

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

Name
In
Type
Required
Description
Ken-Version
In: header
string, one of: 2026-11-02, 1.1
required
The API version: a dated version (YYYY-MM-DD), or 1.1, another name for the first dated version. Without it the request uses your API key's pinned version; an unpinned key reaches the legacy shape of the same path. 1.0 selects the legacy shape explicitly.
X-Ken-Workspace-Id
In: header
integer (int64)
optional
Workspace to act in. Required when your credential can reach more than one workspace (otherwise 400 workspace_required).

Request body

application/json, optional.

Field
Type
Required
Description
hostMemberId
integer (int64)
optional
The former member whose upcoming bookings to handle.
cursor
string
optional
The previous answer's nextCursor; null for the first call.

Response 200

data is a BookingLeaverResultModel.

Field
Type
Description
succeeded
integer (int32)
failed
integer (int32)
results
array of BookingLeaverItemModel
hasMore
boolean
nextCursor
string
Request
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"
}'
Response 200
{
  "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

POST/v1/bookings/bulk-cancelbookings.bulk-cancel

Needs the scheduler feature on your workspace. Until it is on, calls answer 404.

Try it on developer.ken.so

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

Name
In
Type
Required
Description
Ken-Version
In: header
string, one of: 2026-11-02, 1.1
required
The API version: a dated version (YYYY-MM-DD), or 1.1, another name for the first dated version. Without it the request uses your API key's pinned version; an unpinned key reaches the legacy shape of the same path. 1.0 selects the legacy shape explicitly.
X-Ken-Workspace-Id
In: header
integer (int64)
optional
Workspace to act in. Required when your credential can reach more than one workspace (otherwise 400 workspace_required).

Request body

application/json, optional.

Field
Type
Required
Description
hostMemberId
integer (int64)
optional
The former member whose upcoming bookings to handle.
cursor
string
optional
The previous answer's nextCursor; null for the first call.

Response 200

data is a BookingLeaverResultModel.

Field
Type
Description
succeeded
integer (int32)
failed
integer (int32)
results
array of BookingLeaverItemModel
hasMore
boolean
nextCursor
string
Request
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"
}'
Response 200
{
  "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

GET/v1/bookingsbookings.list

Needs the scheduler feature on your workspace. Until it is on, calls answer 404.

Try it on developer.ken.so

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

Name
In
Type
Required
Description
Limit
In: query
integer (int32)
optional
Cursor
In: query
string
optional
HostMemberId
In: query
integer (int64)
optional
Only bookings this member hosts.
OrganizerMemberId
In: query
integer (int64)
optional
Only bookings this member organizes. Narrows what the caller sees, never widens it.
Status
In: query
string
optional
confirmed, rescheduled, cancelled or no_show; comma = OR.
StartAfter
In: query
string (date-time)
optional
Start at or after.
StartBefore
In: query
string (date-time)
optional
Start before.
CampaignId
In: query
integer (int64)
optional
PersonId
In: query
integer (int64)
optional
AccountId
In: query
integer (int64)
optional
Ken-Version
In: header
string, one of: 2026-11-02, 1.1
required
The API version: a dated version (YYYY-MM-DD), or 1.1, another name for the first dated version. Without it the request uses your API key's pinned version; an unpinned key reaches the legacy shape of the same path. 1.0 selects the legacy shape explicitly.
X-Ken-Workspace-Id
In: header
integer (int64)
optional
Workspace to act in. Required when your credential can reach more than one workspace (otherwise 400 workspace_required).

Response 200

data is a list of BookingModel. Each item has these fields. The response also carries pagination.

Field
Type
Description
id
integer (int64)
status
string
meetingTypeId
integer (int64)
hostMemberId
integer (int64)
organizerMemberId
integer (int64)
startAt
string (date-time)
endAt
string (date-time)
bookerTimeZone
string
booker
BookingBookerModel
bookerPhone
string
answers
map of object
personId
integer (int64)
accountId
integer (int64)
meetingId
integer (int64)
source
string
campaignId
integer (int64)
stepOrder
integer (int32)
touchId
integer (int64)
assetId
integer (int64)
bookingLinkId
integer (int64)
routingReason
string
provider
string
calendarEmail
string
cancelReason
string
cancelledAt
string (date-time)
rescheduledFromBookingId
integer (int64)
createdAt
string (date-time)
updatedAt
string (date-time)
Request
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"
Response 200
{
  "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

GET/v1/bookings/{bookingId}bookings.get

Needs the scheduler feature on your workspace. Until it is on, calls answer 404.

Try it on developer.ken.so

404 for a booking in another workspace or one the caller cannot see.

Parameters

Name
In
Type
Required
Description
bookingId
In: path
integer (int64)
required
Ken-Version
In: header
string, one of: 2026-11-02, 1.1
required
The API version: a dated version (YYYY-MM-DD), or 1.1, another name for the first dated version. Without it the request uses your API key's pinned version; an unpinned key reaches the legacy shape of the same path. 1.0 selects the legacy shape explicitly.
X-Ken-Workspace-Id
In: header
integer (int64)
optional
Workspace to act in. Required when your credential can reach more than one workspace (otherwise 400 workspace_required).

Response 200

data is a BookingModel.

Field
Type
Description
id
integer (int64)
status
string
meetingTypeId
integer (int64)
hostMemberId
integer (int64)
organizerMemberId
integer (int64)
startAt
string (date-time)
endAt
string (date-time)
bookerTimeZone
string
booker
BookingBookerModel
bookerPhone
string
answers
map of object
personId
integer (int64)
accountId
integer (int64)
meetingId
integer (int64)
source
string
campaignId
integer (int64)
stepOrder
integer (int32)
touchId
integer (int64)
assetId
integer (int64)
bookingLinkId
integer (int64)
routingReason
string
provider
string
calendarEmail
string
cancelReason
string
cancelledAt
string (date-time)
rescheduledFromBookingId
integer (int64)
createdAt
string (date-time)
updatedAt
string (date-time)
Request
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"
Response 200
{
  "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

POST/v1/bookings/{bookingId}/no-showbookings.no-show

Needs the scheduler feature on your workspace. Until it is on, calls answer 404.

Try it on developer.ken.so

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

Name
In
Type
Required
Description
bookingId
In: path
integer (int64)
required
Ken-Version
In: header
string, one of: 2026-11-02, 1.1
required
The API version: a dated version (YYYY-MM-DD), or 1.1, another name for the first dated version. Without it the request uses your API key's pinned version; an unpinned key reaches the legacy shape of the same path. 1.0 selects the legacy shape explicitly.
X-Ken-Workspace-Id
In: header
integer (int64)
optional
Workspace to act in. Required when your credential can reach more than one workspace (otherwise 400 workspace_required).

Response 200

data is a BookingModel.

Field
Type
Description
id
integer (int64)
status
string
meetingTypeId
integer (int64)
hostMemberId
integer (int64)
organizerMemberId
integer (int64)
startAt
string (date-time)
endAt
string (date-time)
bookerTimeZone
string
booker
BookingBookerModel
bookerPhone
string
answers
map of object
personId
integer (int64)
accountId
integer (int64)
meetingId
integer (int64)
source
string
campaignId
integer (int64)
stepOrder
integer (int32)
touchId
integer (int64)
assetId
integer (int64)
bookingLinkId
integer (int64)
routingReason
string
provider
string
calendarEmail
string
cancelReason
string
cancelledAt
string (date-time)
rescheduledFromBookingId
integer (int64)
createdAt
string (date-time)
updatedAt
string (date-time)
Request
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"
Response 200
{
  "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"
  }
}