jeCheckDevelopers
Get an API key

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

StatusDescription
200OK — a page of results with meta
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/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
        }
    }
}
Response 200
{
  "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
  }
}

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

Path parameters

id integer Required
Location 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/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
        }
    }
}
Response 200
{
  "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"
      }
    ]
  }
}

POSTCreate 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 scopewrite
Permission locations.manage
MCP toollocations_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

StatusDescription
201Created
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Token lacks locations.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/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
        }
    }
}
Response 201
{
  "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"
      }
    ]
  }
}

PATCHUpdate a location

PATCH /locations/{id}

Partial update: send only the fields to change.

Token scopewrite
Permission locations.manage
MCP toollocations_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

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Token lacks locations.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/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
        }
    }
}
Response 200
{
  "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"
      }
    ]
  }
}

DELDelete a location

DELETE /locations/{id}

Marks the location as deleted. Its history (audits, tasks) stays; it disappears from lists and filters.

Token scopewrite
Permission locations.manage
MCP toollocations_delete · destructive

Path parameters

id integer Required
Location id.

Responses

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Token lacks locations.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/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
        }
    }
}
Response 200
{
  "data": {
    "deleted": true
  }
}

GETList 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 scoperead
Permission locations.manage or locations.staff
MCP toollocations_staff_list · read-only

Path parameters

id integer Required
Location id.

Responses

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Token lacks locations.manage / locations.staff
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/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
        }
    }
}
Response 200
{
  "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
    }
  ]
}

POSTAttach 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 scopewrite
Permission locations.staff
MCP toollocations_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

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Token lacks locations.staff, 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/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"
        }
    }
}
Response 200
{
  "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
    }
  ]
}

PUTSet 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 scopewrite
Permission locations.staff
MCP toollocations_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

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Token lacks locations.staff, 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/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
            ]
        }
    }
}
Response 200
{
  "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"
      }
    ]
  }
}

PUTAllow 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 scopewrite
Permission locations.staff
MCP toollocations_anywhere_set

Path parameters

user_id integer Required
Employee id.

Request body

anywhere boolean Required

Responses

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Token lacks locations.staff, 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/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
        }
    }
}
Response 200
{
  "data": {
    "user": {
      "id": 311,
      "uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
      "name": "Aigerim Sadykova"
    },
    "anywhere": true
  }
}

GETList regions

GET /locations/regions

Regions (groups of locations) with their managers. locations lists only the locations visible to the token.

Token scoperead
Permission Any employee; results follow the token's visibility
MCP toollocations_regions_list · 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/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": {}
    }
}
Response 200
{
  "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"
        }
      ]
    }
  ]
}

POSTCreate a region

POST /locations/regions

Creates a region. Setting manager_ids additionally requires locations.staff.

Token scopewrite
Permission locations.manage
MCP toollocations_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

StatusDescription
201Created
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Token lacks locations.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/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
            ]
        }
    }
}
Response 201
{
  "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"
      }
    ]
  }
}

PATCHUpdate 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 scopewrite
Permission locations.manage
MCP toollocations_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

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Token lacks locations.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/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
            ]
        }
    }
}
Response 200
{
  "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"
      }
    ]
  }
}

DELDelete a region

DELETE /locations/regions/{id}

Deletes the region; its locations stay without a region.

Token scopewrite
Permission locations.manage
MCP toollocations_regions_delete · destructive

Path parameters

id integer Required
Region id.

Responses

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Token lacks locations.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/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
        }
    }
}
Response 200
{
  "data": {
    "deleted": true
  }
}