Kenso

Calling

Phone numbers, calls, recordings and call notes.

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

Call a person from the browser

POST/v1/calling/callscalling.calls-create

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

Try it on developer.ken.so

Body { personId, toNumber?, fromNumberId?, callTaskId?, touchId?, recording? }. toNumber must be one of the person's phones (400 invalid_phone); absent, Kenso calls their primary phone. fromNumberId absent takes the member's number, else the workspace's first. callTaskId must be an open call task of the person (400). touchId must be a call touch of the person (400; 404 when there is none), and the call's outcome closes it; send callTaskId or touchId, not both (400). Kenso rings the member's browser first (log in with POST /v1/calling/tokens) and dials the person when the browser answers; status is ringing_rep. Kenso holds 10 minutes at millicreditsPerMinute and charges started minutes when the call ends. A refused call is 422 call_refused with the reason in details[0].code (outside_calling_hours, opted_out, no_phone, ...) and, for the time-bound reasons, nextAllowedAt. 402 insufficient_credits, calling_limit_reached (the monthly calling spend limit) or member_credit_limit_reached; 404 for a person of another workspace; 503 provider_unavailable when the carrier is not set up or does not take the call (nothing is charged), 503 try_again with Retry-After when another call of the workspace is starting. Requires edit on the Accounts page.

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
personId
integer (int64)
optional
Required. The person to call.
toNumber
string
optional
One of the person's phones; absent calls their primary phone.
fromNumberId
integer (int64)
optional
The workspace's number to call from; absent takes the member's, else the workspace's first.
callTaskId
integer (int64)
optional
The person's open call task this call works.
touchId
integer (int64)
optional
The person's call touch this call works. Send callTaskId or touchId, not both.
recording
boolean
optional
Record the call where the workspace's settings and the law allow it. Default true.

Response 200

data is a CallingCallModel.

Field
Type
Description
callId
integer (int64)
status
string
ringing_rep while the member's browser rings.
to
string
The number called (E.164).
from
string
The number the call shows (E.164).
fromNumberId
integer (int64)
millicreditsPerMinute
integer (int64)
The destination rate plus the rep's leg, per started minute of each.
consentNoticeWillPlay
boolean
The prospect hears "This call may be recorded." before the legs are bridged.
recordingAllowed
boolean
lineType
string
The number's line type, like mobile or fixed_line.
voicemailDropMode
string
off, manual or auto, from the workspace's setting and the line type. Not off: Kenso listens for a voicemail beep, and a greeting can be dropped (manual: with POST .../voicemail-drop; auto: the member's oldest greeting drops by itself).
Request
curl -X POST "https://api.ken.so/v1/calling/calls" \
  -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 '{
  "personId": 812,
  "toNumber": "string",
  "fromNumberId": 812,
  "callTaskId": 812,
  "touchId": 812,
  "recording": true
}'
Response 200
{
  "success": true,
  "data": {
    "callId": 812,
    "status": "string",
    "to": "string",
    "from": "string",
    "fromNumberId": 812,
    "millicreditsPerMinute": 1,
    "consentNoticeWillPlay": true,
    "recordingAllowed": true,
    "lineType": "string",
    "voicemailDropMode": "string"
  }
}

Hang up a browser call

POST/v1/calling/calls/{callId}/hangupcalling.calls-hangup

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

Try it on developer.ken.so

Hangs up every leg of the call that is still up and answers 202 with its status; the call ends when the carrier confirms. A call that already ended answers 200 with its final status. Only the member who placed the call may hang it up (403); a call of another workspace, or one not placed in Kenso, is 404. Requires edit on the Accounts page.

Parameters

Name
In
Type
Required
Description
callId
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

Also answers 202. data is a CallingHangupModel.

Field
Type
Description
callId
integer (int64)
status
string
Request
curl -X POST "https://api.ken.so/v1/calling/calls/812/hangup" \
  -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": {
    "callId": 812,
    "status": "string"
  }
}

Drop a voicemail greeting on a browser call

POST/v1/calling/calls/{callId}/voicemail-dropcalling.calls-voicemail-drop

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

Try it on developer.ken.so

