jeCheckDevelopers
Get an API key

GETList teams

GET /teams

With org.view — all teams of the company; otherwise the teams the acting user belongs to or heads.

Token scoperead
Permission Any employee; results follow the token's visibility
MCP toolteams_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

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Plan without API access
422validation_failed — Invalid parameters — see error.fields
429rate_limited — Too many requests — retry after Retry-After seconds
Request
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"
        }
    }
}
Response 200
{
  "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
    }
  ]
}

GETList team directions

GET /teams/kinds

Distinct directions (kind) of the company teams — targets for automation scenarios and QR request points.

Token scoperead
Permission Any employee; results follow the token's visibility
MCP toolteams_kinds · read-only

Responses

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Plan without API access
429rate_limited — Too many requests — retry after Retry-After seconds
Request
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": {}
    }
}
Response 200
{
  "data": [
    "Cleaning",
    "IT",
    "Repairs"
  ]
}

GETRetrieve 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 scoperead
Permission Any employee; results follow the token's visibility
MCP toolteams_get · read-only

Path parameters

id integer Required
Team id.

Responses

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Plan without API access
404not_found — The record does not exist or is not visible to the token
422validation_failed — Invalid parameters — see error.fields
429rate_limited — Too many requests — retry after Retry-After seconds
Request
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
        }
    }
}
Response 200
{
  "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"
      }
    ]
  }
}

GETGet 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 scoperead
Permission Any employee; results follow the token's visibility
MCP toolteams_schedule · read-only

Path parameters

id integer Required
Team id.

Query parameters

from date
Any day of the week, default — current week.

Responses

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Plan without API access
404not_found — The record does not exist or is not visible to the token
422validation_failed — Invalid parameters — see error.fields
429rate_limited — Too many requests — retry after Retry-After seconds
Request
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"
        }
    }
}
Response 200
{
  "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
          }
        ]
      }
    ]
  }
}

GETList 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 scoperead
Permission Any employee; results follow the token's visibility
MCP toolteams_queue · read-only

Query parameters

team_id integer
Only this team.

Responses

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Plan without API access
422validation_failed — Invalid parameters — see error.fields
429rate_limited — Too many requests — retry after Retry-After seconds
Request
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
        }
    }
}
Response 200
{
  "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"
    }
  ]
}

GETList 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 scoperead
Permission Any employee; results follow the token's visibility
MCP toolteams_queue_candidates · read-only

Path parameters

uuid uuid Required
Task UUID.

Responses

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Plan without API access
404not_found — The record does not exist or is not visible to the token
422validation_failed — Invalid parameters — see error.fields
429rate_limited — Too many requests — retry after Retry-After seconds
Request
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"
        }
    }
}
Response 200
{
  "data": [
    {
      "user": {
        "id": 311,
        "uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
        "name": "Aigerim Sadykova"
      },
      "is_head": false,
      "open_tasks": 3,
      "shift": "here",
      "absent": false
    }
  ]
}

POSTAssign 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 scopewrite
Permission Any employee; results follow the token's visibility
MCP toolteams_queue_assign

Path parameters

uuid uuid Required
Task UUID.

Request body

user_id integer Required
Team member.

Responses

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Read-only token
404not_found — The record does not exist or is not visible to the token
422validation_failed — Invalid parameters — see error.fields
429rate_limited — Too many requests — retry after Retry-After seconds
Request
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
        }
    }
}
Response 200
{
  "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"
  }
}

POSTCreate a team

POST /teams
Token scopewrite
Permission org.manage
MCP toolteams_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.
user_id integer Required
is_head boolean

Responses

StatusDescription
201Created
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Token lacks org.manage, is read-only
422validation_failed — Invalid parameters — see error.fields
429rate_limited — Too many requests — retry after Retry-After seconds
Request
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"
        }
    }
}
Response 201
{
  "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
  }
}

PATCHUpdate a team

PATCH /teams/{id}

Partial update. members replaces the whole member list; use the member operations for incremental changes.

Token scopewrite
Permission org.manage
MCP toolteams_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.
user_id integer Required
is_head boolean

Responses

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Token lacks org.manage, is read-only
404not_found — The record does not exist or is not visible to the token
422validation_failed — Invalid parameters — see error.fields
429rate_limited — Too many requests — retry after Retry-After seconds
Request
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"
        }
    }
}
Response 200
{
  "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
  }
}

DELDelete a team

DELETE /teams/{id}

