Kenso

Access requests

Requests for access to a workspace.

Workspace and credits3 endpointsKen-Version: 2026-11-02AuthenticationWorkspacesErrors

List access requests, newest first

GET/v1/access-requestsaccess-requests.list

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

Try it on developer.ken.so

Members who manage members (and staff) see every request in the workspace; everyone else sees their own. Filter with status (pending, granted, declined, canceled). limit is 1..100 (default 50).

Parameters

Name
In
Type
Required
Description
Status
In: query
string
optional
pending, granted, declined, or canceled. Omitted = every status.
Limit
In: query
integer (int32)
optional
1..100, default 50.
Cursor
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 list of AccessRequestModel. Each item has these fields. The response also carries pagination.

Field
Type
Description
id
integer (int64)
kind
string
page, feature, or credits.
key
string
A page or feature wire name; monthly_limit for credits.
level
string
view or edit. Page requests only.
reason
string
status
string
pending, granted, declined, or canceled.
requesterId
integer (int64)
The member who asked (a member id is a user id).
decidedById
integer (int64)
Who granted, declined or canceled it. Omitted while pending.
decidedAt
string (date-time)
createdAt
string (date-time)
updatedAt
string (date-time)
Request
curl -X GET "https://api.ken.so/v1/access-requests" \
  -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,
      "kind": "string",
      "key": "string",
      "level": "string",
      "reason": "string",
      "status": "string",
      "requesterId": 812,
      "decidedById": 812,
      "decidedAt": "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
  }
}

Ask for a page, a feature or a higher credit limit

POST/v1/access-requestsaccess-requests.create

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

Try it on developer.ken.so

{ kind, key, level?, reason? }. Page: key is a page and level is view or edit (omitted = one level above what you have). Feature: key is a feature. Credits: key is monthly_limit; the grant sets the limit. Asking for what you already have is validation_failed with the detail code already_granted. You can have one pending request per kind and key: asking again returns it with 200. A new request (201) emails every member who manages members. Any member of the workspace.

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
kind
string
optional
page, feature, or credits. Required.
key
string
optional
A page (today ... delivery) or feature (approve ... workspace_settings) wire name; monthly_limit for credits. Required.
level
string
optional
Page requests only: view or edit. Omitted = one level above what you have now.
reason
string
optional
Optional note for the people who decide, up to 2000 characters.

Response 201

Also answers 200. data is a AccessRequestModel.

Field
Type
Description
id
integer (int64)
kind
string
page, feature, or credits.
key
string
A page or feature wire name; monthly_limit for credits.
level
string
view or edit. Page requests only.
reason
string
status
string
pending, granted, declined, or canceled.
requesterId
integer (int64)
The member who asked (a member id is a user id).
decidedById
integer (int64)
Who granted, declined or canceled it. Omitted while pending.
decidedAt
string (date-time)
createdAt
string (date-time)
updatedAt
string (date-time)
Request
curl -X POST "https://api.ken.so/v1/access-requests" \
  -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 '{
  "kind": "string",
  "key": "string",
  "level": "string",
  "reason": "string"
}'
Response 201
{
  "success": true,
  "data": {
    "id": 812,
    "kind": "string",
    "key": "string",
    "level": "string",
    "reason": "string",
    "status": "string",
    "requesterId": 812,
    "decidedById": 812,
    "decidedAt": "2026-09-23T15:02:11Z",
    "createdAt": "2026-09-23T15:02:11Z",
    "updatedAt": "2026-09-23T15:02:11Z"
  }
}

Cancel your own pending request

POST/v1/access-requests/{accessRequestId}/cancelaccess-requests.cancel

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

Try it on developer.ken.so

Only the person who asked; anyone else is 403 forbidden. A request that is no longer pending is 409 invalid_state.

Parameters

Name
In
Type
Required
Description
accessRequestId
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 AccessRequestModel.

Field
Type
Description
id
integer (int64)
kind
string
page, feature, or credits.
key
string
A page or feature wire name; monthly_limit for credits.
level
string
view or edit. Page requests only.
reason
string
status
string
pending, granted, declined, or canceled.
requesterId
integer (int64)
The member who asked (a member id is a user id).
decidedById
integer (int64)
Who granted, declined or canceled it. Omitted while pending.
decidedAt
string (date-time)
createdAt
string (date-time)
updatedAt
string (date-time)
Request
curl -X POST "https://api.ken.so/v1/access-requests/812/cancel" \
  -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,
    "kind": "string",
    "key": "string",
    "level": "string",
    "reason": "string",
    "status": "string",
    "requesterId": 812,
    "decidedById": 812,
    "decidedAt": "2026-09-23T15:02:11Z",
    "createdAt": "2026-09-23T15:02:11Z",
    "updatedAt": "2026-09-23T15:02:11Z"
  }
}