Body { voicemailId? }: one of your greetings, absent your oldest. The call must be one you placed that the other side answered, with a voicemailDropMode other than off. Kenso waits for the voicemail's beep, hangs up your side, plays the greeting and then hangs up; the call is logged with the voicemail disposition. When detection heard no machine (amdResulthuman or not_sure) no beep comes, so a drop you ask for plays at once: ask after the beep you hear. Answers 202 with voicemailDropStatus (requested, starting, playing or failed), 200 once it is dropped; asking again while a drop is under way answers its state. Do not hang up the call yourself after a drop: that ends the greeting. 409 invalid_state for a call that ended, was not answered or has drops off, 409 no_voicemail when you named none and have none, 404 for a greeting that is not yours, 403 for a call you did not place, 503 provider_unavailable when the audio store or the carrier is not set up. Requires edit on the Accounts page.

Parameters

Name
In
Type
Required
Description
callId
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).

Request body

application/json, optional.

Field
Type
Required
Description
voicemailId
integer (int64)
optional
One of your greetings; absent drops your oldest.

Response 200

Also answers 202. data is a CallingVoicemailDropModel.

Field
Type
Description
callId
integer (int64)
voicemailId
integer (int64)
voicemailDropStatus
string
requested (waiting for the beep, which never comes when detection heard no machine: a drop you ask for then plays at once), starting (Kenso is hanging up your side), playing, dropped or failed.
Request
curl -X POST "https://api.ken.so/v1/calling/calls/812/voicemail-drop" \
  -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 '{
  "voicemailId": 812
}'
Response 200
{
  "success": true,
  "data": {
    "callId": 812,
    "voicemailId": 812,
    "voicemailDropStatus": "string"
  }
}

Create a WebRTC login token for the member's browser

POST/v1/calling/tokenscalling.tokens-create

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

Try it on developer.ken.so

Returns { token, sipUsername, expiresAt } on the member's own carrier credential; the browser logs in with it to answer the calls it starts. The token is a secret: keep it in memory. 422 call_refused (calling_disabled) while calling is off, 503 provider_unavailable when the carrier is not set up or not reachable. Requires edit on the Accounts page.

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).

Response 200

data is a CallingTokenModel.

Field
Type
Description
token
string
sipUsername
string
The member's SIP username; a call start dials it.
expiresAt
string (date-time)
Request
curl -X POST "https://api.ken.so/v1/calling/tokens" \
  -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": {
    "token": "string",
    "sipUsername": "string",
    "expiresAt": "2026-09-23T15:02:11Z"
  }
}

Return the workspace's calling settings

GET/v1/calling/settingscalling.settings-get

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

Try it on developer.ken.so

A workspace that never saved them gets the defaults and updatedAt null. Requires ReadAccess.

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).

Response 200

data is a CallingSettingsModel.

Field
Type
Description
recordingEnabled
boolean
Record calls (both sides, dual channel).
consentNotice
string
When the recording notice plays: auto (where the law asks for it), always or never.
voicemailDropMode
string
off, manual (the rep drops one) or auto.
voicemailToMobile
boolean
Drop voicemails on mobile numbers too. Turning it on needs acceptTcpaNotice: true.
voicemailToMobileAcceptedByMemberId
integer (int64)
Read-only. Who last accepted the TCPA notice; kept when the switch goes off.
voicemailToMobileAcceptedAt
string (date-time)
Read-only. When the TCPA notice was last accepted.
allowedCountries
array of string
ISO 3166 alpha-2 countries the workspace calls; each one Kenso supports (US, CA).
dncScrub
boolean
Scrub numbers against do-not-call lists before calling.
updatedAt
string (date-time)
Read-only. Last save; null while the workspace runs on the defaults.
Request
curl -X GET "https://api.ken.so/v1/calling/settings" \
  -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": {
    "recordingEnabled": true,
    "consentNotice": "string",
    "voicemailDropMode": "string",
    "voicemailToMobile": true,
    "voicemailToMobileAcceptedByMemberId": 812,
    "voicemailToMobileAcceptedAt": "2026-09-23T15:02:11Z",
    "allowedCountries": [
      "string"
    ],
    "dncScrub": true,
    "updatedAt": "2026-09-23T15:02:11Z"
  }
}

Update the workspace's calling settings

PATCH/v1/calling/settingscalling.settings-update

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

Try it on developer.ken.so

