The permission catalog, company roles, effective permissions of an employee and the access log. Changes follow the delegation rules of the web app: a non-administrator can grant only permissions they hold themselves, only on their own locations, and cannot change administrators.
Every permission key with its group, label, description, whether it can be limited to locations (scoped), whether views are logged (sensitive) and the permissions it requires.
Token scope
read
Permission
Any employee; results follow the token's visibility
MCP tool
access_permissions_list · read-only
Responses
Status
Description
200
OK
401
unauthorized — Missing, invalid, revoked or expired token
403
forbidden · insufficient_scope · plan_required — Plan without API access
429
rate_limited — Too many requests — retry after Retry-After seconds
{
"data": [
{
"key": "users.contacts",
"group": "users",
"group_label": "Employees",
"label": "Employee phone and email",
"hint": "See email and phone in the list and card",
"description": "Email and phone of employees in the list, card and export.",
"scoped": true,
"sensitive": false,
"requires": []
}
]
}
GETList roles
GET /access/roles
Company roles with their permissions and members. System roles (system_key: employee — everyone, location_manager — managers of locations and regions) are applied automatically and cannot be assigned or deleted.
Token scope
read
Permission
access.manage or access.roles or access.log
MCP tool
access_roles_list · read-only
Responses
Status
Description
200
OK
401
unauthorized — Missing, invalid, revoked or expired token
A non-administrator can include only permissions they hold, within their own locations. Written to the access log.
Token scope
write
Permission
access.roles
MCP tool
access_roles_create
Request body
namestringRequired
Role name (system roles cannot be renamed).
Length 1–120.
descriptionstring | null
Maximum length 500.
colorstring | null
Hex color.
Maximum length 9.
permissionsarray<object>
Full list of the role permissions (replaces the current list). Required dependencies are added automatically. scope: all — all locations, own — the member's own locations, managed — locations the member manages, list — location_ids.
Maximum items 300.
keystringRequired
Permission key from GET /access/permissions.
Maximum length 64.
scopestring
Location scope, default all.
allownmanagedlist
location_idsarray<integer>
Locations for scope: list.
Responses
Status
Description
201
Created
401
unauthorized — Missing, invalid, revoked or expired token
validation_failed — Invalid parameters — see error.fields
429
rate_limited — Too many requests — retry after Retry-After seconds
Request
curl -X POST 'https://app.jecheck.io/api/ext/v1/access/roles' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"name": "Replace the broken fridge seal",
"description": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"color": "string",
"permissions": [
{
"key": "string",
"scope": "all",
"location_ids": [
12,
14
]
}
]
}'
const res = await fetch('https://app.jecheck.io/api/ext/v1/access/roles', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Replace the broken fridge seal",
"description": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"color": "string",
"permissions": [
{
"key": "string",
"scope": "all",
"location_ids": [
12,
14
]
}
]
}),
});
const { data } = await res.json();
import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/access/roles",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"name":"Replace the broken fridge seal","description":"Seal on fridge #2 is torn, temperature rises to +9 °C.","color":"string","permissions":[{"key":"string","scope":"all","location_ids":[12,14]}]},
)
res.raise_for_status()
data = res.json()["data"]
Partial update. permissions, when passed, replaces the whole list. Members get the new permissions immediately.
Token scope
write
Permission
access.roles
MCP tool
access_roles_update
Path parameters
idintegerRequired
Role id.
Request body
namestring
Role name (system roles cannot be renamed).
Length 1–120.
descriptionstring | null
Maximum length 500.
colorstring | null
Hex color.
Maximum length 9.
permissionsarray<object>
Full list of the role permissions (replaces the current list). Required dependencies are added automatically. scope: all — all locations, own — the member's own locations, managed — locations the member manages, list — location_ids.
Maximum items 300.
keystringRequired
Permission key from GET /access/permissions.
Maximum length 64.
scopestring
Location scope, default all.
allownmanagedlist
location_idsarray<integer>
Locations for scope: list.
Responses
Status
Description
200
OK
401
unauthorized — Missing, invalid, revoked or expired token
const res = await fetch('https://app.jecheck.io/api/ext/v1/access/roles/42', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Replace the broken fridge seal",
"description": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"color": "string",
"permissions": [
{
"key": "string",
"scope": "all",
"location_ids": [
12,
14
]
}
]
}),
});
const { data } = await res.json();
import os, requests
res = requests.patch(
"https://app.jecheck.io/api/ext/v1/access/roles/42",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"name":"Replace the broken fridge seal","description":"Seal on fridge #2 is torn, temperature rises to +9 °C.","color":"string","permissions":[{"key":"string","scope":"all","location_ids":[12,14]}]},
)
res.raise_for_status()
data = res.json()["data"]
Roles, personal grants and denials, and effective permissions with the locations where each applies (location_ids: null — all locations) and where it comes from. With only users.access the response contains just user and account (administrator and web-cabinet flags).
Token scope
read
Permission
access.manage or access.roles or access.log or users.access
MCP tool
access_users_get · read-only
Path parameters
idintegerRequired
Employee id.
Responses
Status
Description
200
OK
401
unauthorized — Missing, invalid, revoked or expired token
PUTSet roles and personal permissions of an employee
PUT /access/users/{id}
Replaces the employee's roles (role_ids) and/or personal permissions (personal); an omitted field keeps its current value. Administrators and yourself cannot be changed. Every change is logged.
Token scope
write
Permission
access.manage
MCP tool
access_users_update
Path parameters
idintegerRequired
Employee id.
Request body
role_idsarray<integer>
Ids of company (non-system) roles.
Maximum items 100.
personalarray<object>
Personal grants and denials.
Maximum items 300.
keystringRequired
Permission key from GET /access/permissions.
Maximum length 64.
effectstringRequired
grant or deny (deny overrides roles).
grantdeny
scopestring
Location scope, default all.
allownmanagedlist
location_idsarray<integer>
Locations for scope: list.
Responses
Status
Description
200
OK
401
unauthorized — Missing, invalid, revoked or expired token
is_admin — only an administrator can appoint or remove administrators (not themselves, not the company owner). web_access: false makes the employee "app only" (requires users.access for the employee). Logged.
Token scope
write
Permission
access.manage or access.roles or access.log or users.access
MCP tool
access_users_account_update
Path parameters
idintegerRequired
Employee id.
Request body
is_adminboolean
web_accessboolean
Responses
Status
Description
200
OK
401
unauthorized — Missing, invalid, revoked or expired token