Not allowed while the team queue has unassigned tasks. Its QR points are deactivated.

Token scopewrite
Permission org.manage
MCP toolteams_delete · destructive

Path parameters

id integer Required
Team id.

Responses

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Token lacks org.manage, is read-only
404not_found — The record does not exist or is not visible to the token
422validation_failed — Invalid parameters — see error.fields
429rate_limited — Too many requests — retry after Retry-After seconds
Request
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
        }
    }
}
Response 200
{
  "data": {
    "deleted": true
  }
}

PUTReorder teams

PUT /teams/order
Token scopewrite
Permission org.manage
MCP toolteams_reorder

Request body

ids array<integer> Required
Team ids in the new order. Minimum items 1.

Responses

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Token lacks org.manage, is read-only
422validation_failed — Invalid parameters — see error.fields
429rate_limited — Too many requests — retry after Retry-After seconds
Request
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
            ]
        }
    }
}
Response 200
{
  "data": {
    "ok": true
  }
}

POSTAdd 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 scopewrite
Permission org.manage
MCP toolteams_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

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Token lacks org.manage, is read-only
404not_found — The record does not exist or is not visible to the token
422validation_failed — Invalid parameters — see error.fields
429rate_limited — Too many requests — retry after Retry-After seconds
Request
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
        }
    }
}
Response 200
{
  "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
  }
}

DELRemove a team member

DELETE /teams/{id}/members/{user_id}
Token scopewrite
Permission org.manage
MCP toolteams_members_remove · destructive

Path parameters

id integer Required
Team id.
user_id integer Required
User id.

Responses

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Token lacks org.manage, is read-only
404not_found — The record does not exist or is not visible to the token
422validation_failed — Invalid parameters — see error.fields
429rate_limited — Too many requests — retry after Retry-After seconds
Request
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
        }
    }
}
Response 200
{
  "data": {
    "deleted": true
  }
}

PUTMake 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 scopewrite
Permission org.manage
MCP toolteams_members_head

Path parameters

id integer Required
Team id.
user_id integer Required
User id.

Request body

is_head boolean
Default true.

Responses

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Token lacks org.manage, is read-only
404not_found — The record does not exist or is not visible to the token
422validation_failed — Invalid parameters — see error.fields
429rate_limited — Too many requests — retry after Retry-After seconds
Request
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
        }
    }
}
Response 200
{
  "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
  }
}

GETList 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 scoperead
Permission org.manage
MCP toolteams_request_points_list · read-only

Responses

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Token lacks org.manage
429rate_limited — Too many requests — retry after Retry-After seconds
Request
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": {}
    }
}
Response 200
{
  "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"
    }
  ]
}

POSTCreate 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 scopewrite
Permission org.manage
Plan featureteams_pro
MCP toolteams_request_points_create

Request body

title string Required
Where the code hangs, e.g. "Reception". Maximum length 120.
location_id integer Required
team_id integer | null
kind string | null
Direction (when no team). Maximum length 80.
active boolean
Default true.

Responses

StatusDescription
201Created
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Token lacks org.manage, is read-only, or the plan has no teams_pro
422validation_failed — Invalid parameters — see error.fields
429rate_limited — Too many requests — retry after Retry-After seconds
Request
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"
        }
    }
}
Response 201
{
  "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"
  }
}

PATCHUpdate a QR request point

PATCH /teams/request-points/{id}
Token scopewrite
Permission org.manage
MCP toolteams_request_points_update

Path parameters

id integer Required
Request point id.

Request body

title string
Maximum length 120.
location_id integer
team_id integer | null
kind string | null
Maximum length 80.
active boolean

Responses

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Token lacks org.manage, is read-only
404not_found — The record does not exist or is not visible to the token
422validation_failed — Invalid parameters — see error.fields
429rate_limited — Too many requests — retry after Retry-After seconds
Request
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"
        }
    }
}
Response 200
{
  "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"
  }
}

DELDelete a QR request point

DELETE /teams/request-points/{id}
Token scopewrite
Permission org.manage
MCP toolteams_request_points_delete · destructive

Path parameters

id integer Required
Request point id.

Responses

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Token lacks org.manage, is read-only
404not_found — The record does not exist or is not visible to the token
422validation_failed — Invalid parameters — see error.fields
429rate_limited — Too many requests — retry after Retry-After seconds
Request
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
        }
    }
}
Response 200
{
  "data": {
    "deleted": true
  }
}