Absent fields stay unchanged; null is not allowed. consentNotice is auto, always or never; voicemailDropMode is off, manual or auto; allowedCountries is a non-empty list of US and CA. voicemailToMobile: true needs acceptTcpaNotice: true in the same body (400 validation_failed on acceptTcpaNotice otherwise), which records who accepted and when; turning it off keeps that record. Requires the workspace_settings feature.

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: object.

Response 200

data is a CallingSettingsModel.

Field
Type
Description
recordingEnabled
boolean
Record calls (both sides, dual channel).
consentNotice
string
When the recording notice plays: auto (where the law asks for it), always or never.
voicemailDropMode
string
off, manual (the rep drops one) or auto.
voicemailToMobile
boolean
Drop voicemails on mobile numbers too. Turning it on needs acceptTcpaNotice: true.
voicemailToMobileAcceptedByMemberId
integer (int64)
Read-only. Who last accepted the TCPA notice; kept when the switch goes off.
voicemailToMobileAcceptedAt
string (date-time)
Read-only. When the TCPA notice was last accepted.
allowedCountries
array of string
ISO 3166 alpha-2 countries the workspace calls; each one Kenso supports (US, CA).
dncScrub
boolean
Scrub numbers against do-not-call lists before calling.
updatedAt
string (date-time)
Read-only. Last save; null while the workspace runs on the defaults.
Request
curl -X PATCH "https://api.ken.so/v1/calling/settings" \
  -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 '{}'
Response 200
{
  "success": true,
  "data": {
    "recordingEnabled": true,
    "consentNotice": "string",
    "voicemailDropMode": "string",
    "voicemailToMobile": true,
    "voicemailToMobileAcceptedByMemberId": 812,
    "voicemailToMobileAcceptedAt": "2026-09-23T15:02:11Z",
    "allowedCountries": [
      "string"
    ],
    "dncScrub": true,
    "updatedAt": "2026-09-23T15:02:11Z"
  }
}

List the workspace's phone numbers

GET/v1/calling/numberscalling.numbers-list

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

Try it on developer.ken.so

Every number not released, newest first, at most five. unpaid is true when its monthly credits could not be charged. Requires ReadAccess.

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).

Response 200

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

Field
Type
Description
numberId
integer (int64)
e164
string
countryIso2
string
numberType
string
local (toll-free numbers are not sold yet).
status
string
ordering, active, releasing or released.
assignedMemberId
integer (int64)
The member who calls from it; null when nobody has it.
cnam
string
The caller name shown with its calls (US numbers only, at most 15 characters).
monthlyCredits
integer (int64)
unpaid
boolean
True when its monthly credits could not be charged: outbound calls from it are refused until they are.
orderedAt
string (date-time)
activatedAt
string (date-time)
releasedAt
string (date-time)
Request
curl -X GET "https://api.ken.so/v1/calling/numbers" \
  -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": [
    {
      "numberId": 812,
      "e164": "string",
      "countryIso2": "string",
      "numberType": "string",
      "status": "string",
      "assignedMemberId": 812,
      "cnam": "string",
      "monthlyCredits": 1,
      "unpaid": true,
      "orderedAt": "2026-09-23T15:02:11Z",
      "activatedAt": "2026-09-23T15:02:11Z",
      "releasedAt": "2026-09-23T15:02:11Z"
    }
  ],
  "pagination": {
    "nextCursor": "eyJpZCI6ODE1fQ",
    "hasMore": true,
    "total": 1,
    "isTotalCapped": true
  }
}

Buy a phone number

POST/v1/calling/numberscalling.numbers-buy

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

Try it on developer.ken.so

Buys a local number for 100 credits a month; the first month is charged when it is active. e164 is a number from numbers/available: when a fresh search no longer offers it, the first number that search offers is bought. assignedMemberId must be an active member without a number (400 invalid_member, 409 member_already_has_number); cnam is at most 15 letters, digits, spaces and .,&-, US numbers only. 409 number_limit_reached at five numbers, 402 when the workspace cannot pay the first month, 409 no_numbers_available when the search finds none, 503 provider_unavailable when the carrier is not set up or refuses the order (nothing is charged). status is ordering while the carrier has not assigned the number. Toll-free numbers are not sold. Requires the workspace_settings and billing features: a number is a monthly charge.

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
e164
string
optional
The number to buy, from numbers/available. When a fresh search no longer offers it, the first number that search offers is bought instead.
country
string
optional
areaCode
string
optional
locality
string
optional
assignedMemberId
integer (int64)
optional
cnam
string
optional

