Teams
Departments and teams (maintenance, IT, cleaning…): members and heads, served locations, task queue and its distribution, team schedule, QR request points. org.view sees all teams, a team head sees own teams, members see their teams and queue; changes require org.manage. Taking a queued task — tasks.take.
GET List teams
GET /teams
With org.view — all teams of the company; otherwise the teams the acting user belongs to or heads.
Token scope read
Permission
Any employee; results follow the token's visibility
MCP tool teams_list · read-only
Query parameters
kind
string
Only teams of this direction.
Maximum length 80.
location_id
integer
Only teams serving this location.
mine
boolean
Only teams the acting user belongs to.
Responses
Status Description
200 OK
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Plan without API access
422 validation_failed — Invalid parameters — see error.fields
429 rate_limited — Too many requests — retry after Retry-After seconds
Request
cURL
Node.js
Python
PHP
MCP
Copy
curl 'https://app.jecheck.io/api/ext/v1/teams?kind=string' \
-H 'Authorization: Bearer $JECHECK_TOKEN'
const res = await fetch('https://app.jecheck.io/api/ext/v1/teams?kind=string', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
},
});
const { data } = await res.json();
import os, requests
res = requests.get(
"https://app.jecheck.io/api/ext/v1/teams",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
params={"kind":"string"},
)
res.raise_for_status()
data = res.json()["data"]
$client = new GuzzleHttp\Client(['base_uri' => 'https://app.jecheck.io/api/ext/v1/']);
$res = $client->request('GET', 'teams', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'query' => [
'kind' => 'string',
],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "teams_list",
"arguments": {
"kind": "string"
}
}
}
{
"data": [
{
"id": 9,
"uuid": "4b3a2c1d-0e9f-4a8b-9c7d-6e5f4a3b2c1d",
"name": "Maintenance",
"kind": "Repairs",
"color": "#5249e6",
"icon": "build",
"description": "Equipment repairs in all coffee shops",
"all_locations": false,
"locations": [
{
"id": 12,
"name": "Abay Ave"
}
],
"routing": "load",
"only_on_shift": true,
"notify": "heads",
"take_minutes": 30,
"members": [
{
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"is_head": true
}
],
"members_count": 1,
"is_member": true,
"is_head": true
}
]
}
GET List team directions
GET /teams/kinds
Distinct directions (kind) of the company teams — targets for automation scenarios and QR request points.
Token scope read
Permission
Any employee; results follow the token's visibility
MCP tool teams_kinds · 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
Request
cURL
Node.js
Python
PHP
MCP
Copy
curl 'https://app.jecheck.io/api/ext/v1/teams/kinds' \
-H 'Authorization: Bearer $JECHECK_TOKEN'
const res = await fetch('https://app.jecheck.io/api/ext/v1/teams/kinds', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
},
});
const { data } = await res.json();
import os, requests
res = requests.get(
"https://app.jecheck.io/api/ext/v1/teams/kinds",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
)
res.raise_for_status()
data = res.json()["data"]
$client = new GuzzleHttp\Client(['base_uri' => 'https://app.jecheck.io/api/ext/v1/']);
$res = $client->request('GET', 'teams/kinds', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "teams_kinds",
"arguments": {}
}
}
{
"data": [
"Cleaning",
"IT",
"Repairs"
]
}
GET Retrieve a team
GET /teams/{id}
Team settings, members with workload, 30-day figures (with org.view or the paid feature teams_pro) and recent tasks. Available to team heads and with org.view.
Token scope read
Permission
Any employee; results follow the token's visibility
MCP tool teams_get · read-only
Path parameters
id
integer
Required
Team id.
Responses
Status Description
200 OK
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Plan without API access
404 not_found — The record does not exist or is not visible to the token
422 validation_failed — Invalid parameters — see error.fields
429 rate_limited — Too many requests — retry after Retry-After seconds
Request
cURL
Node.js
Python
PHP
MCP
Copy
curl 'https://app.jecheck.io/api/ext/v1/teams/42' \
-H 'Authorization: Bearer $JECHECK_TOKEN'
const res = await fetch('https://app.jecheck.io/api/ext/v1/teams/42', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
},
});
const { data } = await res.json();
import os, requests
res = requests.get(
"https://app.jecheck.io/api/ext/v1/teams/42",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
)
res.raise_for_status()
data = res.json()["data"]
$client = new GuzzleHttp\Client(['base_uri' => 'https://app.jecheck.io/api/ext/v1/']);
$res = $client->request('GET', 'teams/42', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "teams_get",
"arguments": {
"id": 42
}
}
}
{
"data": {
"id": 9,
"uuid": "4b3a2c1d-0e9f-4a8b-9c7d-6e5f4a3b2c1d",
"name": "Maintenance",
"kind": "Repairs",
"color": "#5249e6",
"icon": "build",
"description": "Equipment repairs in all coffee shops",
"all_locations": false,
"locations": [
{
"id": 12,
"name": "Abay Ave"
}
],
"routing": "load",
"only_on_shift": true,
"notify": "heads",
"take_minutes": 30,
"members": [
{
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"is_head": true
}
],
"members_count": 1,
"is_member": true,
"is_head": true,
"stats": {
"open": 7,
"queued": 2,
"overdue": 1,
"done_30d": 41,
"avg_take_minutes": 18,
"avg_close_minutes": 640,
"on_time_percent": 92
},
"workload": [
{
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"open_tasks": 3,
"done_30d": 14
}
],
"recent_tasks": [
{
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"title": "Coffee machine leaks",
"status": "new",
"assignees": [],
"queued": true,
"location": "Abay Ave",
"due_date": "2026-11-04",
"source": "request",
"created_at": "2026-11-03T09:10:00+05:00"
}
]
}
}
GET Get the team schedule for a week
GET /teams/{id}/schedule
Published shifts and approved absences of team members for the week containing from. Available to team heads and with org.view.
Token scope read
Permission
Any employee; results follow the token's visibility
MCP tool teams_schedule · read-only
Path parameters
id
integer
Required
Team id.
Query parameters
from
date
Any day of the week, default — current week.
Responses
Status Description
200 OK
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Plan without API access
404 not_found — The record does not exist or is not visible to the token
422 validation_failed — Invalid parameters — see error.fields
429 rate_limited — Too many requests — retry after Retry-After seconds
Request
cURL
Node.js
Python
PHP
MCP
Copy
curl 'https://app.jecheck.io/api/ext/v1/teams/42/schedule?from=2026-11-01' \
-H 'Authorization: Bearer $JECHECK_TOKEN'
const res = await fetch('https://app.jecheck.io/api/ext/v1/teams/42/schedule?from=2026-11-01', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
},
});
const { data } = await res.json();
import os, requests
res = requests.get(
"https://app.jecheck.io/api/ext/v1/teams/42/schedule",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
params={"from":"2026-11-01"},
)
res.raise_for_status()
data = res.json()["data"]
$client = new GuzzleHttp\Client(['base_uri' => 'https://app.jecheck.io/api/ext/v1/']);
$res = $client->request('GET', 'teams/42/schedule', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'query' => [
'from' => '2026-11-01',
],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "teams_schedule",
"arguments": {
"id": 42,
"from": "2026-11-01"
}
}
}
{
"data": {
"from": "2026-11-02",
"days": [
"2026-11-02",
"2026-11-03"
],
"members": [
{
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"on_shift_now": "Abay Ave",
"days": [
{
"date": "2026-11-02",
"shifts": [
{
"start": "09:00",
"end": "18:00",
"location": "Abay Ave",
"color": "#5b54e8"
}
],
"absence": null
}
]
}
]
}
}
GET List the team task queue
GET /teams/queue
Open tasks waiting in the queue of the acting user's teams (nobody has taken them yet), oldest first. With org.view any team may be requested via team_id. Take one with tasks.take, or assign with teams.queue.assign (team heads).
Token scope read
Permission
Any employee; results follow the token's visibility
MCP tool teams_queue · read-only
Query parameters
team_id
integer
Only this team.
Responses
Status Description
200 OK
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Plan without API access
422 validation_failed — Invalid parameters — see error.fields
429 rate_limited — Too many requests — retry after Retry-After seconds
Request
cURL
Node.js
Python
PHP
MCP
Copy
curl 'https://app.jecheck.io/api/ext/v1/teams/queue?team_id=42' \
-H 'Authorization: Bearer $JECHECK_TOKEN'
const res = await fetch('https://app.jecheck.io/api/ext/v1/teams/queue?team_id=42', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
},
});
const { data } = await res.json();
import os, requests
res = requests.get(
"https://app.jecheck.io/api/ext/v1/teams/queue",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
params={"team_id":42},
)
res.raise_for_status()
data = res.json()["data"]
$client = new GuzzleHttp\Client(['base_uri' => 'https://app.jecheck.io/api/ext/v1/']);
$res = $client->request('GET', 'teams/queue', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'query' => [
'team_id' => 42,
],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "teams_queue",
"arguments": {
"team_id": 42
}
}
}
{
"data": [
{
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"title": "Coffee machine leaks",
"team_id": 9,
"location": {
"id": 12,
"name": "Abay Ave"
},
"priority": "high",
"due_date": "2026-11-04",
"queued_at": "2026-11-03T09:10:00+05:00",
"source": "request",
"url": "https://app.jecheck.io/ui/tasks?task=3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
]
}
GET List candidates for a queued task
GET /teams/queue/{uuid}/candidates
Members of the task's team with open tasks, shift status (here — on shift at the task location, elsewhere) and absence. For team heads and administrators.
Token scope read
Permission
Any employee; results follow the token's visibility
MCP tool teams_queue_candidates · read-only
Path parameters
uuid
uuid
Required
Task UUID.
Responses
Status Description
200 OK
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Plan without API access
404 not_found — The record does not exist or is not visible to the token
422 validation_failed — Invalid parameters — see error.fields
429 rate_limited — Too many requests — retry after Retry-After seconds
Request
cURL
Node.js
Python
PHP
MCP
Copy
curl 'https://app.jecheck.io/api/ext/v1/teams/queue/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/candidates' \
-H 'Authorization: Bearer $JECHECK_TOKEN'
const res = await fetch('https://app.jecheck.io/api/ext/v1/teams/queue/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/candidates', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
},
});
const { data } = await res.json();
import os, requests
res = requests.get(
"https://app.jecheck.io/api/ext/v1/teams/queue/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/candidates",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
)
res.raise_for_status()
data = res.json()["data"]
$client = new GuzzleHttp\Client(['base_uri' => 'https://app.jecheck.io/api/ext/v1/']);
$res = $client->request('GET', 'teams/queue/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/candidates', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "teams_queue_candidates",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
}
}
{
"data": [
{
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"is_head": false,
"open_tasks": 3,
"shift": "here",
"absent": false
}
]
}
POST Assign a queued task to a member
POST /teams/queue/{uuid}/assign
A team head (or administrator) assigns the task to a team member; the member is notified.
Token scope write
Permission
Any employee; results follow the token's visibility
MCP tool teams_queue_assign
Path parameters
uuid
uuid
Required
Task UUID.
Request body
user_id
integer
Required
Team member.
Responses
Status Description
200 OK
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Read-only token
404 not_found — The record does not exist or is not visible to the token
422 validation_failed — Invalid parameters — see error.fields
429 rate_limited — Too many requests — retry after Retry-After seconds
Request
cURL
Node.js
Python
PHP
MCP
Copy
curl -X POST 'https://app.jecheck.io/api/ext/v1/teams/queue/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/assign' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"user_id": 42
}'
const res = await fetch('https://app.jecheck.io/api/ext/v1/teams/queue/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/assign', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"user_id": 42
}),
});
const { data } = await res.json();
import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/teams/queue/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/assign",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"user_id":42},
)
res.raise_for_status()
data = res.json()["data"]
$client = new GuzzleHttp\Client(['base_uri' => 'https://app.jecheck.io/api/ext/v1/']);
$res = $client->request('POST', 'teams/queue/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/assign', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'user_id' => 42,
],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "teams_queue_assign",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"user_id": 42
}
}
}
{
"data": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"title": "Coffee machine leaks",
"team_id": 9,
"location": {
"id": 12,
"name": "Abay Ave"
},
"priority": "high",
"due_date": "2026-11-04",
"queued_at": "2026-11-03T09:10:00+05:00",
"source": "request",
"url": "https://app.jecheck.io/ui/tasks?task=3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"assignees": [
{
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
}
],
"taken_at": "2026-11-03T09:20:00+05:00"
}
}
POST Create a team
POST /teams
Token scope write
Permission
org.manage
MCP tool teams_create
Request body
name
string
Required
Team name.
Length 2–120.
kind
string | null
Direction (e.g. "Repairs", "IT") — used by automation scenarios and QR points to find the team.
Maximum length 80.
color
string
Hex color.
Maximum length 9.
icon
string
Material Symbols icon name.
Maximum length 40.
description
string | null
Maximum length 500.
all_locations
boolean
Serves all locations (default true).
location_ids
array<integer>
Served locations when all_locations is false.
routing
string
Queue distribution: manual, by load, round robin (auto-distribution requires the paid feature teams_pro).
manualloadround
only_on_shift
boolean
Auto-assign only to members on shift.
notify
string
Who is notified about new queued tasks.
headsmembers
take_minutes
integer | null
Escalate to heads if nobody takes a task within N minutes.
Value 5–10080.
members
array<object>
Full member list (replaces current members).
Maximum items 500.
Responses
Status Description
201 Created
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Token lacks org.manage, is read-only
422 validation_failed — Invalid parameters — see error.fields
429 rate_limited — Too many requests — retry after Retry-After seconds
Request
cURL
Node.js
Python
PHP
MCP
Copy
curl -X POST 'https://app.jecheck.io/api/ext/v1/teams' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"name": "Replace the broken fridge seal",
"kind": "string",
"color": "string",
"icon": "string"
}'
const res = await fetch('https://app.jecheck.io/api/ext/v1/teams', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Replace the broken fridge seal",
"kind": "string",
"color": "string",
"icon": "string"
}),
});
const { data } = await res.json();
import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/teams",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"name":"Replace the broken fridge seal","kind":"string","color":"string","icon":"string"},
)
res.raise_for_status()
data = res.json()["data"]
$client = new GuzzleHttp\Client(['base_uri' => 'https://app.jecheck.io/api/ext/v1/']);
$res = $client->request('POST', 'teams', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'name' => 'Replace the broken fridge seal',
'kind' => 'string',
'color' => 'string',
'icon' => 'string',
],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "teams_create",
"arguments": {
"name": "Replace the broken fridge seal",
"kind": "string",
"color": "string",
"icon": "string"
}
}
}
{
"data": {
"id": 9,
"uuid": "4b3a2c1d-0e9f-4a8b-9c7d-6e5f4a3b2c1d",
"name": "Maintenance",
"kind": "Repairs",
"color": "#5249e6",
"icon": "build",
"description": "Equipment repairs in all coffee shops",
"all_locations": false,
"locations": [
{
"id": 12,
"name": "Abay Ave"
}
],
"routing": "load",
"only_on_shift": true,
"notify": "heads",
"take_minutes": 30,
"members": [
{
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"is_head": true
}
],
"members_count": 1,
"is_member": true,
"is_head": true
}
}
PATCH Update a team
PATCH /teams/{id}
Partial update. members replaces the whole member list; use the member operations for incremental changes.
Token scope write
Permission
org.manage
MCP tool teams_update
Path parameters
id
integer
Required
Team id.
Request body
name
string
Team name.
Length 2–120.
kind
string | null
Direction (e.g. "Repairs", "IT") — used by automation scenarios and QR points to find the team.
Maximum length 80.
color
string
Hex color.
Maximum length 9.
icon
string
Material Symbols icon name.
Maximum length 40.
description
string | null
Maximum length 500.
all_locations
boolean
Serves all locations (default true).
location_ids
array<integer>
Served locations when all_locations is false.
routing
string
Queue distribution: manual, by load, round robin (auto-distribution requires the paid feature teams_pro).
manualloadround
only_on_shift
boolean
Auto-assign only to members on shift.
notify
string
Who is notified about new queued tasks.
headsmembers
take_minutes
integer | null
Escalate to heads if nobody takes a task within N minutes.
Value 5–10080.
members
array<object>
Full member list (replaces current members).
Maximum items 500.
Responses
Status Description
200 OK
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Token lacks org.manage, is read-only
404 not_found — The record does not exist or is not visible to the token
422 validation_failed — Invalid parameters — see error.fields
429 rate_limited — Too many requests — retry after Retry-After seconds
Request
cURL
Node.js
Python
PHP
MCP
Copy
curl -X PATCH 'https://app.jecheck.io/api/ext/v1/teams/42' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"name": "Replace the broken fridge seal",
"kind": "string",
"color": "string",
"icon": "string"
}'
const res = await fetch('https://app.jecheck.io/api/ext/v1/teams/42', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Replace the broken fridge seal",
"kind": "string",
"color": "string",
"icon": "string"
}),
});
const { data } = await res.json();
import os, requests
res = requests.patch(
"https://app.jecheck.io/api/ext/v1/teams/42",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"name":"Replace the broken fridge seal","kind":"string","color":"string","icon":"string"},
)
res.raise_for_status()
data = res.json()["data"]
$client = new GuzzleHttp\Client(['base_uri' => 'https://app.jecheck.io/api/ext/v1/']);
$res = $client->request('PATCH', 'teams/42', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'name' => 'Replace the broken fridge seal',
'kind' => 'string',
'color' => 'string',
'icon' => 'string',
],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "teams_update",
"arguments": {
"id": 42,
"name": "Replace the broken fridge seal",
"kind": "string",
"color": "string",
"icon": "string"
}
}
}
{
"data": {
"id": 9,
"uuid": "4b3a2c1d-0e9f-4a8b-9c7d-6e5f4a3b2c1d",
"name": "Maintenance",
"kind": "Repairs",
"color": "#5249e6",
"icon": "build",
"description": "Equipment repairs in all coffee shops",
"all_locations": false,
"locations": [
{
"id": 12,
"name": "Abay Ave"
}
],
"routing": "load",
"only_on_shift": true,
"notify": "heads",
"take_minutes": 30,
"members": [
{
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"is_head": true
}
],
"members_count": 1,
"is_member": true,
"is_head": true
}
}
DEL Delete a team
DELETE /teams/{id}
Not allowed while the team queue has unassigned tasks. Its QR points are deactivated.
Token scope write
Permission
org.manage
MCP tool teams_delete · destructive
Path parameters
id
integer
Required
Team id.
Responses
Status Description
200 OK
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Token lacks org.manage, is read-only
404 not_found — The record does not exist or is not visible to the token
422 validation_failed — Invalid parameters — see error.fields
429 rate_limited — Too many requests — retry after Retry-After seconds
Request
cURL
Node.js
Python
PHP
MCP
Copy
curl -X DELETE 'https://app.jecheck.io/api/ext/v1/teams/42' \
-H 'Authorization: Bearer $JECHECK_TOKEN'
const res = await fetch('https://app.jecheck.io/api/ext/v1/teams/42', {
method: 'DELETE',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
},
});
const { data } = await res.json();
import os, requests
res = requests.delete(
"https://app.jecheck.io/api/ext/v1/teams/42",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
)
res.raise_for_status()
data = res.json()["data"]
$client = new GuzzleHttp\Client(['base_uri' => 'https://app.jecheck.io/api/ext/v1/']);
$res = $client->request('DELETE', 'teams/42', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "teams_delete",
"arguments": {
"id": 42
}
}
}
{
"data": {
"deleted": true
}
}
PUT Reorder teams
PUT /teams/order
Token scope write
Permission
org.manage
MCP tool teams_reorder
Request body
ids
array<integer>
Required
Team ids in the new order.
Minimum items 1.
Responses
Status Description
200 OK
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Token lacks org.manage, is read-only
422 validation_failed — Invalid parameters — see error.fields
429 rate_limited — Too many requests — retry after Retry-After seconds
Request
cURL
Node.js
Python
PHP
MCP
Copy
curl -X PUT 'https://app.jecheck.io/api/ext/v1/teams/order' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"ids": [
12,
14
]
}'
const res = await fetch('https://app.jecheck.io/api/ext/v1/teams/order', {
method: 'PUT',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"ids": [
12,
14
]
}),
});
const { data } = await res.json();
import os, requests
res = requests.put(
"https://app.jecheck.io/api/ext/v1/teams/order",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"ids":[12,14]},
)
res.raise_for_status()
data = res.json()["data"]
$client = new GuzzleHttp\Client(['base_uri' => 'https://app.jecheck.io/api/ext/v1/']);
$res = $client->request('PUT', 'teams/order', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'ids' => [
12,
14,
],
],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "teams_reorder",
"arguments": {
"ids": [
12,
14
]
}
}
}
{
"data": {
"ok": true
}
}
POST Add team members
POST /teams/{id}/members
Adds employees to the team; with from_team_id moves them from another team (a head is moved as a regular member).
Token scope write
Permission
org.manage
MCP tool teams_members_add
Path parameters
id
integer
Required
Team id.
Request body
user_ids
array<integer>
Required
Items 1–500.
from_team_id
integer
Move from this team.
Responses
Status Description
200 OK
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Token lacks org.manage, is read-only
404 not_found — The record does not exist or is not visible to the token
422 validation_failed — Invalid parameters — see error.fields
429 rate_limited — Too many requests — retry after Retry-After seconds
Request
cURL
Node.js
Python
PHP
MCP
Copy
curl -X POST 'https://app.jecheck.io/api/ext/v1/teams/42/members' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"user_ids": [
12,
14
],
"from_team_id": 42
}'
const res = await fetch('https://app.jecheck.io/api/ext/v1/teams/42/members', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"user_ids": [
12,
14
],
"from_team_id": 42
}),
});
const { data } = await res.json();
import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/teams/42/members",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"user_ids":[12,14],"from_team_id":42},
)
res.raise_for_status()
data = res.json()["data"]
$client = new GuzzleHttp\Client(['base_uri' => 'https://app.jecheck.io/api/ext/v1/']);
$res = $client->request('POST', 'teams/42/members', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'user_ids' => [
12,
14,
],
'from_team_id' => 42,
],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "teams_members_add",
"arguments": {
"id": 42,
"user_ids": [
12,
14
],
"from_team_id": 42
}
}
}
{
"data": {
"id": 9,
"uuid": "4b3a2c1d-0e9f-4a8b-9c7d-6e5f4a3b2c1d",
"name": "Maintenance",
"kind": "Repairs",
"color": "#5249e6",
"icon": "build",
"description": "Equipment repairs in all coffee shops",
"all_locations": false,
"locations": [
{
"id": 12,
"name": "Abay Ave"
}
],
"routing": "load",
"only_on_shift": true,
"notify": "heads",
"take_minutes": 30,
"members": [
{
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"is_head": true
}
],
"members_count": 1,
"is_member": true,
"is_head": true
}
}
DEL Remove a team member
DELETE /teams/{id}/members/{user_id}
Token scope write
Permission
org.manage
MCP tool teams_members_remove · destructive
Path parameters
id
integer
Required
Team id.
user_id
integer
Required
User id.
Responses
Status Description
200 OK
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Token lacks org.manage, is read-only
404 not_found — The record does not exist or is not visible to the token
422 validation_failed — Invalid parameters — see error.fields
429 rate_limited — Too many requests — retry after Retry-After seconds
Request
cURL
Node.js
Python
PHP
MCP
Copy
curl -X DELETE 'https://app.jecheck.io/api/ext/v1/teams/42/members/42' \
-H 'Authorization: Bearer $JECHECK_TOKEN'
const res = await fetch('https://app.jecheck.io/api/ext/v1/teams/42/members/42', {
method: 'DELETE',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
},
});
const { data } = await res.json();
import os, requests
res = requests.delete(
"https://app.jecheck.io/api/ext/v1/teams/42/members/42",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
)
res.raise_for_status()
data = res.json()["data"]
$client = new GuzzleHttp\Client(['base_uri' => 'https://app.jecheck.io/api/ext/v1/']);
$res = $client->request('DELETE', 'teams/42/members/42', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "teams_members_remove",
"arguments": {
"id": 42,
"user_id": 42
}
}
}
{
"data": {
"deleted": true
}
}
PUT Make or unmake a team head
PUT /teams/{id}/members/{user_id}/head
A head distributes the team queue and sees team figures. Making a non-member a head adds them to the team.
Token scope write
Permission
org.manage
MCP tool teams_members_head
Path parameters
id
integer
Required
Team id.
user_id
integer
Required
User id.
Request body
is_head
boolean
Default true.
Responses
Status Description
200 OK
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Token lacks org.manage, is read-only
404 not_found — The record does not exist or is not visible to the token
422 validation_failed — Invalid parameters — see error.fields
429 rate_limited — Too many requests — retry after Retry-After seconds
Request
cURL
Node.js
Python
PHP
MCP
Copy
curl -X PUT 'https://app.jecheck.io/api/ext/v1/teams/42/members/42/head' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"is_head": true
}'
const res = await fetch('https://app.jecheck.io/api/ext/v1/teams/42/members/42/head', {
method: 'PUT',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"is_head": true
}),
});
const { data } = await res.json();
import os, requests
res = requests.put(
"https://app.jecheck.io/api/ext/v1/teams/42/members/42/head",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"is_head":True},
)
res.raise_for_status()
data = res.json()["data"]
$client = new GuzzleHttp\Client(['base_uri' => 'https://app.jecheck.io/api/ext/v1/']);
$res = $client->request('PUT', 'teams/42/members/42/head', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'is_head' => true,
],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "teams_members_head",
"arguments": {
"id": 42,
"user_id": 42,
"is_head": true
}
}
}
{
"data": {
"id": 9,
"uuid": "4b3a2c1d-0e9f-4a8b-9c7d-6e5f4a3b2c1d",
"name": "Maintenance",
"kind": "Repairs",
"color": "#5249e6",
"icon": "build",
"description": "Equipment repairs in all coffee shops",
"all_locations": false,
"locations": [
{
"id": 12,
"name": "Abay Ave"
}
],
"routing": "load",
"only_on_shift": true,
"notify": "heads",
"take_minutes": 30,
"members": [
{
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"is_head": true
}
],
"members_count": 1,
"is_member": true,
"is_head": true
}
}
GET List QR request points
GET /teams/request-points
QR codes placed at locations or equipment: guests and staff scan and leave a request that goes to the team queue. url is the public request page.
Token scope read
Permission
org.manage
MCP tool teams_request_points_list · read-only
Responses
Status Description
200 OK
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Token lacks org.manage
429 rate_limited — Too many requests — retry after Retry-After seconds
Request
cURL
Node.js
Python
PHP
MCP
Copy
curl 'https://app.jecheck.io/api/ext/v1/teams/request-points' \
-H 'Authorization: Bearer $JECHECK_TOKEN'
const res = await fetch('https://app.jecheck.io/api/ext/v1/teams/request-points', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
},
});
const { data } = await res.json();
import os, requests
res = requests.get(
"https://app.jecheck.io/api/ext/v1/teams/request-points",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
)
res.raise_for_status()
data = res.json()["data"]
$client = new GuzzleHttp\Client(['base_uri' => 'https://app.jecheck.io/api/ext/v1/']);
$res = $client->request('GET', 'teams/request-points', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "teams_request_points_list",
"arguments": {}
}
}
{
"data": [
{
"id": 21,
"title": "Reception",
"location": {
"id": 12,
"name": "Abay Ave"
},
"team_id": 9,
"kind": null,
"active": true,
"requests_count": 17,
"url": "https://app.jecheck.io/r/aB3dE5fG7hJ9kL1mN3pQ5rS7"
}
]
}
POST Create a QR request point
POST /teams/request-points
Requests go to team_id or, if not set, to the team of direction kind serving the location.
Token scope write
Permission
org.manage
Plan feature teams_pro
MCP tool teams_request_points_create
Request body
title
string
Required
Where the code hangs, e.g. "Reception".
Maximum length 120.
location_id
integer
Required
kind
string | null
Direction (when no team).
Maximum length 80.
active
boolean
Default true.
Responses
Status Description
201 Created
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Token lacks org.manage, is read-only, or the plan has no teams_pro
422 validation_failed — Invalid parameters — see error.fields
429 rate_limited — Too many requests — retry after Retry-After seconds
Request
cURL
Node.js
Python
PHP
MCP
Copy
curl -X POST 'https://app.jecheck.io/api/ext/v1/teams/request-points' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"title": "Replace the broken fridge seal",
"location_id": 12,
"team_id": 42,
"kind": "string"
}'
const res = await fetch('https://app.jecheck.io/api/ext/v1/teams/request-points', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"title": "Replace the broken fridge seal",
"location_id": 12,
"team_id": 42,
"kind": "string"
}),
});
const { data } = await res.json();
import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/teams/request-points",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"title":"Replace the broken fridge seal","location_id":12,"team_id":42,"kind":"string"},
)
res.raise_for_status()
data = res.json()["data"]
$client = new GuzzleHttp\Client(['base_uri' => 'https://app.jecheck.io/api/ext/v1/']);
$res = $client->request('POST', 'teams/request-points', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'title' => 'Replace the broken fridge seal',
'location_id' => 12,
'team_id' => 42,
'kind' => 'string',
],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "teams_request_points_create",
"arguments": {
"title": "Replace the broken fridge seal",
"location_id": 12,
"team_id": 42,
"kind": "string"
}
}
}
{
"data": {
"id": 21,
"title": "Reception",
"location": {
"id": 12,
"name": "Abay Ave"
},
"team_id": 9,
"kind": null,
"active": true,
"requests_count": 17,
"url": "https://app.jecheck.io/r/aB3dE5fG7hJ9kL1mN3pQ5rS7"
}
}
PATCH Update a QR request point
PATCH /teams/request-points/{id}
Token scope write
Permission
org.manage
MCP tool teams_request_points_update
Path parameters
id
integer
Required
Request point id.
Request body
title
string
Maximum length 120.
kind
string | null
Maximum length 80.
Responses
Status Description
200 OK
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Token lacks org.manage, is read-only
404 not_found — The record does not exist or is not visible to the token
422 validation_failed — Invalid parameters — see error.fields
429 rate_limited — Too many requests — retry after Retry-After seconds
Request
cURL
Node.js
Python
PHP
MCP
Copy
curl -X PATCH 'https://app.jecheck.io/api/ext/v1/teams/request-points/42' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"title": "Replace the broken fridge seal",
"location_id": 12,
"team_id": 42,
"kind": "string"
}'
const res = await fetch('https://app.jecheck.io/api/ext/v1/teams/request-points/42', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"title": "Replace the broken fridge seal",
"location_id": 12,
"team_id": 42,
"kind": "string"
}),
});
const { data } = await res.json();
import os, requests
res = requests.patch(
"https://app.jecheck.io/api/ext/v1/teams/request-points/42",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"title":"Replace the broken fridge seal","location_id":12,"team_id":42,"kind":"string"},
)
res.raise_for_status()
data = res.json()["data"]
$client = new GuzzleHttp\Client(['base_uri' => 'https://app.jecheck.io/api/ext/v1/']);
$res = $client->request('PATCH', 'teams/request-points/42', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'title' => 'Replace the broken fridge seal',
'location_id' => 12,
'team_id' => 42,
'kind' => 'string',
],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "teams_request_points_update",
"arguments": {
"id": 42,
"title": "Replace the broken fridge seal",
"location_id": 12,
"team_id": 42,
"kind": "string"
}
}
}
{
"data": {
"id": 21,
"title": "Reception",
"location": {
"id": 12,
"name": "Abay Ave"
},
"team_id": 9,
"kind": null,
"active": true,
"requests_count": 17,
"url": "https://app.jecheck.io/r/aB3dE5fG7hJ9kL1mN3pQ5rS7"
}
}
DEL Delete a QR request point
DELETE /teams/request-points/{id}
Token scope write
Permission
org.manage
MCP tool teams_request_points_delete · destructive
Path parameters
id
integer
Required
Request point id.
Responses
Status Description
200 OK
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Token lacks org.manage, is read-only
404 not_found — The record does not exist or is not visible to the token
422 validation_failed — Invalid parameters — see error.fields
429 rate_limited — Too many requests — retry after Retry-After seconds
Request
cURL
Node.js
Python
PHP
MCP
Copy
curl -X DELETE 'https://app.jecheck.io/api/ext/v1/teams/request-points/42' \
-H 'Authorization: Bearer $JECHECK_TOKEN'
const res = await fetch('https://app.jecheck.io/api/ext/v1/teams/request-points/42', {
method: 'DELETE',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
},
});
const { data } = await res.json();
import os, requests
res = requests.delete(
"https://app.jecheck.io/api/ext/v1/teams/request-points/42",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
)
res.raise_for_status()
data = res.json()["data"]
$client = new GuzzleHttp\Client(['base_uri' => 'https://app.jecheck.io/api/ext/v1/']);
$res = $client->request('DELETE', 'teams/request-points/42', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "teams_request_points_delete",
"arguments": {
"id": 42
}
}
}
{
"data": {
"deleted": true
}
}