Locations
Locations (venues, stores, branches) and regions: the list the token can see, location cards, staff and managers. Location ids are used as filters across the whole API. Creating and editing locations needs locations.manage; staff and managers — locations.staff.
GET List locations
GET /locations
Locations the token can see, sorted by name. Administrators and holders of locations.manage / locations.staff see every location; other users see their own locations plus the locations where any of their permissions applies.
Token scope read
Permission
Any employee; results follow the token's visibility
MCP tool locations_list · read-only
Query parameters
page
integer
Page number, starting from 1.
Default 1. Minimum 1.
per_page
integer
Items per page (max 100).
Default 25. Value 1–100.
region_id
integer
Only locations of this region.
search
string
Search in name and address.
Maximum length 200.
Responses
Status Description
200 OK — a page of results with meta
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/locations?region_id=42' \
-H 'Authorization: Bearer $JECHECK_TOKEN'
const res = await fetch('https://app.jecheck.io/api/ext/v1/locations?region_id=42', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
},
});
const { data, meta } = await res.json();
import os, requests
res = requests.get(
"https://app.jecheck.io/api/ext/v1/locations",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
params={"region_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', 'locations', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'query' => [
'region_id' => 42,
],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "locations_list",
"arguments": {
"region_id": 42
}
}
}
{
"data": [
{
"id": 12,
"name": "Abay Ave",
"address": "Almaty, Abay Ave 52",
"email": "[email protected] ",
"timezone": "Asia/Almaty",
"timezone_inherited": true,
"region": {
"id": 3,
"name": "Almaty"
},
"managers": [
{
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
}
],
"created_at": "2024-03-02T09:15:00+05:00",
"url": "https://app.jecheck.io/ui/locations"
}
],
"meta": {
"page": 1,
"per_page": 25,
"total": 1,
"has_more": false
}
}
GET Retrieve a location
GET /locations/{id}
Location card: address, time zone, region, managers of the location and of its region, teams serving it. With locations.manage or locations.staff it also includes the staff count and who is on shift right now.
Token scope read
Permission
Any employee; results follow the token's visibility
MCP tool locations_get · read-only
Path parameters
id
integer
Required
Location 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/locations/42' \
-H 'Authorization: Bearer $JECHECK_TOKEN'
const res = await fetch('https://app.jecheck.io/api/ext/v1/locations/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/locations/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', 'locations/42', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "locations_get",
"arguments": {
"id": 42
}
}
}
{
"data": {
"id": 12,
"name": "Abay Ave",
"address": "Almaty, Abay Ave 52",
"email": "[email protected] ",
"timezone": "Asia/Almaty",
"timezone_inherited": true,
"region": {
"id": 3,
"name": "Almaty"
},
"managers": [
{
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
}
],
"created_at": "2024-03-02T09:15:00+05:00",
"url": "https://app.jecheck.io/ui/locations",
"region_managers": [
{
"id": 98,
"uuid": "0b1c2d3e-4f5a-4b6c-8d7e-9f0a1b2c3d4e",
"name": "Asel Nurlanova"
}
],
"teams": [
{
"id": 4,
"name": "Maintenance"
}
],
"staff_count": 14,
"on_shift_now": [
{
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
}
]
}
}
POST Create a location
POST /locations
Adds a location to the company. On the free plan the number of locations is limited — the call fails with validation_failed when the limit is reached.
Token scope write
Permission
locations.manage
MCP tool locations_create
Request body
name
string
Required
Location name.
Length 2–255.
address
string | null
Street address.
Maximum length 500.
email
string | null
Contact email of the location.
Maximum length 128.
region_id
integer | null
Region id; null removes the location from its region.
timezone
string | null
IANA time zone, e.g. Asia/Almaty; null — same as the company.
Maximum length 64.
Responses
Status Description
201 Created
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Token lacks locations.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/locations' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"name": "Replace the broken fridge seal",
"address": "string",
"email": "[email protected] ",
"region_id": 42
}'
const res = await fetch('https://app.jecheck.io/api/ext/v1/locations', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Replace the broken fridge seal",
"address": "string",
"email": "[email protected] ",
"region_id": 42
}),
});
const { data } = await res.json();
import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/locations",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"name":"Replace the broken fridge seal","address":"string","email":"[email protected] ","region_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', 'locations', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'name' => 'Replace the broken fridge seal',
'address' => 'string',
'email' => '[email protected] ',
'region_id' => 42,
],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "locations_create",
"arguments": {
"name": "Replace the broken fridge seal",
"address": "string",
"email": "[email protected] ",
"region_id": 42
}
}
}
{
"data": {
"id": 12,
"name": "Abay Ave",
"address": "Almaty, Abay Ave 52",
"email": "[email protected] ",
"timezone": "Asia/Almaty",
"timezone_inherited": true,
"region": {
"id": 3,
"name": "Almaty"
},
"managers": [
{
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
}
],
"created_at": "2024-03-02T09:15:00+05:00",
"url": "https://app.jecheck.io/ui/locations",
"region_managers": [
{
"id": 98,
"uuid": "0b1c2d3e-4f5a-4b6c-8d7e-9f0a1b2c3d4e",
"name": "Asel Nurlanova"
}
],
"teams": [
{
"id": 4,
"name": "Maintenance"
}
],
"staff_count": 14,
"on_shift_now": [
{
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
}
]
}
}
PATCH Update a location
PATCH /locations/{id}
Partial update: send only the fields to change.
Token scope write
Permission
locations.manage
MCP tool locations_update
Path parameters
id
integer
Required
Location id.
Request body
name
string
Location name.
Length 2–255.
address
string | null
Street address.
Maximum length 500.
email
string | null
Contact email of the location.
Maximum length 128.
region_id
integer | null
Region id; null removes the location from its region.
timezone
string | null
IANA time zone, e.g. Asia/Almaty; null — same as the company.
Maximum length 64.
Responses
Status Description
200 OK
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Token lacks locations.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/locations/42' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"name": "Replace the broken fridge seal",
"address": "string",
"email": "[email protected] ",
"region_id": 42
}'
const res = await fetch('https://app.jecheck.io/api/ext/v1/locations/42', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Replace the broken fridge seal",
"address": "string",
"email": "[email protected] ",
"region_id": 42
}),
});
const { data } = await res.json();
import os, requests
res = requests.patch(
"https://app.jecheck.io/api/ext/v1/locations/42",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"name":"Replace the broken fridge seal","address":"string","email":"[email protected] ","region_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('PATCH', 'locations/42', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'name' => 'Replace the broken fridge seal',
'address' => 'string',
'email' => '[email protected] ',
'region_id' => 42,
],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "locations_update",
"arguments": {
"id": 42,
"name": "Replace the broken fridge seal",
"address": "string",
"email": "[email protected] ",
"region_id": 42
}
}
}
{
"data": {
"id": 12,
"name": "Abay Ave",
"address": "Almaty, Abay Ave 52",
"email": "[email protected] ",
"timezone": "Asia/Almaty",
"timezone_inherited": true,
"region": {
"id": 3,
"name": "Almaty"
},
"managers": [
{
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
}
],
"created_at": "2024-03-02T09:15:00+05:00",
"url": "https://app.jecheck.io/ui/locations",
"region_managers": [
{
"id": 98,
"uuid": "0b1c2d3e-4f5a-4b6c-8d7e-9f0a1b2c3d4e",
"name": "Asel Nurlanova"
}
],
"teams": [
{
"id": 4,
"name": "Maintenance"
}
],
"staff_count": 14,
"on_shift_now": [
{
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
}
]
}
}
DEL Delete a location
DELETE /locations/{id}
Marks the location as deleted. Its history (audits, tasks) stays; it disappears from lists and filters.
Token scope write
Permission
locations.manage
MCP tool locations_delete · destructive
Path parameters
id
integer
Required
Location id.
Responses
Status Description
200 OK
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Token lacks locations.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/locations/42' \
-H 'Authorization: Bearer $JECHECK_TOKEN'
const res = await fetch('https://app.jecheck.io/api/ext/v1/locations/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/locations/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', 'locations/42', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "locations_delete",
"arguments": {
"id": 42
}
}
}
{
"data": {
"deleted": true
}
}
GET List location staff
GET /locations/{id}/staff
Employees attached to the location: kind is home (primary location) or extra (also works here); managers that are not attached have kind: null. on_shift_now — a published shift is running or the employee has clocked in.
Token scope read
Permission
locations.manage or locations.staff
MCP tool locations_staff_list · read-only
Path parameters
id
integer
Required
Location id.
Responses
Status Description
200 OK
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Token lacks locations.manage / locations.staff
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/locations/42/staff' \
-H 'Authorization: Bearer $JECHECK_TOKEN'
const res = await fetch('https://app.jecheck.io/api/ext/v1/locations/42/staff', {
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/locations/42/staff",
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', 'locations/42/staff', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "locations_staff_list",
"arguments": {
"id": 42
}
}
}
{
"data": [
{
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"kind": "home",
"is_manager": false,
"position": {
"id": 5,
"name": "Barista"
},
"on_shift_now": true
}
]
}
POST Attach or detach employees
POST /locations/{id}/staff
kind: home makes the location the primary one for these employees (their previous primary location becomes additional); kind: extra adds it as an additional location; kind: null removes them from the location (the manager flag is kept). Returns the updated staff list.
Token scope write
Permission
locations.staff
MCP tool locations_staff_set
Path parameters
id
integer
Required
Location id.
Request body
user_ids
array<integer>
Required
Employee ids.
Items 1–200.
kind
string | null
Required
home, extra or null to detach.
homeextra
Responses
Status Description
200 OK
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Token lacks locations.staff, 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/locations/42/staff' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"user_ids": [
12,
14
],
"kind": "home"
}'
const res = await fetch('https://app.jecheck.io/api/ext/v1/locations/42/staff', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"user_ids": [
12,
14
],
"kind": "home"
}),
});
const { data } = await res.json();
import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/locations/42/staff",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"user_ids":[12,14],"kind":"home"},
)
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', 'locations/42/staff', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'user_ids' => [
12,
14,
],
'kind' => 'home',
],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "locations_staff_set",
"arguments": {
"id": 42,
"user_ids": [
12,
14
],
"kind": "home"
}
}
}
{
"data": [
{
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"kind": "home",
"is_manager": false,
"position": {
"id": 5,
"name": "Barista"
},
"on_shift_now": false
}
]
}
PUT Set location managers
PUT /locations/{id}/managers
Replaces the list of managers of the location. Managers get the permissions of the system role "Location manager" for this location. The change is written to the access log.
Token scope write
Permission
locations.staff
MCP tool locations_managers_set
Path parameters
id
integer
Required
Location id.
Request body
user_ids
array<integer>
Required
Employee ids; empty array removes all managers.
Maximum items 50.
Responses
Status Description
200 OK
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Token lacks locations.staff, 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/locations/42/managers' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"user_ids": [
12,
14
]
}'
const res = await fetch('https://app.jecheck.io/api/ext/v1/locations/42/managers', {
method: 'PUT',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"user_ids": [
12,
14
]
}),
});
const { data } = await res.json();
import os, requests
res = requests.put(
"https://app.jecheck.io/api/ext/v1/locations/42/managers",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"user_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', 'locations/42/managers', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'user_ids' => [
12,
14,
],
],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "locations_managers_set",
"arguments": {
"id": 42,
"user_ids": [
12,
14
]
}
}
}
{
"data": {
"id": 12,
"name": "Abay Ave",
"address": "Almaty, Abay Ave 52",
"email": "[email protected] ",
"timezone": "Asia/Almaty",
"timezone_inherited": true,
"region": {
"id": 3,
"name": "Almaty"
},
"managers": [
{
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
}
],
"created_at": "2024-03-02T09:15:00+05:00",
"url": "https://app.jecheck.io/ui/locations",
"region_managers": [
{
"id": 98,
"uuid": "0b1c2d3e-4f5a-4b6c-8d7e-9f0a1b2c3d4e",
"name": "Asel Nurlanova"
}
],
"teams": [
{
"id": 4,
"name": "Maintenance"
}
],
"staff_count": 14,
"on_shift_now": [
{
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
}
]
}
}
PUT Allow an employee to work at any location
PUT /locations/people/{user_id}/anywhere
"Can work at all locations": the employee may be scheduled and audit at any location without being attached to it. It does not widen what data the employee sees. Written to the access log.
Token scope write
Permission
locations.staff
MCP tool locations_anywhere_set
Path parameters
user_id
integer
Required
Employee id.
Request body
anywhere
boolean
Required
Responses
Status Description
200 OK
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Token lacks locations.staff, 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/locations/people/42/anywhere' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"anywhere": true
}'
const res = await fetch('https://app.jecheck.io/api/ext/v1/locations/people/42/anywhere', {
method: 'PUT',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"anywhere": true
}),
});
const { data } = await res.json();
import os, requests
res = requests.put(
"https://app.jecheck.io/api/ext/v1/locations/people/42/anywhere",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"anywhere":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', 'locations/people/42/anywhere', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'anywhere' => true,
],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "locations_anywhere_set",
"arguments": {
"user_id": 42,
"anywhere": true
}
}
}
{
"data": {
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"anywhere": true
}
}
GET List regions
GET /locations/regions
Regions (groups of locations) with their managers. locations lists only the locations visible to the token.
Token scope read
Permission
Any employee; results follow the token's visibility
MCP tool locations_regions_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
Request
cURL
Node.js
Python
PHP
MCP
Copy
curl 'https://app.jecheck.io/api/ext/v1/locations/regions' \
-H 'Authorization: Bearer $JECHECK_TOKEN'
const res = await fetch('https://app.jecheck.io/api/ext/v1/locations/regions', {
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/locations/regions",
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', 'locations/regions', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "locations_regions_list",
"arguments": {}
}
}
{
"data": [
{
"id": 3,
"name": "Almaty",
"color": "#2f6fed",
"managers": [
{
"id": 98,
"uuid": "0b1c2d3e-4f5a-4b6c-8d7e-9f0a1b2c3d4e",
"name": "Asel Nurlanova"
}
],
"locations": [
{
"id": 12,
"name": "Abay Ave"
},
{
"id": 14,
"name": "Dostyk Plaza"
}
]
}
]
}
POST Create a region
POST /locations/regions
Creates a region. Setting manager_ids additionally requires locations.staff.
Token scope write
Permission
locations.manage
MCP tool locations_regions_create
Request body
name
string
Required
Region name.
Length 1–120.
color
string | null
Color, hex like #2f6fed.
Maximum length 9.
location_ids
array<integer>
Locations of the region.
Maximum items 1000.
manager_ids
array<integer>
Region managers (user ids); requires locations.staff.
Maximum items 50.
Responses
Status Description
201 Created
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Token lacks locations.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/locations/regions' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"name": "Replace the broken fridge seal",
"color": "string",
"location_ids": [
12,
14
],
"manager_ids": [
12,
14
]
}'
const res = await fetch('https://app.jecheck.io/api/ext/v1/locations/regions', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Replace the broken fridge seal",
"color": "string",
"location_ids": [
12,
14
],
"manager_ids": [
12,
14
]
}),
});
const { data } = await res.json();
import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/locations/regions",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"name":"Replace the broken fridge seal","color":"string","location_ids":[12,14],"manager_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('POST', 'locations/regions', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'name' => 'Replace the broken fridge seal',
'color' => 'string',
'location_ids' => [
12,
14,
],
'manager_ids' => [
12,
14,
],
],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "locations_regions_create",
"arguments": {
"name": "Replace the broken fridge seal",
"color": "string",
"location_ids": [
12,
14
],
"manager_ids": [
12,
14
]
}
}
}
{
"data": {
"id": 3,
"name": "Almaty",
"color": "#2f6fed",
"managers": [
{
"id": 98,
"uuid": "0b1c2d3e-4f5a-4b6c-8d7e-9f0a1b2c3d4e",
"name": "Asel Nurlanova"
}
],
"locations": [
{
"id": 12,
"name": "Abay Ave"
},
{
"id": 14,
"name": "Dostyk Plaza"
}
]
}
}
PATCH Update a region
PATCH /locations/regions/{id}
Partial update. location_ids replaces the set of locations in the region; manager_ids replaces its managers (requires locations.staff).
Token scope write
Permission
locations.manage
MCP tool locations_regions_update
Path parameters
id
integer
Required
Region id.
Request body
name
string
Region name.
Length 1–120.
color
string | null
Color, hex like #2f6fed.
Maximum length 9.
location_ids
array<integer>
Locations of the region.
Maximum items 1000.
manager_ids
array<integer>
Region managers (user ids); requires locations.staff.
Maximum items 50.
Responses
Status Description
200 OK
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Token lacks locations.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/locations/regions/42' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"name": "Replace the broken fridge seal",
"color": "string",
"location_ids": [
12,
14
],
"manager_ids": [
12,
14
]
}'
const res = await fetch('https://app.jecheck.io/api/ext/v1/locations/regions/42', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Replace the broken fridge seal",
"color": "string",
"location_ids": [
12,
14
],
"manager_ids": [
12,
14
]
}),
});
const { data } = await res.json();
import os, requests
res = requests.patch(
"https://app.jecheck.io/api/ext/v1/locations/regions/42",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"name":"Replace the broken fridge seal","color":"string","location_ids":[12,14],"manager_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('PATCH', 'locations/regions/42', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'name' => 'Replace the broken fridge seal',
'color' => 'string',
'location_ids' => [
12,
14,
],
'manager_ids' => [
12,
14,
],
],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "locations_regions_update",
"arguments": {
"id": 42,
"name": "Replace the broken fridge seal",
"color": "string",
"location_ids": [
12,
14
],
"manager_ids": [
12,
14
]
}
}
}
{
"data": {
"id": 3,
"name": "Almaty",
"color": "#2f6fed",
"managers": [
{
"id": 98,
"uuid": "0b1c2d3e-4f5a-4b6c-8d7e-9f0a1b2c3d4e",
"name": "Asel Nurlanova"
}
],
"locations": [
{
"id": 12,
"name": "Abay Ave"
},
{
"id": 14,
"name": "Dostyk Plaza"
}
]
}
}
DEL Delete a region
DELETE /locations/regions/{id}
Deletes the region; its locations stay without a region.
Token scope write
Permission
locations.manage
MCP tool locations_regions_delete · destructive
Path parameters
id
integer
Required
Region id.
Responses
Status Description
200 OK
401 unauthorized — Missing, invalid, revoked or expired token
403 forbidden · insufficient_scope · plan_required — Token lacks locations.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/locations/regions/42' \
-H 'Authorization: Bearer $JECHECK_TOKEN'
const res = await fetch('https://app.jecheck.io/api/ext/v1/locations/regions/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/locations/regions/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', 'locations/regions/42', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "locations_regions_delete",
"arguments": {
"id": 42
}
}
}
{
"data": {
"deleted": true
}
}