Response 201

data is a CallingNumberModel.

Field
Type
Description
numberId
integer (int64)
e164
string
countryIso2
string
numberType
string
local (toll-free numbers are not sold yet).
status
string
ordering, active, releasing or released.
assignedMemberId
integer (int64)
The member who calls from it; null when nobody has it.
cnam
string
The caller name shown with its calls (US numbers only, at most 15 characters).
monthlyCredits
integer (int64)
unpaid
boolean
True when its monthly credits could not be charged: outbound calls from it are refused until they are.
orderedAt
string (date-time)
activatedAt
string (date-time)
releasedAt
string (date-time)
Request
curl -X POST "https://api.ken.so/v1/calling/numbers" \
  -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 '{
  "e164": "string",
  "country": "string",
  "areaCode": "string",
  "locality": "string",
  "assignedMemberId": 812,
  "cnam": "string"
}'
Response 201
{
  "success": true,
  "data": {
    "numberId": 812,
    "e164": "string",
    "countryIso2": "string",
    "numberType": "string",
    "status": "string",
    "assignedMemberId": 812,
    "cnam": "string",
    "monthlyCredits": 1,
    "unpaid": true,
    "orderedAt": "2026-09-23T15:02:11Z",
    "activatedAt": "2026-09-23T15:02:11Z",
    "releasedAt": "2026-09-23T15:02:11Z"
  }
}

Search local numbers for sale

GET/v1/calling/numbers/availablecalling.numbers-available

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

Try it on developer.ken.so

Up to 10 local numbers in country (US or CA, and one the workspace calls), optionally in a three-digit areaCode or a locality. Each costs monthlyCredits credits a month once bought. 503 provider_unavailable when the carrier is not set up or not reachable. Requires the workspace_settings feature.

Parameters

Name
In
Type
Required
Description
Country
In: query
string
optional
ISO 3166 alpha-2 country, US or CA.
AreaCode
In: query
string
optional
Three-digit area code.
Locality
In: query
string
optional
City name.
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 AvailableCallingNumberModel. Each item has these fields. The response also carries pagination.

Field
Type
Description
e164
string
countryIso2
string
locality
string
region
string
monthlyCredits
integer (int64)
Request
curl -X GET "https://api.ken.so/v1/calling/numbers/available" \
  -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": [
    {
      "e164": "string",
      "countryIso2": "string",
      "locality": "string",
      "region": "string",
      "monthlyCredits": 1
    }
  ],
  "pagination": {
    "nextCursor": "eyJpZCI6ODE1fQ",
    "hasMore": true,
    "total": 1,
    "isTotalCapped": true
  }
}

Assign a phone number or set its caller name

PATCH/v1/calling/numbers/{numberId}calling.numbers-update

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

Try it on developer.ken.so

Absent fields stay unchanged. assignedMemberId null unassigns it; a member must be active in the workspace (400 invalid_member) and hold no other number (409 member_already_has_number). cnam null clears it; at most 15 letters, digits, spaces and .,&-, US numbers only. A caller name change goes to the carrier first (503 provider_unavailable when it does not take it). A number of another workspace is 404 not_found. Requires the workspace_settings feature.

Parameters

Name
In
Type
Required
Description
numberId
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).

Request body

application/json, optional: object.

Response 200

data is a CallingNumberModel.

Field
Type
Description
numberId
integer (int64)
e164
string
countryIso2
string
numberType
string
local (toll-free numbers are not sold yet).
status
string
ordering, active, releasing or released.
assignedMemberId
integer (int64)
The member who calls from it; null when nobody has it.
cnam
string
The caller name shown with its calls (US numbers only, at most 15 characters).
monthlyCredits
integer (int64)
unpaid
boolean
True when its monthly credits could not be charged: outbound calls from it are refused until they are.
orderedAt
string (date-time)
activatedAt
string (date-time)
releasedAt
string (date-time)
Request
curl -X PATCH "https://api.ken.so/v1/calling/numbers/812" \
  -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 '{}'
