Access requests
Requests for access to a workspace.
List access requests, newest first
/v1/access-requestsaccess-requests.listNeeds the permissions feature on your workspace. Until it is on, calls answer 404.
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
400 workspace_required).Response 200
data is a list of AccessRequestModel. Each item has these fields. The response also carries pagination.
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"
{
"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
/v1/access-requestsaccess-requests.createNeeds the permissions feature on your workspace. Until it is on, calls answer 404.
{ 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
400 workspace_required).Request body
application/json, optional.
Response 201
Also answers 200. data is a AccessRequestModel.
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"
}'{
"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
/v1/access-requests/{accessRequestId}/cancelaccess-requests.cancelNeeds the permissions feature on your workspace. Until it is on, calls answer 404.
Only the person who asked; anyone else is 403 forbidden. A request that is no longer pending is 409 invalid_state.
Parameters
400 workspace_required).Response 200
data is a AccessRequestModel.
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"
{
"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"
}
}