Response 200
{
  "success": true,
  "data": {
    "numberId": 812,
    "e164": "string",
    "countryIso2": "string",
    "numberType": "string",
    "status": "string",
    "assignedMemberId": 812,
    "cnam": "string",
    "monthlyCredits": 1,
    "unpaid": true,
    "orderedAt": "2026-09-23T15:02:11Z",
    "activatedAt": "2026-09-23T15:02:11Z",
    "releasedAt": "2026-09-23T15:02:11Z"
  }
}

Release a phone number

DELETE/v1/calling/numbers/{numberId}calling.numbers-release

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

Try it on developer.ken.so

Stops its monthly credits (the paid month is not refunded) and gives it back to the carrier. Returns the number released (also when the carrier no longer has it or never assigned it), or 202 with status: releasing when the carrier has not taken it back yet: the number stays releasing and finishes by itself once the number lifecycle job is on; until then the client may retry DELETE. A number of another workspace is 404 not_found. Requires the workspace_settings and billing features, like the buy.

Parameters

Name
In
Type
Required
Description
numberId
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

Also answers 202. data is a CallingNumberModel.

Field
Type
Description
numberId
integer (int64)
e164
string
countryIso2
string
numberType
string
local (toll-free numbers are not sold yet).
status
string
ordering, active, releasing or released.
assignedMemberId
integer (int64)
The member who calls from it; null when nobody has it.
cnam
string
The caller name shown with its calls (US numbers only, at most 15 characters).
monthlyCredits
integer (int64)
unpaid
boolean
True when its monthly credits could not be charged: outbound calls from it are refused until they are.
orderedAt
string (date-time)
activatedAt
string (date-time)
releasedAt
string (date-time)
Request
curl -X DELETE "https://api.ken.so/v1/calling/numbers/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": {
    "numberId": 812,
    "e164": "string",
    "countryIso2": "string",
    "numberType": "string",
    "status": "string",
    "assignedMemberId": 812,
    "cnam": "string",
    "monthlyCredits": 1,
    "unpaid": true,
    "orderedAt": "2026-09-23T15:02:11Z",
    "activatedAt": "2026-09-23T15:02:11Z",
    "releasedAt": "2026-09-23T15:02:11Z"
  }
}

Return what a call to a number costs

GET/v1/calling/ratescalling.rates-get

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

Try it on developer.ken.so

to is the number to call. millicreditsPerMinute is the destination rate plus the rep's leg, and recordingMillicreditsPerMinute is added when the call is recorded. A destination Kenso has no price for yet is priced: false with null rates; a value that is not a phone number is 400 invalid_phone. Requires ReadAccess.

Parameters

Name
In
Type
Required
Description
to
In: query
string
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 CallingRateModel.

Field
Type
Description
to
string
countryIso2
string
lineType
string
The number's line type, like mobile, fixed_line or fixed_line_or_mobile.
priced
boolean
millicreditsPerMinute
integer (int64)
recordingMillicreditsPerMinute
integer (int64)
Added per minute when the call is recorded.
Request
curl -X GET "https://api.ken.so/v1/calling/rates" \
  -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": {
    "to": "string",
    "countryIso2": "string",
    "lineType": "string",
    "priced": true,
    "millicreditsPerMinute": 1,
    "recordingMillicreditsPerMinute": 1
  }
}

Return the workspace's monthly calling spend limit

GET/v1/calling/spend-limitcalling.spend-limit-get

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

Try it on developer.ken.so

monthlyLimitMillicredits null is no limit; a workspace that never set it reads 2,000,000 (2,000 credits) with isDefault: true. spentThisMonthMillicredits is call minutes and recordings charged this UTC calendar month plus open call holds, the same spend the cap counts; number fees are not in it. Separate from /v1/spend-limits. Requires ReadAccess.

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).

Response 200

data is a CallingSpendLimitModel.

Field
Type
Description
monthlyLimitMillicredits
integer (int64)
isDefault
boolean
True while the cap is the default, 2,000 credits a month.
spentThisMonthMillicredits
integer (int64)
Call minutes and recordings charged this UTC month, plus open call holds: the same spend the cap counts. Number fees are not in it.
Request
curl -X GET "https://api.ken.so/v1/calling/spend-limit" \
  -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": {
    "monthlyLimitMillicredits": 1,
    "isDefault": true,
    "spentThisMonthMillicredits": 1
  }
}

Set the workspace's monthly calling spend limit

PATCH/v1/calling/spend-limitcalling.spend-limit-update

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

Try it on developer.ken.so

Body { "monthlyLimitMillicredits": number | null }: null is no limit, else 1 to 100,000,000 (400 validation_failed otherwise). The next call reads it. Returns the GET shape. Requires the workspace_settings and billing features.

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: object.

Response 200

data is a CallingSpendLimitModel.

Field
Type
Description
monthlyLimitMillicredits
integer (int64)
isDefault
boolean
True while the cap is the default, 2,000 credits a month.
spentThisMonthMillicredits
integer (int64)
Call minutes and recordings charged this UTC month, plus open call holds: the same spend the cap counts. Number fees are not in it.
Request
curl -X PATCH "https://api.ken.so/v1/calling/spend-limit" \
  -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 '{}'
Response 200
{
  "success": true,
  "data": {
    "monthlyLimitMillicredits": 1,
    "isDefault": true,
    "spentThisMonthMillicredits": 1
  }
}

List your voicemail greetings

GET/v1/calling/voicemailscalling.voicemails-list

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

Try it on developer.ken.so

Your live greetings, oldest first: the first is the one an auto drop plays. audioUrl is a 5-minute link to listen to it, absent while Kenso's audio store is not set up. Requires ReadAccess.

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).

Response 200

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

Field
Type
Description
voicemailId
integer (int64)
name
string
durationSeconds
integer (int32)
Whole seconds, rounded up.
format
string
wav or mp3.
audioUrl
string
A link to listen to it, valid for 5 minutes. Absent while Kenso's audio store is not set up.
createdAt
string (date-time)
Request
curl -X GET "https://api.ken.so/v1/calling/voicemails" \
  -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": [
    {
      "voicemailId": 812,
      "name": "string",
      "durationSeconds": 1,
      "format": "string",
      "audioUrl": "https://example.com",
      "createdAt": "2026-09-23T15:02:11Z"
    }
  ],
  "pagination": {
    "nextCursor": "eyJpZCI6ODE1fQ",
    "hasMore": true,
    "total": 1,
    "isTotalCapped": true
  }
}

Upload a voicemail greeting

POST/v1/calling/voicemailscalling.voicemails-create

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

Try it on developer.ken.so

multipart/form-data with file (a WAV or MP3 recording, at most 12 MiB and 60 seconds) and an optional name (at most 80 characters, blank is Voicemail). Kenso reads the format from the audio itself. 400 validation_failed on file with unsupported_audio (WebM, Ogg and anything else), unreadable_audio, too_long or invalid; 409 voicemail_limit_reached at five greetings; 503 provider_unavailable while Kenso's audio store is not set up. Bulk rate-limit class, like the other uploads. Requires edit on the Accounts page.

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

multipart/form-data, optional.

Field
Type
Required
Description
file
string (binary)
optional
name
string
optional

Response 201

data is a CallingVoicemailModel.

Field
Type
Description
voicemailId
integer (int64)
name
string
durationSeconds
integer (int32)
Whole seconds, rounded up.
format
string
wav or mp3.
audioUrl
string
A link to listen to it, valid for 5 minutes. Absent while Kenso's audio store is not set up.
createdAt
string (date-time)
Request
curl -X POST "https://api.ken.so/v1/calling/voicemails" \
  -H "Authorization: Bearer $KEN_API_KEY" \
  -H "Ken-Version: 2026-11-02" \
  -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID" \
  -F "file=@./file" \
  -F 'name=string'
Response 201
{
  "success": true,
  "data": {
    "voicemailId": 812,
    "name": "string",
    "durationSeconds": 1,
    "format": "string",
    "audioUrl": "https://example.com",
    "createdAt": "2026-09-23T15:02:11Z"
  }
}

Delete a voicemail greeting

DELETE/v1/calling/voicemails/{voicemailId}calling.voicemails-delete

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

Try it on developer.ken.so

Deletes one of your greetings and its audio; a drop that has not played it yet fails. 404 for a greeting that is not yours or is already deleted. Requires edit on the Accounts page.

Parameters

Name
In
Type
Required
Description
voicemailId
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 204

Request
curl -X DELETE "https://api.ken.so/v1/calling/voicemails/812" \
  -H "Authorization: Bearer $KEN_API_KEY" \
  -H "Ken-Version: 2026-11-02" \
  -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
Response 204
HTTP/1.1 204 No Content