HR
Employee HR records: the HR card, personal data, HR documents, hiring with onboarding checklists, transfers, dismissal and absences (vacations, sick leave). Permissions apply to the employee's locations; personal data, documents and pay rates are returned only with their own permissions and every view is written to the access log.
GETRetrieve an employee HR card
Work data, HR history, vacation balance, absences, documents and onboarding / offboarding checklists of an employee. Sections the token has no permission for are empty or null on the employee's locations: HR data — hr.card, personal data — hr.personal, documents — hr.documents, pay — pay.rates.view, contacts — users.contacts. Each view of sensitive data is written to the access log.
| Token scope | read |
|---|---|
| Permission |
users.view |
| MCP tool | hr_employees_get · read-only |
Path parameters
uuid
uuid
Required Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks users.view
|
| 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
|
curl 'https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b', {
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/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
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', 'hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_employees_get",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
}
}{
"data": {
"employee": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim",
"lastname": "Sadykova",
"email": "[email protected]",
"phone": "+7 701 111 22 33",
"is_admin": false,
"deleted": false,
"deleted_at": null,
"web_access": false,
"position": {
"id": 7,
"name": "Barista"
},
"locations": [
{
"id": 12,
"name": "Abay Ave",
"kind": "home"
}
],
"home_location_id": 12,
"work_anywhere": false,
"teams": [
{
"id": 3,
"name": "Bar",
"is_head": false
}
],
"created_at": "2026-03-01T09:00:00+05:00",
"last_seen_at": "2026-11-03T08:12:00+05:00",
"url": "https://app.jecheck.io/ui/users/1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b"
},
"status": {
"status": "probation",
"until": "2026-12-01",
"absence_type": null,
"hired_at": "2026-09-01",
"fired_at": null,
"personnel_no": "0114",
"onboarding": {
"uuid": "4d5e6f70-8192-4a3b-8c4d-5e6f708192a3",
"kind": "onboarding",
"done": 3,
"total": 9,
"overdue": 1
}
},
"profile": {
"middle_name": "Nurlanovna",
"gender": "female",
"birth_date": "1998-04-12",
"birth_place": null,
"citizenship": null,
"marital_status": null,
"children": null,
"work_phone": null,
"personal_phone": "+7 701 000 00 00",
"personal_email": null,
"address_actual": null,
"address_registered": null,
"tax_id": null,
"insurance_no": null,
"id_doc_type": null,
"id_doc_number": null,
"id_doc_issuer": null,
"id_doc_issued_at": null,
"id_doc_expires_at": null,
"emergency_name": null,
"emergency_relation": null,
"emergency_phone": null,
"bank_name": null,
"bank_account": null,
"education": null,
"languages": null,
"clothing_size": null,
"shoe_size": null,
"note": null,
"custom": {}
},
"work": {
"hired_at": "2026-09-01",
"fired_at": null,
"personnel_no": "0114",
"employment": "full",
"probation_until": "2026-12-01",
"contract_type": "permanent",
"contract_number": "TD-2026/114",
"contract_date": "2026-09-01",
"contract_until": null,
"vacation_days": null,
"vacation_adjust": 0,
"manager": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"team_managers": [],
"reports": []
},
"pay": {
"pay_type": "hourly",
"rate": 1500,
"kpi_bonus": null,
"kpi_bonus_type": "fixed",
"currency": "KZT",
"history": [
{
"from": "2026-09-01",
"pay_type": "hourly",
"rate": 1500
}
]
},
"vacation": {
"per_year": 24,
"accrued": 4.1,
"adjust": 0,
"used": 0,
"planned": 0,
"pending": 0,
"balance": 4.1,
"available": 4.1
},
"absences": [
{
"uuid": "2b3c4d5e-6f70-4a81-92b3-c4d5e6f7a8b9",
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"type": "vacation",
"date_from": "2026-12-01",
"date_to": "2026-12-14",
"days": 14,
"status": "approved",
"paid": true,
"comment": null,
"decision_note": null,
"decided_by": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"decided_at": "2026-11-03T10:00:00+05:00",
"has_file": false,
"created_at": "2026-11-03T09:55:00+05:00"
}
],
"events": [
{
"id": 501,
"type": "hire",
"date": "2026-09-01",
"data": {
"position": "Barista"
},
"comment": null,
"created_by": "Daniyar Omarov",
"created_at": "2026-08-28T10:00:00+05:00"
}
],
"documents": [
{
"id": 88,
"type": "contract",
"title": "Employment contract",
"number": "TD-2026/114",
"issued_at": "2026-03-01",
"expires_at": null,
"note": null,
"source": "hr",
"file": {
"name": "contract.pdf",
"download_url": "https://app.jecheck.io/api/ext/v1/hr/employees/1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b/documents/88/file"
}
}
],
"checklists": [
{
"uuid": "4d5e6f70-8192-4a3b-8c4d-5e6f708192a3",
"kind": "onboarding",
"title": "Onboarding: Aigerim Sadykova",
"start_date": "2026-11-04",
"status": "active",
"employee": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"sections": [
{
"key": "s1",
"title": "Before the first day"
}
],
"progress": {
"done": 3,
"total": 9,
"overdue": 1
},
"items": [
{
"id": 7001,
"section_key": "s1",
"title": "Prepare a uniform",
"description": null,
"assignee": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"due_date": "2026-11-03",
"overdue": true,
"status": "open",
"requires": "none",
"required": true,
"comment": null,
"has_file": false,
"done_by": null,
"done_at": null,
"task_uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
],
"created_at": "2026-10-30T12:00:00+05:00",
"completed_at": null
}
],
"can": {
"contacts": true,
"edit": true,
"card": true,
"personal": true,
"documents": true,
"hire": true,
"absences": true,
"pay_view": true,
"pay_edit": false
}
}
}PATCHUpdate personal data
Partial update of the employee profile. Name and other fields require users.edit, phone — users.contacts, personal data (documents, addresses, tax id, bank, emergency contact, family, custom fields) — hr.personal, all on the employee's locations.
| Token scope | write |
|---|---|
| Permission |
users.view |
| MCP tool | hr_employees_profile_update |
Path parameters
uuid
uuid
Required Request body
name
string
users.edit).
Length 2–255.
lastname
string
users.edit).
Length 2–512.
phone
string | null
users.contacts).
Maximum length 64. middle_name
string | null
work_phone
string | null
education
string | null
languages
string | null
clothing_size
string | null
shoe_size
string | null
note
string | null
gender
string | null
hr.personal).
malefemalebirth_date
date | null
hr.personal).
birth_place
string | null
citizenship
string | null
marital_status
string | null
singlemarrieddivorcedwidowedchildren
integer | null
personal_phone
string | null
personal_email
string | null
address_actual
string | null
address_registered
string | null
tax_id
string | null
insurance_no
string | null
id_doc_type
string | null
id_cardpassportforeignresidenceid_doc_number
string | null
id_doc_issuer
string | null
id_doc_issued_at
date | null
id_doc_expires_at
date | null
emergency_name
string | null
emergency_relation
string | null
emergency_phone
string | null
bank_name
string | null
bank_account
string | null
custom
object | null
hr.settings.get).
Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks users.view, 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
|
curl -X PATCH 'https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/profile' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"name": "Replace the broken fridge seal",
"lastname": "string",
"phone": "+77010000000",
"middle_name": "string"
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/profile', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Replace the broken fridge seal",
"lastname": "string",
"phone": "+77010000000",
"middle_name": "string"
}),
});
const { data } = await res.json();import os, requests
res = requests.patch(
"https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/profile",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"name":"Replace the broken fridge seal","lastname":"string","phone":"+77010000000","middle_name":"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', 'hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/profile', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'name' => 'Replace the broken fridge seal',
'lastname' => 'string',
'phone' => '+77010000000',
'middle_name' => 'string',
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_employees_profile_update",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"name": "Replace the broken fridge seal",
"lastname": "string",
"phone": "+77010000000",
"middle_name": "string"
}
}
}{
"data": {
"employee": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim",
"lastname": "Sadykova",
"email": "[email protected]",
"phone": "+7 701 111 22 33",
"is_admin": false,
"deleted": false,
"deleted_at": null,
"web_access": false,
"position": {
"id": 7,
"name": "Barista"
},
"locations": [
{
"id": 12,
"name": "Abay Ave",
"kind": "home"
}
],
"home_location_id": 12,
"work_anywhere": false,
"teams": [
{
"id": 3,
"name": "Bar",
"is_head": false
}
],
"created_at": "2026-03-01T09:00:00+05:00",
"last_seen_at": "2026-11-03T08:12:00+05:00",
"url": "https://app.jecheck.io/ui/users/1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b"
},
"status": {
"status": "probation",
"until": "2026-12-01",
"absence_type": null,
"hired_at": "2026-09-01",
"fired_at": null,
"personnel_no": "0114",
"onboarding": {
"uuid": "4d5e6f70-8192-4a3b-8c4d-5e6f708192a3",
"kind": "onboarding",
"done": 3,
"total": 9,
"overdue": 1
}
},
"profile": {
"middle_name": "Nurlanovna",
"gender": "female",
"birth_date": "1998-04-12",
"birth_place": null,
"citizenship": null,
"marital_status": null,
"children": null,
"work_phone": null,
"personal_phone": "+7 701 000 00 00",
"personal_email": null,
"address_actual": null,
"address_registered": null,
"tax_id": null,
"insurance_no": null,
"id_doc_type": null,
"id_doc_number": null,
"id_doc_issuer": null,
"id_doc_issued_at": null,
"id_doc_expires_at": null,
"emergency_name": null,
"emergency_relation": null,
"emergency_phone": null,
"bank_name": null,
"bank_account": null,
"education": null,
"languages": null,
"clothing_size": null,
"shoe_size": null,
"note": null,
"custom": {}
},
"work": {
"hired_at": "2026-09-01",
"fired_at": null,
"personnel_no": "0114",
"employment": "full",
"probation_until": "2026-12-01",
"contract_type": "permanent",
"contract_number": "TD-2026/114",
"contract_date": "2026-09-01",
"contract_until": null,
"vacation_days": null,
"vacation_adjust": 0,
"manager": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"team_managers": [],
"reports": []
},
"pay": {
"pay_type": "hourly",
"rate": 1500,
"kpi_bonus": null,
"kpi_bonus_type": "fixed",
"currency": "KZT",
"history": [
{
"from": "2026-09-01",
"pay_type": "hourly",
"rate": 1500
}
]
},
"vacation": {
"per_year": 24,
"accrued": 4.1,
"adjust": 0,
"used": 0,
"planned": 0,
"pending": 0,
"balance": 4.1,
"available": 4.1
},
"absences": [
{
"uuid": "2b3c4d5e-6f70-4a81-92b3-c4d5e6f7a8b9",
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"type": "vacation",
"date_from": "2026-12-01",
"date_to": "2026-12-14",
"days": 14,
"status": "approved",
"paid": true,
"comment": null,
"decision_note": null,
"decided_by": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"decided_at": "2026-11-03T10:00:00+05:00",
"has_file": false,
"created_at": "2026-11-03T09:55:00+05:00"
}
],
"events": [
{
"id": 501,
"type": "hire",
"date": "2026-09-01",
"data": {
"position": "Barista"
},
"comment": null,
"created_by": "Daniyar Omarov",
"created_at": "2026-08-28T10:00:00+05:00"
}
],
"documents": [
{
"id": 88,
"type": "contract",
"title": "Employment contract",
"number": "TD-2026/114",
"issued_at": "2026-03-01",
"expires_at": null,
"note": null,
"source": "hr",
"file": {
"name": "contract.pdf",
"download_url": "https://app.jecheck.io/api/ext/v1/hr/employees/1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b/documents/88/file"
}
}
],
"checklists": [
{
"uuid": "4d5e6f70-8192-4a3b-8c4d-5e6f708192a3",
"kind": "onboarding",
"title": "Onboarding: Aigerim Sadykova",
"start_date": "2026-11-04",
"status": "active",
"employee": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"sections": [
{
"key": "s1",
"title": "Before the first day"
}
],
"progress": {
"done": 3,
"total": 9,
"overdue": 1
},
"items": [
{
"id": 7001,
"section_key": "s1",
"title": "Prepare a uniform",
"description": null,
"assignee": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"due_date": "2026-11-03",
"overdue": true,
"status": "open",
"requires": "none",
"required": true,
"comment": null,
"has_file": false,
"done_by": null,
"done_at": null,
"task_uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
],
"created_at": "2026-10-30T12:00:00+05:00",
"completed_at": null
}
],
"can": {
"contacts": true,
"edit": true,
"card": true,
"personal": true,
"documents": true,
"hire": true,
"absences": true,
"pay_view": true,
"pay_edit": false
}
}
}PATCHUpdate work data
Hire date, personnel number, employment type, probation, manager, contract, vacation entitlement (hr.hire) and pay (pay.rates.edit; a new rate with rate_from goes to the rate history used by payroll).
| Token scope | write |
|---|---|
| Permission |
hr.hire or pay.rates.edit |
| MCP tool | hr_employees_work_update |
Path parameters
uuid
uuid
Required Request body
hired_at
date | null
personnel_no
string | null
employment
string | null
fullpartcontractinternprobation_until
date | null
manager_id
integer | null
contract_type
string | null
permanentfixedcivilselfcontract_number
string | null
contract_date
date | null
contract_until
date | null
vacation_days
integer | null
vacation_adjust
number | null
pay_type
string
hourlysalaryshiftrate
number | null
rate_from
date | null
kpi_bonus
number | null
kpi_bonus_type
string
fixedpercentResponses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.hire / pay.rates.edit, 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
|
curl -X PATCH 'https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/work' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"hired_at": "2026-11-01",
"personnel_no": "string",
"employment": "full",
"probation_until": "2026-11-01"
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/work', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"hired_at": "2026-11-01",
"personnel_no": "string",
"employment": "full",
"probation_until": "2026-11-01"
}),
});
const { data } = await res.json();import os, requests
res = requests.patch(
"https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/work",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"hired_at":"2026-11-01","personnel_no":"string","employment":"full","probation_until":"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('PATCH', 'hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/work', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'hired_at' => '2026-11-01',
'personnel_no' => 'string',
'employment' => 'full',
'probation_until' => '2026-11-01',
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_employees_work_update",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"hired_at": "2026-11-01",
"personnel_no": "string",
"employment": "full",
"probation_until": "2026-11-01"
}
}
}{
"data": {
"employee": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim",
"lastname": "Sadykova",
"email": "[email protected]",
"phone": "+7 701 111 22 33",
"is_admin": false,
"deleted": false,
"deleted_at": null,
"web_access": false,
"position": {
"id": 7,
"name": "Barista"
},
"locations": [
{
"id": 12,
"name": "Abay Ave",
"kind": "home"
}
],
"home_location_id": 12,
"work_anywhere": false,
"teams": [
{
"id": 3,
"name": "Bar",
"is_head": false
}
],
"created_at": "2026-03-01T09:00:00+05:00",
"last_seen_at": "2026-11-03T08:12:00+05:00",
"url": "https://app.jecheck.io/ui/users/1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b"
},
"status": {
"status": "probation",
"until": "2026-12-01",
"absence_type": null,
"hired_at": "2026-09-01",
"fired_at": null,
"personnel_no": "0114",
"onboarding": {
"uuid": "4d5e6f70-8192-4a3b-8c4d-5e6f708192a3",
"kind": "onboarding",
"done": 3,
"total": 9,
"overdue": 1
}
},
"profile": {
"middle_name": "Nurlanovna",
"gender": "female",
"birth_date": "1998-04-12",
"birth_place": null,
"citizenship": null,
"marital_status": null,
"children": null,
"work_phone": null,
"personal_phone": "+7 701 000 00 00",
"personal_email": null,
"address_actual": null,
"address_registered": null,
"tax_id": null,
"insurance_no": null,
"id_doc_type": null,
"id_doc_number": null,
"id_doc_issuer": null,
"id_doc_issued_at": null,
"id_doc_expires_at": null,
"emergency_name": null,
"emergency_relation": null,
"emergency_phone": null,
"bank_name": null,
"bank_account": null,
"education": null,
"languages": null,
"clothing_size": null,
"shoe_size": null,
"note": null,
"custom": {}
},
"work": {
"hired_at": "2026-09-01",
"fired_at": null,
"personnel_no": "0114",
"employment": "full",
"probation_until": "2026-12-01",
"contract_type": "permanent",
"contract_number": "TD-2026/114",
"contract_date": "2026-09-01",
"contract_until": null,
"vacation_days": null,
"vacation_adjust": 0,
"manager": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"team_managers": [],
"reports": []
},
"pay": {
"pay_type": "hourly",
"rate": 1500,
"kpi_bonus": null,
"kpi_bonus_type": "fixed",
"currency": "KZT",
"history": [
{
"from": "2026-09-01",
"pay_type": "hourly",
"rate": 1500
}
]
},
"vacation": {
"per_year": 24,
"accrued": 4.1,
"adjust": 0,
"used": 0,
"planned": 0,
"pending": 0,
"balance": 4.1,
"available": 4.1
},
"absences": [
{
"uuid": "2b3c4d5e-6f70-4a81-92b3-c4d5e6f7a8b9",
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"type": "vacation",
"date_from": "2026-12-01",
"date_to": "2026-12-14",
"days": 14,
"status": "approved",
"paid": true,
"comment": null,
"decision_note": null,
"decided_by": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"decided_at": "2026-11-03T10:00:00+05:00",
"has_file": false,
"created_at": "2026-11-03T09:55:00+05:00"
}
],
"events": [
{
"id": 501,
"type": "hire",
"date": "2026-09-01",
"data": {
"position": "Barista"
},
"comment": null,
"created_by": "Daniyar Omarov",
"created_at": "2026-08-28T10:00:00+05:00"
}
],
"documents": [
{
"id": 88,
"type": "contract",
"title": "Employment contract",
"number": "TD-2026/114",
"issued_at": "2026-03-01",
"expires_at": null,
"note": null,
"source": "hr",
"file": {
"name": "contract.pdf",
"download_url": "https://app.jecheck.io/api/ext/v1/hr/employees/1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b/documents/88/file"
}
}
],
"checklists": [
{
"uuid": "4d5e6f70-8192-4a3b-8c4d-5e6f708192a3",
"kind": "onboarding",
"title": "Onboarding: Aigerim Sadykova",
"start_date": "2026-11-04",
"status": "active",
"employee": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"sections": [
{
"key": "s1",
"title": "Before the first day"
}
],
"progress": {
"done": 3,
"total": 9,
"overdue": 1
},
"items": [
{
"id": 7001,
"section_key": "s1",
"title": "Prepare a uniform",
"description": null,
"assignee": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"due_date": "2026-11-03",
"overdue": true,
"status": "open",
"requires": "none",
"required": true,
"comment": null,
"has_file": false,
"done_by": null,
"done_at": null,
"task_uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
],
"created_at": "2026-10-30T12:00:00+05:00",
"completed_at": null
}
],
"can": {
"contacts": true,
"edit": true,
"card": true,
"personal": true,
"documents": true,
"hire": true,
"absences": true,
"pay_view": true,
"pay_edit": false
}
}
}POSTHire an employee
Creates the employee account (or hires an existing user by uuid), sets position, locations, manager and work data, and starts an onboarding checklist (template_id; default — the template for the position, 0 — none). Requires hr.hire and, for a new account, users.create; with a location-scoped hr.hire only your locations can be chosen.
| Token scope | write |
|---|---|
| Permission |
hr.hire |
| MCP tool | hr_hire |
Request body
uuid
uuid
name
string
lastname
string
email
string
phone
string | null
middle_name
string | null
gender
string | null
malefemalebirth_date
date | null
personal_phone
string | null
position_id
integer | null
home_location_id
integer | null
location_ids
array<integer>
work_anywhere
boolean
hr.hire for all locations).
team_id
integer | null
manager_id
integer | null
hired_at
date
Required probation_until
date | null
employment
string | null
fullpartcontractinternpersonnel_no
string | null
contract_type
string | null
permanentfixedcivilselfcontract_number
string | null
contract_until
date | null
web_access
boolean
users.access).
role_ids
array<integer>
invite
string
now).
nowstartnonetemplate_id
integer | null
comment
string | null
Responses
| Status | Description |
|---|---|
| 201 | Created |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.hire, is read-only
|
| 422 | validation_failed — Invalid parameters — see error.fields
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/hr/hire' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"name": "Replace the broken fridge seal",
"lastname": "string",
"email": "[email protected]",
"hired_at": "2026-11-01"
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/hire', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"name": "Replace the broken fridge seal",
"lastname": "string",
"email": "[email protected]",
"hired_at": "2026-11-01"
}),
});
const { data } = await res.json();import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/hr/hire",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"uuid":"3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b","name":"Replace the broken fridge seal","lastname":"string","email":"[email protected]","hired_at":"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('POST', 'hr/hire', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'uuid' => '3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b',
'name' => 'Replace the broken fridge seal',
'lastname' => 'string',
'email' => '[email protected]',
'hired_at' => '2026-11-01',
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_hire",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"name": "Replace the broken fridge seal",
"lastname": "string",
"email": "[email protected]",
"hired_at": "2026-11-01"
}
}
}{
"data": {
"employee": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim",
"lastname": "Sadykova",
"email": "[email protected]",
"phone": "+7 701 111 22 33",
"is_admin": false,
"deleted": false,
"deleted_at": null,
"web_access": false,
"position": {
"id": 7,
"name": "Barista"
},
"locations": [
{
"id": 12,
"name": "Abay Ave",
"kind": "home"
}
],
"home_location_id": 12,
"work_anywhere": false,
"teams": [
{
"id": 3,
"name": "Bar",
"is_head": false
}
],
"created_at": "2026-03-01T09:00:00+05:00",
"last_seen_at": "2026-11-03T08:12:00+05:00",
"url": "https://app.jecheck.io/ui/users/1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b"
},
"status": {
"status": "probation",
"until": "2026-12-01",
"absence_type": null,
"hired_at": "2026-09-01",
"fired_at": null,
"personnel_no": "0114",
"onboarding": {
"uuid": "4d5e6f70-8192-4a3b-8c4d-5e6f708192a3",
"kind": "onboarding",
"done": 3,
"total": 9,
"overdue": 1
}
},
"profile": {
"middle_name": "Nurlanovna",
"gender": "female",
"birth_date": "1998-04-12",
"birth_place": null,
"citizenship": null,
"marital_status": null,
"children": null,
"work_phone": null,
"personal_phone": "+7 701 000 00 00",
"personal_email": null,
"address_actual": null,
"address_registered": null,
"tax_id": null,
"insurance_no": null,
"id_doc_type": null,
"id_doc_number": null,
"id_doc_issuer": null,
"id_doc_issued_at": null,
"id_doc_expires_at": null,
"emergency_name": null,
"emergency_relation": null,
"emergency_phone": null,
"bank_name": null,
"bank_account": null,
"education": null,
"languages": null,
"clothing_size": null,
"shoe_size": null,
"note": null,
"custom": {}
},
"work": {
"hired_at": "2026-09-01",
"fired_at": null,
"personnel_no": "0114",
"employment": "full",
"probation_until": "2026-12-01",
"contract_type": "permanent",
"contract_number": "TD-2026/114",
"contract_date": "2026-09-01",
"contract_until": null,
"vacation_days": null,
"vacation_adjust": 0,
"manager": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"team_managers": [],
"reports": []
},
"pay": {
"pay_type": "hourly",
"rate": 1500,
"kpi_bonus": null,
"kpi_bonus_type": "fixed",
"currency": "KZT",
"history": [
{
"from": "2026-09-01",
"pay_type": "hourly",
"rate": 1500
}
]
},
"vacation": {
"per_year": 24,
"accrued": 4.1,
"adjust": 0,
"used": 0,
"planned": 0,
"pending": 0,
"balance": 4.1,
"available": 4.1
},
"absences": [
{
"uuid": "2b3c4d5e-6f70-4a81-92b3-c4d5e6f7a8b9",
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"type": "vacation",
"date_from": "2026-12-01",
"date_to": "2026-12-14",
"days": 14,
"status": "approved",
"paid": true,
"comment": null,
"decision_note": null,
"decided_by": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"decided_at": "2026-11-03T10:00:00+05:00",
"has_file": false,
"created_at": "2026-11-03T09:55:00+05:00"
}
],
"events": [
{
"id": 501,
"type": "hire",
"date": "2026-09-01",
"data": {
"position": "Barista"
},
"comment": null,
"created_by": "Daniyar Omarov",
"created_at": "2026-08-28T10:00:00+05:00"
}
],
"documents": [
{
"id": 88,
"type": "contract",
"title": "Employment contract",
"number": "TD-2026/114",
"issued_at": "2026-03-01",
"expires_at": null,
"note": null,
"source": "hr",
"file": {
"name": "contract.pdf",
"download_url": "https://app.jecheck.io/api/ext/v1/hr/employees/1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b/documents/88/file"
}
}
],
"checklists": [
{
"uuid": "4d5e6f70-8192-4a3b-8c4d-5e6f708192a3",
"kind": "onboarding",
"title": "Onboarding: Aigerim Sadykova",
"start_date": "2026-11-04",
"status": "active",
"employee": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"sections": [
{
"key": "s1",
"title": "Before the first day"
}
],
"progress": {
"done": 3,
"total": 9,
"overdue": 1
},
"items": [
{
"id": 7001,
"section_key": "s1",
"title": "Prepare a uniform",
"description": null,
"assignee": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"due_date": "2026-11-03",
"overdue": true,
"status": "open",
"requires": "none",
"required": true,
"comment": null,
"has_file": false,
"done_by": null,
"done_at": null,
"task_uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
],
"created_at": "2026-10-30T12:00:00+05:00",
"completed_at": null
}
],
"can": {
"contacts": true,
"edit": true,
"card": true,
"personal": true,
"documents": true,
"hire": true,
"absences": true,
"pay_view": true,
"pay_edit": false
}
}
}POSTTransfer an employee
Changes position, locations or manager; the change is recorded in the HR history with the before/after values.
| Token scope | write |
|---|---|
| Permission |
hr.hire |
| MCP tool | hr_employees_transfer |
Path parameters
uuid
uuid
Required Request body
date
date
Required position_id
integer | null
home_location_id
integer | null
location_ids
array<integer>
work_anywhere
boolean
manager_id
integer | null
comment
string | null
Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.hire, 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
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/transfer' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"date": "2026-11-01",
"position_id": 42,
"home_location_id": 12,
"location_ids": [
12,
14
]
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/transfer', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"date": "2026-11-01",
"position_id": 42,
"home_location_id": 12,
"location_ids": [
12,
14
]
}),
});
const { data } = await res.json();import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/transfer",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"date":"2026-11-01","position_id":42,"home_location_id":12,"location_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', 'hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/transfer', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'date' => '2026-11-01',
'position_id' => 42,
'home_location_id' => 12,
'location_ids' => [
12,
14,
],
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_employees_transfer",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"date": "2026-11-01",
"position_id": 42,
"home_location_id": 12,
"location_ids": [
12,
14
]
}
}
}{
"data": {
"employee": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim",
"lastname": "Sadykova",
"email": "[email protected]",
"phone": "+7 701 111 22 33",
"is_admin": false,
"deleted": false,
"deleted_at": null,
"web_access": false,
"position": {
"id": 7,
"name": "Barista"
},
"locations": [
{
"id": 12,
"name": "Abay Ave",
"kind": "home"
}
],
"home_location_id": 12,
"work_anywhere": false,
"teams": [
{
"id": 3,
"name": "Bar",
"is_head": false
}
],
"created_at": "2026-03-01T09:00:00+05:00",
"last_seen_at": "2026-11-03T08:12:00+05:00",
"url": "https://app.jecheck.io/ui/users/1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b"
},
"status": {
"status": "probation",
"until": "2026-12-01",
"absence_type": null,
"hired_at": "2026-09-01",
"fired_at": null,
"personnel_no": "0114",
"onboarding": {
"uuid": "4d5e6f70-8192-4a3b-8c4d-5e6f708192a3",
"kind": "onboarding",
"done": 3,
"total": 9,
"overdue": 1
}
},
"profile": {
"middle_name": "Nurlanovna",
"gender": "female",
"birth_date": "1998-04-12",
"birth_place": null,
"citizenship": null,
"marital_status": null,
"children": null,
"work_phone": null,
"personal_phone": "+7 701 000 00 00",
"personal_email": null,
"address_actual": null,
"address_registered": null,
"tax_id": null,
"insurance_no": null,
"id_doc_type": null,
"id_doc_number": null,
"id_doc_issuer": null,
"id_doc_issued_at": null,
"id_doc_expires_at": null,
"emergency_name": null,
"emergency_relation": null,
"emergency_phone": null,
"bank_name": null,
"bank_account": null,
"education": null,
"languages": null,
"clothing_size": null,
"shoe_size": null,
"note": null,
"custom": {}
},
"work": {
"hired_at": "2026-09-01",
"fired_at": null,
"personnel_no": "0114",
"employment": "full",
"probation_until": "2026-12-01",
"contract_type": "permanent",
"contract_number": "TD-2026/114",
"contract_date": "2026-09-01",
"contract_until": null,
"vacation_days": null,
"vacation_adjust": 0,
"manager": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"team_managers": [],
"reports": []
},
"pay": {
"pay_type": "hourly",
"rate": 1500,
"kpi_bonus": null,
"kpi_bonus_type": "fixed",
"currency": "KZT",
"history": [
{
"from": "2026-09-01",
"pay_type": "hourly",
"rate": 1500
}
]
},
"vacation": {
"per_year": 24,
"accrued": 4.1,
"adjust": 0,
"used": 0,
"planned": 0,
"pending": 0,
"balance": 4.1,
"available": 4.1
},
"absences": [
{
"uuid": "2b3c4d5e-6f70-4a81-92b3-c4d5e6f7a8b9",
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"type": "vacation",
"date_from": "2026-12-01",
"date_to": "2026-12-14",
"days": 14,
"status": "approved",
"paid": true,
"comment": null,
"decision_note": null,
"decided_by": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"decided_at": "2026-11-03T10:00:00+05:00",
"has_file": false,
"created_at": "2026-11-03T09:55:00+05:00"
}
],
"events": [
{
"id": 501,
"type": "hire",
"date": "2026-09-01",
"data": {
"position": "Barista"
},
"comment": null,
"created_by": "Daniyar Omarov",
"created_at": "2026-08-28T10:00:00+05:00"
}
],
"documents": [
{
"id": 88,
"type": "contract",
"title": "Employment contract",
"number": "TD-2026/114",
"issued_at": "2026-03-01",
"expires_at": null,
"note": null,
"source": "hr",
"file": {
"name": "contract.pdf",
"download_url": "https://app.jecheck.io/api/ext/v1/hr/employees/1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b/documents/88/file"
}
}
],
"checklists": [
{
"uuid": "4d5e6f70-8192-4a3b-8c4d-5e6f708192a3",
"kind": "onboarding",
"title": "Onboarding: Aigerim Sadykova",
"start_date": "2026-11-04",
"status": "active",
"employee": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"sections": [
{
"key": "s1",
"title": "Before the first day"
}
],
"progress": {
"done": 3,
"total": 9,
"overdue": 1
},
"items": [
{
"id": 7001,
"section_key": "s1",
"title": "Prepare a uniform",
"description": null,
"assignee": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"due_date": "2026-11-03",
"overdue": true,
"status": "open",
"requires": "none",
"required": true,
"comment": null,
"has_file": false,
"done_by": null,
"done_at": null,
"task_uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
],
"created_at": "2026-10-30T12:00:00+05:00",
"completed_at": null
}
],
"can": {
"contacts": true,
"edit": true,
"card": true,
"personal": true,
"documents": true,
"hire": true,
"absences": true,
"pay_view": true,
"pay_edit": false
}
}
}POSTDismiss an employee
Registers the dismissal with the last working day and reason, cancels future absences and the active onboarding, starts the offboarding checklist. The account is closed the day after the last day (or now with block_now).
| Token scope | write |
|---|---|
| Permission |
hr.hire |
| MCP tool | hr_employees_dismiss |
Path parameters
uuid
uuid
Required Request body
last_day
date
Required reason
string
Required ownagreementcontract_endemployerprobationdisciplinerelocationothercomment
string | null
rehire
boolean
template_id
integer | null
block_now
boolean
Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.hire, 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
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/dismiss' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"last_day": "2026-11-01",
"reason": "own",
"comment": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"rehire": true
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/dismiss', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"last_day": "2026-11-01",
"reason": "own",
"comment": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"rehire": true
}),
});
const { data } = await res.json();import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/dismiss",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"last_day":"2026-11-01","reason":"own","comment":"Seal on fridge #2 is torn, temperature rises to +9 °C.","rehire":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('POST', 'hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/dismiss', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'last_day' => '2026-11-01',
'reason' => 'own',
'comment' => 'Seal on fridge #2 is torn, temperature rises to +9 °C.',
'rehire' => true,
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_employees_dismiss",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"last_day": "2026-11-01",
"reason": "own",
"comment": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"rehire": true
}
}
}{
"data": {
"employee": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim",
"lastname": "Sadykova",
"email": "[email protected]",
"phone": "+7 701 111 22 33",
"is_admin": false,
"deleted": false,
"deleted_at": null,
"web_access": false,
"position": {
"id": 7,
"name": "Barista"
},
"locations": [
{
"id": 12,
"name": "Abay Ave",
"kind": "home"
}
],
"home_location_id": 12,
"work_anywhere": false,
"teams": [
{
"id": 3,
"name": "Bar",
"is_head": false
}
],
"created_at": "2026-03-01T09:00:00+05:00",
"last_seen_at": "2026-11-03T08:12:00+05:00",
"url": "https://app.jecheck.io/ui/users/1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b"
},
"status": {
"status": "probation",
"until": "2026-12-01",
"absence_type": null,
"hired_at": "2026-09-01",
"fired_at": null,
"personnel_no": "0114",
"onboarding": {
"uuid": "4d5e6f70-8192-4a3b-8c4d-5e6f708192a3",
"kind": "onboarding",
"done": 3,
"total": 9,
"overdue": 1
}
},
"profile": {
"middle_name": "Nurlanovna",
"gender": "female",
"birth_date": "1998-04-12",
"birth_place": null,
"citizenship": null,
"marital_status": null,
"children": null,
"work_phone": null,
"personal_phone": "+7 701 000 00 00",
"personal_email": null,
"address_actual": null,
"address_registered": null,
"tax_id": null,
"insurance_no": null,
"id_doc_type": null,
"id_doc_number": null,
"id_doc_issuer": null,
"id_doc_issued_at": null,
"id_doc_expires_at": null,
"emergency_name": null,
"emergency_relation": null,
"emergency_phone": null,
"bank_name": null,
"bank_account": null,
"education": null,
"languages": null,
"clothing_size": null,
"shoe_size": null,
"note": null,
"custom": {}
},
"work": {
"hired_at": "2026-09-01",
"fired_at": null,
"personnel_no": "0114",
"employment": "full",
"probation_until": "2026-12-01",
"contract_type": "permanent",
"contract_number": "TD-2026/114",
"contract_date": "2026-09-01",
"contract_until": null,
"vacation_days": null,
"vacation_adjust": 0,
"manager": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"team_managers": [],
"reports": []
},
"pay": {
"pay_type": "hourly",
"rate": 1500,
"kpi_bonus": null,
"kpi_bonus_type": "fixed",
"currency": "KZT",
"history": [
{
"from": "2026-09-01",
"pay_type": "hourly",
"rate": 1500
}
]
},
"vacation": {
"per_year": 24,
"accrued": 4.1,
"adjust": 0,
"used": 0,
"planned": 0,
"pending": 0,
"balance": 4.1,
"available": 4.1
},
"absences": [
{
"uuid": "2b3c4d5e-6f70-4a81-92b3-c4d5e6f7a8b9",
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"type": "vacation",
"date_from": "2026-12-01",
"date_to": "2026-12-14",
"days": 14,
"status": "approved",
"paid": true,
"comment": null,
"decision_note": null,
"decided_by": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"decided_at": "2026-11-03T10:00:00+05:00",
"has_file": false,
"created_at": "2026-11-03T09:55:00+05:00"
}
],
"events": [
{
"id": 501,
"type": "hire",
"date": "2026-09-01",
"data": {
"position": "Barista"
},
"comment": null,
"created_by": "Daniyar Omarov",
"created_at": "2026-08-28T10:00:00+05:00"
}
],
"documents": [
{
"id": 88,
"type": "contract",
"title": "Employment contract",
"number": "TD-2026/114",
"issued_at": "2026-03-01",
"expires_at": null,
"note": null,
"source": "hr",
"file": {
"name": "contract.pdf",
"download_url": "https://app.jecheck.io/api/ext/v1/hr/employees/1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b/documents/88/file"
}
}
],
"checklists": [
{
"uuid": "4d5e6f70-8192-4a3b-8c4d-5e6f708192a3",
"kind": "onboarding",
"title": "Onboarding: Aigerim Sadykova",
"start_date": "2026-11-04",
"status": "active",
"employee": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"sections": [
{
"key": "s1",
"title": "Before the first day"
}
],
"progress": {
"done": 3,
"total": 9,
"overdue": 1
},
"items": [
{
"id": 7001,
"section_key": "s1",
"title": "Prepare a uniform",
"description": null,
"assignee": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"due_date": "2026-11-03",
"overdue": true,
"status": "open",
"requires": "none",
"required": true,
"comment": null,
"has_file": false,
"done_by": null,
"done_at": null,
"task_uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
],
"created_at": "2026-10-30T12:00:00+05:00",
"completed_at": null
}
],
"can": {
"contacts": true,
"edit": true,
"card": true,
"personal": true,
"documents": true,
"hire": true,
"absences": true,
"pay_view": true,
"pay_edit": false
}
}
}POSTCancel a dismissal
The employee stays: dismissal dates and the offboarding checklist are removed, access is restored.
| Token scope | write |
|---|---|
| Permission |
hr.hire |
| MCP tool | hr_employees_cancel_dismissal |
Path parameters
uuid
uuid
Required Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.hire, 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
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/cancel-dismissal' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/cancel-dismissal', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
},
});
const { data } = await res.json();import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/cancel-dismissal",
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('POST', 'hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/cancel-dismissal', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_employees_cancel_dismissal",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
}
}{
"data": {
"employee": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim",
"lastname": "Sadykova",
"email": "[email protected]",
"phone": "+7 701 111 22 33",
"is_admin": false,
"deleted": false,
"deleted_at": null,
"web_access": false,
"position": {
"id": 7,
"name": "Barista"
},
"locations": [
{
"id": 12,
"name": "Abay Ave",
"kind": "home"
}
],
"home_location_id": 12,
"work_anywhere": false,
"teams": [
{
"id": 3,
"name": "Bar",
"is_head": false
}
],
"created_at": "2026-03-01T09:00:00+05:00",
"last_seen_at": "2026-11-03T08:12:00+05:00",
"url": "https://app.jecheck.io/ui/users/1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b"
},
"status": {
"status": "probation",
"until": "2026-12-01",
"absence_type": null,
"hired_at": "2026-09-01",
"fired_at": null,
"personnel_no": "0114",
"onboarding": {
"uuid": "4d5e6f70-8192-4a3b-8c4d-5e6f708192a3",
"kind": "onboarding",
"done": 3,
"total": 9,
"overdue": 1
}
},
"profile": {
"middle_name": "Nurlanovna",
"gender": "female",
"birth_date": "1998-04-12",
"birth_place": null,
"citizenship": null,
"marital_status": null,
"children": null,
"work_phone": null,
"personal_phone": "+7 701 000 00 00",
"personal_email": null,
"address_actual": null,
"address_registered": null,
"tax_id": null,
"insurance_no": null,
"id_doc_type": null,
"id_doc_number": null,
"id_doc_issuer": null,
"id_doc_issued_at": null,
"id_doc_expires_at": null,
"emergency_name": null,
"emergency_relation": null,
"emergency_phone": null,
"bank_name": null,
"bank_account": null,
"education": null,
"languages": null,
"clothing_size": null,
"shoe_size": null,
"note": null,
"custom": {}
},
"work": {
"hired_at": "2026-09-01",
"fired_at": null,
"personnel_no": "0114",
"employment": "full",
"probation_until": "2026-12-01",
"contract_type": "permanent",
"contract_number": "TD-2026/114",
"contract_date": "2026-09-01",
"contract_until": null,
"vacation_days": null,
"vacation_adjust": 0,
"manager": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"team_managers": [],
"reports": []
},
"pay": {
"pay_type": "hourly",
"rate": 1500,
"kpi_bonus": null,
"kpi_bonus_type": "fixed",
"currency": "KZT",
"history": [
{
"from": "2026-09-01",
"pay_type": "hourly",
"rate": 1500
}
]
},
"vacation": {
"per_year": 24,
"accrued": 4.1,
"adjust": 0,
"used": 0,
"planned": 0,
"pending": 0,
"balance": 4.1,
"available": 4.1
},
"absences": [
{
"uuid": "2b3c4d5e-6f70-4a81-92b3-c4d5e6f7a8b9",
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"type": "vacation",
"date_from": "2026-12-01",
"date_to": "2026-12-14",
"days": 14,
"status": "approved",
"paid": true,
"comment": null,
"decision_note": null,
"decided_by": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"decided_at": "2026-11-03T10:00:00+05:00",
"has_file": false,
"created_at": "2026-11-03T09:55:00+05:00"
}
],
"events": [
{
"id": 501,
"type": "hire",
"date": "2026-09-01",
"data": {
"position": "Barista"
},
"comment": null,
"created_by": "Daniyar Omarov",
"created_at": "2026-08-28T10:00:00+05:00"
}
],
"documents": [
{
"id": 88,
"type": "contract",
"title": "Employment contract",
"number": "TD-2026/114",
"issued_at": "2026-03-01",
"expires_at": null,
"note": null,
"source": "hr",
"file": {
"name": "contract.pdf",
"download_url": "https://app.jecheck.io/api/ext/v1/hr/employees/1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b/documents/88/file"
}
}
],
"checklists": [
{
"uuid": "4d5e6f70-8192-4a3b-8c4d-5e6f708192a3",
"kind": "onboarding",
"title": "Onboarding: Aigerim Sadykova",
"start_date": "2026-11-04",
"status": "active",
"employee": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"sections": [
{
"key": "s1",
"title": "Before the first day"
}
],
"progress": {
"done": 3,
"total": 9,
"overdue": 1
},
"items": [
{
"id": 7001,
"section_key": "s1",
"title": "Prepare a uniform",
"description": null,
"assignee": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"due_date": "2026-11-03",
"overdue": true,
"status": "open",
"requires": "none",
"required": true,
"comment": null,
"has_file": false,
"done_by": null,
"done_at": null,
"task_uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
],
"created_at": "2026-10-30T12:00:00+05:00",
"completed_at": null
}
],
"can": {
"contacts": true,
"edit": true,
"card": true,
"personal": true,
"documents": true,
"hire": true,
"absences": true,
"pay_view": true,
"pay_edit": false
}
}
}POSTRehire a former employee
| Token scope | write |
|---|---|
| Permission |
hr.hire |
| MCP tool | hr_employees_rehire |
Path parameters
uuid
uuid
Required Request body
hired_at
date
Required position_id
integer | null
home_location_id
integer | null
location_ids
array<integer>
work_anywhere
boolean
manager_id
integer | null
template_id
integer | null
comment
string | null
Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.hire, 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
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/rehire' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"hired_at": "2026-11-01",
"position_id": 42,
"home_location_id": 12,
"location_ids": [
12,
14
]
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/rehire', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"hired_at": "2026-11-01",
"position_id": 42,
"home_location_id": 12,
"location_ids": [
12,
14
]
}),
});
const { data } = await res.json();import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/rehire",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"hired_at":"2026-11-01","position_id":42,"home_location_id":12,"location_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', 'hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/rehire', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'hired_at' => '2026-11-01',
'position_id' => 42,
'home_location_id' => 12,
'location_ids' => [
12,
14,
],
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_employees_rehire",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"hired_at": "2026-11-01",
"position_id": 42,
"home_location_id": 12,
"location_ids": [
12,
14
]
}
}
}{
"data": {
"employee": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim",
"lastname": "Sadykova",
"email": "[email protected]",
"phone": "+7 701 111 22 33",
"is_admin": false,
"deleted": false,
"deleted_at": null,
"web_access": false,
"position": {
"id": 7,
"name": "Barista"
},
"locations": [
{
"id": 12,
"name": "Abay Ave",
"kind": "home"
}
],
"home_location_id": 12,
"work_anywhere": false,
"teams": [
{
"id": 3,
"name": "Bar",
"is_head": false
}
],
"created_at": "2026-03-01T09:00:00+05:00",
"last_seen_at": "2026-11-03T08:12:00+05:00",
"url": "https://app.jecheck.io/ui/users/1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b"
},
"status": {
"status": "probation",
"until": "2026-12-01",
"absence_type": null,
"hired_at": "2026-09-01",
"fired_at": null,
"personnel_no": "0114",
"onboarding": {
"uuid": "4d5e6f70-8192-4a3b-8c4d-5e6f708192a3",
"kind": "onboarding",
"done": 3,
"total": 9,
"overdue": 1
}
},
"profile": {
"middle_name": "Nurlanovna",
"gender": "female",
"birth_date": "1998-04-12",
"birth_place": null,
"citizenship": null,
"marital_status": null,
"children": null,
"work_phone": null,
"personal_phone": "+7 701 000 00 00",
"personal_email": null,
"address_actual": null,
"address_registered": null,
"tax_id": null,
"insurance_no": null,
"id_doc_type": null,
"id_doc_number": null,
"id_doc_issuer": null,
"id_doc_issued_at": null,
"id_doc_expires_at": null,
"emergency_name": null,
"emergency_relation": null,
"emergency_phone": null,
"bank_name": null,
"bank_account": null,
"education": null,
"languages": null,
"clothing_size": null,
"shoe_size": null,
"note": null,
"custom": {}
},
"work": {
"hired_at": "2026-09-01",
"fired_at": null,
"personnel_no": "0114",
"employment": "full",
"probation_until": "2026-12-01",
"contract_type": "permanent",
"contract_number": "TD-2026/114",
"contract_date": "2026-09-01",
"contract_until": null,
"vacation_days": null,
"vacation_adjust": 0,
"manager": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"team_managers": [],
"reports": []
},
"pay": {
"pay_type": "hourly",
"rate": 1500,
"kpi_bonus": null,
"kpi_bonus_type": "fixed",
"currency": "KZT",
"history": [
{
"from": "2026-09-01",
"pay_type": "hourly",
"rate": 1500
}
]
},
"vacation": {
"per_year": 24,
"accrued": 4.1,
"adjust": 0,
"used": 0,
"planned": 0,
"pending": 0,
"balance": 4.1,
"available": 4.1
},
"absences": [
{
"uuid": "2b3c4d5e-6f70-4a81-92b3-c4d5e6f7a8b9",
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"type": "vacation",
"date_from": "2026-12-01",
"date_to": "2026-12-14",
"days": 14,
"status": "approved",
"paid": true,
"comment": null,
"decision_note": null,
"decided_by": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"decided_at": "2026-11-03T10:00:00+05:00",
"has_file": false,
"created_at": "2026-11-03T09:55:00+05:00"
}
],
"events": [
{
"id": 501,
"type": "hire",
"date": "2026-09-01",
"data": {
"position": "Barista"
},
"comment": null,
"created_by": "Daniyar Omarov",
"created_at": "2026-08-28T10:00:00+05:00"
}
],
"documents": [
{
"id": 88,
"type": "contract",
"title": "Employment contract",
"number": "TD-2026/114",
"issued_at": "2026-03-01",
"expires_at": null,
"note": null,
"source": "hr",
"file": {
"name": "contract.pdf",
"download_url": "https://app.jecheck.io/api/ext/v1/hr/employees/1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b/documents/88/file"
}
}
],
"checklists": [
{
"uuid": "4d5e6f70-8192-4a3b-8c4d-5e6f708192a3",
"kind": "onboarding",
"title": "Onboarding: Aigerim Sadykova",
"start_date": "2026-11-04",
"status": "active",
"employee": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"sections": [
{
"key": "s1",
"title": "Before the first day"
}
],
"progress": {
"done": 3,
"total": 9,
"overdue": 1
},
"items": [
{
"id": 7001,
"section_key": "s1",
"title": "Prepare a uniform",
"description": null,
"assignee": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"due_date": "2026-11-03",
"overdue": true,
"status": "open",
"requires": "none",
"required": true,
"comment": null,
"has_file": false,
"done_by": null,
"done_at": null,
"task_uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
],
"created_at": "2026-10-30T12:00:00+05:00",
"completed_at": null
}
],
"can": {
"contacts": true,
"edit": true,
"card": true,
"personal": true,
"documents": true,
"hire": true,
"absences": true,
"pay_view": true,
"pay_edit": false
}
}
}POSTStart a checklist for an employee
Starts an onboarding or offboarding checklist from a template manually (tasks are created for the responsible people).
| Token scope | write |
|---|---|
| Permission |
hr.hire |
| MCP tool | hr_employees_checklists_start |
Path parameters
uuid
uuid
Required Request body
template_id
integer
Required date
date
Required Responses
| Status | Description |
|---|---|
| 201 | Created |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.hire, 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
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/checklists' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"template_id": 42,
"date": "2026-11-01"
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/checklists', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"template_id": 42,
"date": "2026-11-01"
}),
});
const { data } = await res.json();import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/checklists",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"template_id":42,"date":"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('POST', 'hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/checklists', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'template_id' => 42,
'date' => '2026-11-01',
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_employees_checklists_start",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"template_id": 42,
"date": "2026-11-01"
}
}
}{
"data": {
"uuid": "4d5e6f70-8192-4a3b-8c4d-5e6f708192a3",
"kind": "onboarding",
"title": "Onboarding: Aigerim Sadykova",
"start_date": "2026-11-04",
"status": "active",
"employee": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"sections": [
{
"key": "s1",
"title": "Before the first day"
}
],
"progress": {
"done": 3,
"total": 9,
"overdue": 1
},
"items": [
{
"id": 7001,
"section_key": "s1",
"title": "Prepare a uniform",
"description": null,
"assignee": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"due_date": "2026-11-03",
"overdue": true,
"status": "open",
"requires": "none",
"required": true,
"comment": null,
"has_file": false,
"done_by": null,
"done_at": null,
"task_uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
],
"created_at": "2026-10-30T12:00:00+05:00",
"completed_at": null
}
}POSTAdd a note to the HR history
| Token scope | write |
|---|---|
| Permission |
hr.hire |
| MCP tool | hr_employees_notes_create |
Path parameters
uuid
uuid
Required Request body
date
date
Required comment
string
Required title
string | null
Responses
| Status | Description |
|---|---|
| 201 | Created |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.hire, 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
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/notes' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"date": "2026-11-01",
"comment": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"title": "Replace the broken fridge seal"
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/notes', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"date": "2026-11-01",
"comment": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"title": "Replace the broken fridge seal"
}),
});
const { data } = await res.json();import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/notes",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"date":"2026-11-01","comment":"Seal on fridge #2 is torn, temperature rises to +9 °C.","title":"Replace the broken fridge seal"},
)
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', 'hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/notes', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'date' => '2026-11-01',
'comment' => 'Seal on fridge #2 is torn, temperature rises to +9 °C.',
'title' => 'Replace the broken fridge seal',
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_employees_notes_create",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"date": "2026-11-01",
"comment": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"title": "Replace the broken fridge seal"
}
}
}{
"data": {
"id": 502,
"type": "note",
"date": "2026-11-03",
"data": {
"title": "Warning"
},
"comment": "Late three times this month",
"created_by": "Daniyar Omarov",
"created_at": "2026-11-03T10:00:00+05:00"
}
}DELDelete a note from the HR history
Only notes can be deleted; hiring and dismissal are undone by their own operations.
| Token scope | write |
|---|---|
| Permission |
hr.hire |
| MCP tool | hr_employees_notes_delete · destructive |
Path parameters
uuid
uuid
Required id
integer
Required Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.hire, 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
|
curl -X DELETE 'https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/notes/42' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/notes/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/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/notes/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', 'hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/notes/42', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_employees_notes_delete",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"id": 42
}
}
}{
"data": {
"deleted": true
}
}GETList HR documents of an employee
Contracts, orders, IDs, certificates (plus medical books from HACCP, read-only). Each view is written to the access log.
| Token scope | read |
|---|---|
| Permission |
hr.documents |
| MCP tool | hr_documents_list · read-only |
Path parameters
uuid
uuid
Required Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.documents
|
| 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
|
curl 'https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/documents' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/documents', {
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/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/documents",
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', 'hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/documents', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_documents_list",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
}
}{
"data": [
{
"id": 88,
"type": "contract",
"title": "Employment contract",
"number": "TD-2026/114",
"issued_at": "2026-03-01",
"expires_at": null,
"note": null,
"source": "hr",
"file": {
"name": "contract.pdf",
"download_url": "https://app.jecheck.io/api/ext/v1/hr/employees/1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b/documents/88/file"
}
}
]
}POSTAdd an HR document
| Token scope | write |
|---|---|
| Permission |
hr.documents |
| MCP tool | hr_documents_create |
| Content type | multipart/form-data application/json |
Path parameters
uuid
uuid
Required Request body
type
string
Required contractaddendumorderidmedicalcertificatediplomandaconsentothertitle
string | null
number
string | null
issued_at
date | null
expires_at
date | null
note
string | null
file
file
Responses
| Status | Description |
|---|---|
| 201 | Created |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.documents, 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
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/documents' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"type": "contract",
"title": "Replace the broken fridge seal",
"number": "string",
"issued_at": "2026-11-01"
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/documents', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"type": "contract",
"title": "Replace the broken fridge seal",
"number": "string",
"issued_at": "2026-11-01"
}),
});
const { data } = await res.json();import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/documents",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"type":"contract","title":"Replace the broken fridge seal","number":"string","issued_at":"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('POST', 'hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/documents', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'type' => 'contract',
'title' => 'Replace the broken fridge seal',
'number' => 'string',
'issued_at' => '2026-11-01',
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_documents_create",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"type": "contract",
"title": "Replace the broken fridge seal",
"number": "string",
"issued_at": "2026-11-01"
}
}
}{
"data": {
"id": 88,
"type": "contract",
"title": "Employment contract",
"number": "TD-2026/114",
"issued_at": "2026-03-01",
"expires_at": null,
"note": null,
"source": "hr",
"file": {
"name": "contract.pdf",
"download_url": "https://app.jecheck.io/api/ext/v1/hr/employees/1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b/documents/88/file"
}
}
}PATCHUpdate an HR document
| Token scope | write |
|---|---|
| Permission |
hr.documents |
| MCP tool | hr_documents_update |
| Content type | multipart/form-data application/json |
Path parameters
uuid
uuid
Required id
integer
Required Request body
type
string
contractaddendumorderidmedicalcertificatediplomandaconsentothertitle
string | null
number
string | null
issued_at
date | null
expires_at
date | null
note
string | null
file
file
Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.documents, 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
|
curl -X PATCH 'https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/documents/42' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"type": "contract",
"title": "Replace the broken fridge seal",
"number": "string",
"issued_at": "2026-11-01"
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/documents/42', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"type": "contract",
"title": "Replace the broken fridge seal",
"number": "string",
"issued_at": "2026-11-01"
}),
});
const { data } = await res.json();import os, requests
res = requests.patch(
"https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/documents/42",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"type":"contract","title":"Replace the broken fridge seal","number":"string","issued_at":"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('PATCH', 'hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/documents/42', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'type' => 'contract',
'title' => 'Replace the broken fridge seal',
'number' => 'string',
'issued_at' => '2026-11-01',
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_documents_update",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"id": 42,
"type": "contract",
"title": "Replace the broken fridge seal",
"number": "string",
"issued_at": "2026-11-01"
}
}
}{
"data": {
"id": 88,
"type": "contract",
"title": "Employment contract",
"number": "TD-2026/114",
"issued_at": "2026-03-01",
"expires_at": null,
"note": null,
"source": "hr",
"file": {
"name": "contract.pdf",
"download_url": "https://app.jecheck.io/api/ext/v1/hr/employees/1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b/documents/88/file"
}
}
}DELDelete an HR document
| Token scope | write |
|---|---|
| Permission |
hr.documents |
| MCP tool | hr_documents_delete · destructive |
Path parameters
uuid
uuid
Required id
integer
Required Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.documents, 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
|
curl -X DELETE 'https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/documents/42' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/documents/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/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/documents/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', 'hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/documents/42', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_documents_delete",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"id": 42
}
}
}{
"data": {
"deleted": true
}
}GETDownload an HR document file
Returns the file itself (REST only, not available as an MCP tool). The download is written to the access log.
| Token scope | read |
|---|---|
| Permission |
hr.documents |
| MCP tool | Not available over MCP |
Path parameters
uuid
uuid
Required id
integer
Required Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.documents
|
| 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
|
curl 'https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/documents/42/file' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/documents/42/file', {
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/hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/documents/42/file",
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', 'hr/employees/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/documents/42/file', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];{
"data": {
"file": "binary"
}
}GETList absences
Vacations, sick leave and other absences of employees of the locations of hr.absences (the same records as in the shift schedule). Overlapping the period when date_from/date_to are given.
| Token scope | read |
|---|---|
| Permission |
hr.absences |
| MCP tool | hr_absences_list · read-only |
Query parameters
page
integer
1. Minimum 1.
per_page
integer
25. Value 1–100.
date_from
date
date_to
date
status
array<string>
type
array<string>
user_id
integer
location_ids
array<integer>
updated_since
date-time
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 — Token lacks hr.absences
|
| 422 | validation_failed — Invalid parameters — see error.fields
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl 'https://app.jecheck.io/api/ext/v1/hr/absences?date_from=2026-11-01' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/absences?date_from=2026-11-01', {
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/hr/absences",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
params={"date_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', 'hr/absences', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'query' => [
'date_from' => '2026-11-01',
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_absences_list",
"arguments": {
"date_from": "2026-11-01"
}
}
}{
"data": [
{
"uuid": "2b3c4d5e-6f70-4a81-92b3-c4d5e6f7a8b9",
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"type": "vacation",
"date_from": "2026-12-01",
"date_to": "2026-12-14",
"days": 14,
"status": "approved",
"paid": true,
"comment": null,
"decision_note": null,
"decided_by": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"decided_at": "2026-11-03T10:00:00+05:00",
"has_file": false,
"created_at": "2026-11-03T09:55:00+05:00"
}
],
"meta": {
"page": 1,
"per_page": 25,
"total": 1,
"has_more": false
}
}GETGet vacation balances
Annual vacation balance of each active employee of the locations of hr.absences: accrued since the hire date, used, planned, pending and available days.
| Token scope | read |
|---|---|
| Permission |
hr.absences |
| MCP tool | hr_absences_balances · read-only |
Query parameters
page
integer
1. Minimum 1.
per_page
integer
25. Value 1–100.
location_ids
array<integer>
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 — Token lacks hr.absences
|
| 422 | validation_failed — Invalid parameters — see error.fields
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl 'https://app.jecheck.io/api/ext/v1/hr/absences/balances' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/absences/balances', {
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/hr/absences/balances",
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', 'hr/absences/balances', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_absences_balances",
"arguments": {}
}
}{
"data": [
{
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"hired_at": "2026-03-01",
"per_year": 24,
"accrued": 16.4,
"adjust": 0,
"used": 7,
"planned": 14,
"pending": 0,
"balance": 9.4,
"available": -4.6
}
],
"meta": {
"page": 1,
"per_page": 25,
"total": 1,
"has_more": false
}
}POSTAdd an absence
Records a vacation, sick leave etc. for an employee — approved immediately (requires hr.absences and schedule.requests on the employee's locations). With release_shifts the employee's shifts on those days become open shifts.
| Token scope | write |
|---|---|
| Permission |
hr.absences |
| MCP tool | hr_absences_create |
| Content type | multipart/form-data application/json |
Request body
user_id
integer
Required type
string
Required vacationsickday_offunpaidbusiness_tripstudymaternitytruancyotherdate_from
date
Required date_to
date
Required paid
boolean
comment
string | null
release_shifts
boolean
file
file
Responses
| Status | Description |
|---|---|
| 201 | Created |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.absences, is read-only
|
| 422 | validation_failed — Invalid parameters — see error.fields
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/hr/absences' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"user_id": 42,
"type": "vacation",
"date_from": "2026-11-01",
"date_to": "2026-11-30"
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/absences', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"user_id": 42,
"type": "vacation",
"date_from": "2026-11-01",
"date_to": "2026-11-30"
}),
});
const { data } = await res.json();import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/hr/absences",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"user_id":42,"type":"vacation","date_from":"2026-11-01","date_to":"2026-11-30"},
)
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', 'hr/absences', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'user_id' => 42,
'type' => 'vacation',
'date_from' => '2026-11-01',
'date_to' => '2026-11-30',
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_absences_create",
"arguments": {
"user_id": 42,
"type": "vacation",
"date_from": "2026-11-01",
"date_to": "2026-11-30"
}
}
}{
"data": {
"uuid": "2b3c4d5e-6f70-4a81-92b3-c4d5e6f7a8b9",
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"type": "vacation",
"date_from": "2026-12-01",
"date_to": "2026-12-14",
"days": 14,
"status": "approved",
"paid": true,
"comment": null,
"decision_note": null,
"decided_by": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"decided_at": "2026-11-03T10:00:00+05:00",
"has_file": false,
"created_at": "2026-11-03T09:55:00+05:00"
}
}PATCHUpdate an absence
| Token scope | write |
|---|---|
| Permission |
hr.absences |
| MCP tool | hr_absences_update |
| Content type | multipart/form-data application/json |
Path parameters
uuid
uuid
Required Request body
type
string
vacationsickday_offunpaidbusiness_tripstudymaternitytruancyotherdate_from
date
date_to
date
paid
boolean
comment
string | null
release_shifts
boolean
file
file
Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.absences, 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
|
curl -X PATCH 'https://app.jecheck.io/api/ext/v1/hr/absences/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"type": "vacation",
"date_from": "2026-11-01",
"date_to": "2026-11-30",
"paid": true
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/absences/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"type": "vacation",
"date_from": "2026-11-01",
"date_to": "2026-11-30",
"paid": true
}),
});
const { data } = await res.json();import os, requests
res = requests.patch(
"https://app.jecheck.io/api/ext/v1/hr/absences/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"type":"vacation","date_from":"2026-11-01","date_to":"2026-11-30","paid":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('PATCH', 'hr/absences/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'type' => 'vacation',
'date_from' => '2026-11-01',
'date_to' => '2026-11-30',
'paid' => true,
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_absences_update",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"type": "vacation",
"date_from": "2026-11-01",
"date_to": "2026-11-30",
"paid": true
}
}
}{
"data": {
"uuid": "2b3c4d5e-6f70-4a81-92b3-c4d5e6f7a8b9",
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"type": "vacation",
"date_from": "2026-12-01",
"date_to": "2026-12-14",
"days": 14,
"status": "approved",
"paid": true,
"comment": null,
"decision_note": null,
"decided_by": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"decided_at": "2026-11-03T10:00:00+05:00",
"has_file": false,
"created_at": "2026-11-03T09:55:00+05:00"
}
}POSTApprove or reject an absence request
Decision on a pending request submitted by an employee; the employee is notified.
| Token scope | write |
|---|---|
| Permission |
hr.absences |
| MCP tool | hr_absences_decide |
Path parameters
uuid
uuid
Required Request body
approve
boolean
Required note
string | null
release_shifts
boolean
Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.absences, 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
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/hr/absences/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/decide' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"approve": true,
"note": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"release_shifts": true
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/absences/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/decide', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"approve": true,
"note": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"release_shifts": true
}),
});
const { data } = await res.json();import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/hr/absences/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/decide",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"approve":True,"note":"Seal on fridge #2 is torn, temperature rises to +9 °C.","release_shifts":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('POST', 'hr/absences/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/decide', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'approve' => true,
'note' => 'Seal on fridge #2 is torn, temperature rises to +9 °C.',
'release_shifts' => true,
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_absences_decide",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"approve": true,
"note": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"release_shifts": true
}
}
}{
"data": {
"uuid": "2b3c4d5e-6f70-4a81-92b3-c4d5e6f7a8b9",
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"type": "vacation",
"date_from": "2026-12-01",
"date_to": "2026-12-14",
"days": 14,
"status": "approved",
"paid": true,
"comment": null,
"decision_note": null,
"decided_by": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"decided_at": "2026-11-03T10:00:00+05:00",
"has_file": false,
"created_at": "2026-11-03T09:55:00+05:00"
}
}POSTCancel an absence
| Token scope | write |
|---|---|
| Permission |
hr.absences |
| MCP tool | hr_absences_cancel |
Path parameters
uuid
uuid
Required Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.absences, 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
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/hr/absences/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/cancel' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/absences/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/cancel', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
},
});
const { data } = await res.json();import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/hr/absences/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/cancel",
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('POST', 'hr/absences/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/cancel', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_absences_cancel",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
}
}{
"data": {
"uuid": "2b3c4d5e-6f70-4a81-92b3-c4d5e6f7a8b9",
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"type": "vacation",
"date_from": "2026-12-01",
"date_to": "2026-12-14",
"days": 14,
"status": "approved",
"paid": true,
"comment": null,
"decision_note": null,
"decided_by": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"decided_at": "2026-11-03T10:00:00+05:00",
"has_file": false,
"created_at": "2026-11-03T09:55:00+05:00"
}
}GETList onboarding and offboarding checklists
Active checklists and those finished in the last 90 days, for employees of the locations of hr.hire.
| Token scope | read |
|---|---|
| Permission |
hr.hire |
| MCP tool | hr_checklists_list · read-only |
Query parameters
kind
string
onboardingoffboardingstatus
string
activecompletedcancelledResponses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.hire
|
| 422 | validation_failed — Invalid parameters — see error.fields
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl 'https://app.jecheck.io/api/ext/v1/hr/checklists?kind=onboarding' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/checklists?kind=onboarding', {
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/hr/checklists",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
params={"kind":"onboarding"},
)
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', 'hr/checklists', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'query' => [
'kind' => 'onboarding',
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_checklists_list",
"arguments": {
"kind": "onboarding"
}
}
}{
"data": [
{
"uuid": "4d5e6f70-8192-4a3b-8c4d-5e6f708192a3",
"kind": "onboarding",
"title": "Onboarding: Aigerim Sadykova",
"start_date": "2026-11-04",
"status": "active",
"employee": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"sections": [
{
"key": "s1",
"title": "Before the first day"
}
],
"progress": {
"done": 3,
"total": 9,
"overdue": 1
},
"items": [
{
"id": 7001,
"section_key": "s1",
"title": "Prepare a uniform",
"description": null,
"assignee": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"due_date": "2026-11-03",
"overdue": true,
"status": "open",
"requires": "none",
"required": true,
"comment": null,
"has_file": false,
"done_by": null,
"done_at": null,
"task_uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
],
"created_at": "2026-10-30T12:00:00+05:00",
"completed_at": null
}
]
}GETRetrieve a checklist
| Token scope | read |
|---|---|
| Permission |
hr.hire |
| MCP tool | hr_checklists_get · read-only |
Path parameters
uuid
uuid
Required Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.hire
|
| 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
|
curl 'https://app.jecheck.io/api/ext/v1/hr/checklists/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/checklists/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b', {
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/hr/checklists/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
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', 'hr/checklists/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_checklists_get",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
}
}{
"data": {
"uuid": "4d5e6f70-8192-4a3b-8c4d-5e6f708192a3",
"kind": "onboarding",
"title": "Onboarding: Aigerim Sadykova",
"start_date": "2026-11-04",
"status": "active",
"employee": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"sections": [
{
"key": "s1",
"title": "Before the first day"
}
],
"progress": {
"done": 3,
"total": 9,
"overdue": 1
},
"items": [
{
"id": 7001,
"section_key": "s1",
"title": "Prepare a uniform",
"description": null,
"assignee": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"due_date": "2026-11-03",
"overdue": true,
"status": "open",
"requires": "none",
"required": true,
"comment": null,
"has_file": false,
"done_by": null,
"done_at": null,
"task_uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
],
"created_at": "2026-10-30T12:00:00+05:00",
"completed_at": null
}
}POSTAdd a checklist item
| Token scope | write |
|---|---|
| Permission |
hr.hire |
| MCP tool | hr_checklists_items_create |
Path parameters
uuid
uuid
Required Request body
title
string
Required description
string | null
assignee_id
integer | null
due_date
date | null
section_key
string | null
requires
string
nonecommentfilecreate_task
boolean
Responses
| Status | Description |
|---|---|
| 201 | Created |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.hire, 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
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/hr/checklists/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/items' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"title": "Replace the broken fridge seal",
"description": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"assignee_id": 42,
"due_date": "2026-11-01"
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/checklists/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/items', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"title": "Replace the broken fridge seal",
"description": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"assignee_id": 42,
"due_date": "2026-11-01"
}),
});
const { data } = await res.json();import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/hr/checklists/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/items",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"title":"Replace the broken fridge seal","description":"Seal on fridge #2 is torn, temperature rises to +9 °C.","assignee_id":42,"due_date":"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('POST', 'hr/checklists/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/items', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'title' => 'Replace the broken fridge seal',
'description' => 'Seal on fridge #2 is torn, temperature rises to +9 °C.',
'assignee_id' => 42,
'due_date' => '2026-11-01',
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_checklists_items_create",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"title": "Replace the broken fridge seal",
"description": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"assignee_id": 42,
"due_date": "2026-11-01"
}
}
}{
"data": {
"uuid": "4d5e6f70-8192-4a3b-8c4d-5e6f708192a3",
"kind": "onboarding",
"title": "Onboarding: Aigerim Sadykova",
"start_date": "2026-11-04",
"status": "active",
"employee": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"sections": [
{
"key": "s1",
"title": "Before the first day"
}
],
"progress": {
"done": 3,
"total": 9,
"overdue": 1
},
"items": [
{
"id": 7001,
"section_key": "s1",
"title": "Prepare a uniform",
"description": null,
"assignee": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"due_date": "2026-11-03",
"overdue": true,
"status": "open",
"requires": "none",
"required": true,
"comment": null,
"has_file": false,
"done_by": null,
"done_at": null,
"task_uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
],
"created_at": "2026-10-30T12:00:00+05:00",
"completed_at": null
}
}PATCHUpdate a checklist item
| Token scope | write |
|---|---|
| Permission |
hr.hire |
| MCP tool | hr_checklists_items_update |
Path parameters
id
integer
Required Request body
title
string
description
string | null
assignee_id
integer | null
due_date
date | null
section_key
string
requires
string
nonecommentfileResponses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.hire, 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
|
curl -X PATCH 'https://app.jecheck.io/api/ext/v1/hr/checklist-items/42' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"title": "Replace the broken fridge seal",
"description": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"assignee_id": 42,
"due_date": "2026-11-01"
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/checklist-items/42', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"title": "Replace the broken fridge seal",
"description": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"assignee_id": 42,
"due_date": "2026-11-01"
}),
});
const { data } = await res.json();import os, requests
res = requests.patch(
"https://app.jecheck.io/api/ext/v1/hr/checklist-items/42",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"title":"Replace the broken fridge seal","description":"Seal on fridge #2 is torn, temperature rises to +9 °C.","assignee_id":42,"due_date":"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('PATCH', 'hr/checklist-items/42', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'title' => 'Replace the broken fridge seal',
'description' => 'Seal on fridge #2 is torn, temperature rises to +9 °C.',
'assignee_id' => 42,
'due_date' => '2026-11-01',
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_checklists_items_update",
"arguments": {
"id": 42,
"title": "Replace the broken fridge seal",
"description": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"assignee_id": 42,
"due_date": "2026-11-01"
}
}
}{
"data": {
"uuid": "4d5e6f70-8192-4a3b-8c4d-5e6f708192a3",
"kind": "onboarding",
"title": "Onboarding: Aigerim Sadykova",
"start_date": "2026-11-04",
"status": "active",
"employee": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"sections": [
{
"key": "s1",
"title": "Before the first day"
}
],
"progress": {
"done": 3,
"total": 9,
"overdue": 1
},
"items": [
{
"id": 7001,
"section_key": "s1",
"title": "Prepare a uniform",
"description": null,
"assignee": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"due_date": "2026-11-03",
"overdue": true,
"status": "open",
"requires": "none",
"required": true,
"comment": null,
"has_file": false,
"done_by": null,
"done_at": null,
"task_uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
],
"created_at": "2026-10-30T12:00:00+05:00",
"completed_at": null
}
}POSTComplete, skip or reopen a checklist item
| Token scope | write |
|---|---|
| Permission |
hr.hire |
| MCP tool | hr_checklists_items_status |
| Content type | multipart/form-data application/json |
Path parameters
id
integer
Required Request body
action
string
Required completeskipreopencomment
string | null
file
file
Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.hire, 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
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/hr/checklist-items/42/status' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"action": "complete",
"comment": "Seal on fridge #2 is torn, temperature rises to +9 °C."
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/checklist-items/42/status', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"action": "complete",
"comment": "Seal on fridge #2 is torn, temperature rises to +9 °C."
}),
});
const { data } = await res.json();import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/hr/checklist-items/42/status",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"action":"complete","comment":"Seal on fridge #2 is torn, temperature rises to +9 °C."},
)
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', 'hr/checklist-items/42/status', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'action' => 'complete',
'comment' => 'Seal on fridge #2 is torn, temperature rises to +9 °C.',
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_checklists_items_status",
"arguments": {
"id": 42,
"action": "complete",
"comment": "Seal on fridge #2 is torn, temperature rises to +9 °C."
}
}
}{
"data": {
"uuid": "4d5e6f70-8192-4a3b-8c4d-5e6f708192a3",
"kind": "onboarding",
"title": "Onboarding: Aigerim Sadykova",
"start_date": "2026-11-04",
"status": "active",
"employee": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"sections": [
{
"key": "s1",
"title": "Before the first day"
}
],
"progress": {
"done": 3,
"total": 9,
"overdue": 1
},
"items": [
{
"id": 7001,
"section_key": "s1",
"title": "Prepare a uniform",
"description": null,
"assignee": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"due_date": "2026-11-03",
"overdue": true,
"status": "open",
"requires": "none",
"required": true,
"comment": null,
"has_file": false,
"done_by": null,
"done_at": null,
"task_uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
],
"created_at": "2026-10-30T12:00:00+05:00",
"completed_at": null
}
}DELDelete a checklist item
| Token scope | write |
|---|---|
| Permission |
hr.hire |
| MCP tool | hr_checklists_items_delete · destructive |
Path parameters
id
integer
Required Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.hire, 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
|
curl -X DELETE 'https://app.jecheck.io/api/ext/v1/hr/checklist-items/42' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/checklist-items/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/hr/checklist-items/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', 'hr/checklist-items/42', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_checklists_items_delete",
"arguments": {
"id": 42
}
}
}{
"data": {
"deleted": true
}
}POSTCancel a checklist
| Token scope | write |
|---|---|
| Permission |
hr.hire |
| MCP tool | hr_checklists_cancel |
Path parameters
uuid
uuid
Required Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.hire, 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
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/hr/checklists/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/cancel' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/checklists/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/cancel', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
},
});
const { data } = await res.json();import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/hr/checklists/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/cancel",
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('POST', 'hr/checklists/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/cancel', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_checklists_cancel",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
}
}{
"data": {
"uuid": "4d5e6f70-8192-4a3b-8c4d-5e6f708192a3",
"kind": "onboarding",
"title": "Onboarding: Aigerim Sadykova",
"start_date": "2026-11-04",
"status": "active",
"employee": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"sections": [
{
"key": "s1",
"title": "Before the first day"
}
],
"progress": {
"done": 3,
"total": 9,
"overdue": 1
},
"items": [
{
"id": 7001,
"section_key": "s1",
"title": "Prepare a uniform",
"description": null,
"assignee": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"due_date": "2026-11-03",
"overdue": true,
"status": "open",
"requires": "none",
"required": true,
"comment": null,
"has_file": false,
"done_by": null,
"done_at": null,
"task_uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
],
"created_at": "2026-10-30T12:00:00+05:00",
"completed_at": null
}
}POSTMove the start date of a checklist
Moves the first working day / last day; due dates of open items shift by the same number of days.
| Token scope | write |
|---|---|
| Permission |
hr.hire |
| MCP tool | hr_checklists_reschedule |
Path parameters
uuid
uuid
Required Request body
date
date
Required Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.hire, 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
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/hr/checklists/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/reschedule' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"date": "2026-11-01"
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/checklists/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/reschedule', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"date": "2026-11-01"
}),
});
const { data } = await res.json();import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/hr/checklists/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/reschedule",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"date":"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('POST', 'hr/checklists/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/reschedule', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'date' => '2026-11-01',
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_checklists_reschedule",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"date": "2026-11-01"
}
}
}{
"data": {
"uuid": "4d5e6f70-8192-4a3b-8c4d-5e6f708192a3",
"kind": "onboarding",
"title": "Onboarding: Aigerim Sadykova",
"start_date": "2026-11-04",
"status": "active",
"employee": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"sections": [
{
"key": "s1",
"title": "Before the first day"
}
],
"progress": {
"done": 3,
"total": 9,
"overdue": 1
},
"items": [
{
"id": 7001,
"section_key": "s1",
"title": "Prepare a uniform",
"description": null,
"assignee": {
"id": 120,
"uuid": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d",
"name": "Daniyar Omarov"
},
"due_date": "2026-11-03",
"overdue": true,
"status": "open",
"requires": "none",
"required": true,
"comment": null,
"has_file": false,
"done_by": null,
"done_at": null,
"task_uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
],
"created_at": "2026-10-30T12:00:00+05:00",
"completed_at": null
}
}GETList checklist templates
| Token scope | read |
|---|---|
| Permission |
hr.hire or hr.onboarding |
| MCP tool | hr_templates_list · read-only |
Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.hire / hr.onboarding
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl 'https://app.jecheck.io/api/ext/v1/hr/templates' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/templates', {
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/hr/templates",
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', 'hr/templates', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_templates_list",
"arguments": {}
}
}{
"data": [
{
"id": 4,
"kind": "onboarding",
"name": "Barista onboarding",
"description": null,
"color": "#1f9d63",
"position_ids": [
7
],
"is_default": true,
"sections": [
{
"key": "s1",
"title": "Before the first day"
}
],
"items": [],
"items_count": 9,
"used": 14
}
]
}GETRetrieve a checklist template
| Token scope | read |
|---|---|
| Permission |
hr.onboarding |
| MCP tool | hr_templates_get · read-only |
Path parameters
id
integer
Required Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.onboarding
|
| 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
|
curl 'https://app.jecheck.io/api/ext/v1/hr/templates/42' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/templates/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/hr/templates/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', 'hr/templates/42', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_templates_get",
"arguments": {
"id": 42
}
}
}{
"data": {
"id": 4,
"kind": "onboarding",
"name": "Barista onboarding",
"description": null,
"color": "#1f9d63",
"position_ids": [
7
],
"is_default": true,
"sections": [
{
"key": "s1",
"title": "Before the first day"
}
],
"items": [
{
"id": 31,
"section_key": "s1",
"title": "Prepare a uniform",
"description": null,
"assignee_type": "location_manager",
"assignee_id": null,
"due_offset": -1,
"requires": "none",
"required": true,
"create_task": true,
"position_ids": []
}
],
"items_count": 1,
"used": 14
}
}POSTCreate a checklist template
Sections are stages ("Before the first day", "First week"…); items reference a section by section_key. Assignee types: user (assignee_id — user id), position (assignee_id — position id), manager (line manager), location_manager, employee (the employee themselves), initiator (who starts the checklist); due_offset — days from the start date (negative — before).
| Token scope | write |
|---|---|
| Permission |
hr.onboarding |
| MCP tool | hr_templates_create |
Request body
name
string
Required kind
string
Required onboardingoffboardingdescription
string | null
color
string | null
position_ids
array<integer>
is_default
boolean
sections
array<object>
Required key
string
Required title
string
Required items
array<object>
section_key
string
Required title
string
Required description
string | null
assignee_type
string
userpositionmanagerlocation_manageremployeeinitiatorassignee_id
integer | null
due_offset
integer
requires
string
nonecommentfilerequired
boolean
create_task
boolean
position_ids
array<integer>
Responses
| Status | Description |
|---|---|
| 201 | Created |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.onboarding, is read-only
|
| 422 | validation_failed — Invalid parameters — see error.fields
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/hr/templates' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"name": "Replace the broken fridge seal",
"kind": "onboarding",
"description": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"color": "string",
"sections": [
{
"key": "string",
"title": "Replace the broken fridge seal"
}
]
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/templates', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Replace the broken fridge seal",
"kind": "onboarding",
"description": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"color": "string",
"sections": [
{
"key": "string",
"title": "Replace the broken fridge seal"
}
]
}),
});
const { data } = await res.json();import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/hr/templates",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"name":"Replace the broken fridge seal","kind":"onboarding","description":"Seal on fridge #2 is torn, temperature rises to +9 °C.","color":"string","sections":[{"key":"string","title":"Replace the broken fridge seal"}]},
)
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', 'hr/templates', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'name' => 'Replace the broken fridge seal',
'kind' => 'onboarding',
'description' => 'Seal on fridge #2 is torn, temperature rises to +9 °C.',
'color' => 'string',
'sections' => [
[
'key' => 'string',
'title' => 'Replace the broken fridge seal',
],
],
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_templates_create",
"arguments": {
"name": "Replace the broken fridge seal",
"kind": "onboarding",
"description": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"color": "string",
"sections": [
{
"key": "string",
"title": "Replace the broken fridge seal"
}
]
}
}
}{
"data": {
"id": 4,
"kind": "onboarding",
"name": "Barista onboarding",
"description": null,
"color": "#1f9d63",
"position_ids": [
7
],
"is_default": true,
"sections": [
{
"key": "s1",
"title": "Before the first day"
}
],
"items": [
{
"id": 31,
"section_key": "s1",
"title": "Prepare a uniform",
"description": null,
"assignee_type": "location_manager",
"assignee_id": null,
"due_offset": -1,
"requires": "none",
"required": true,
"create_task": true,
"position_ids": []
}
],
"items_count": 1,
"used": 14
}
}PUTReplace a checklist template
Saves the whole template (sections and all items). Running checklists keep their own copy of items.
| Token scope | write |
|---|---|
| Permission |
hr.onboarding |
| MCP tool | hr_templates_update |
Path parameters
id
integer
Required Request body
name
string
Required kind
string
Required onboardingoffboardingdescription
string | null
color
string | null
position_ids
array<integer>
is_default
boolean
sections
array<object>
Required key
string
Required title
string
Required items
array<object>
section_key
string
Required title
string
Required description
string | null
assignee_type
string
userpositionmanagerlocation_manageremployeeinitiatorassignee_id
integer | null
due_offset
integer
requires
string
nonecommentfilerequired
boolean
create_task
boolean
position_ids
array<integer>
Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.onboarding, 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
|
curl -X PUT 'https://app.jecheck.io/api/ext/v1/hr/templates/42' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"name": "Replace the broken fridge seal",
"kind": "onboarding",
"description": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"color": "string",
"sections": [
{
"key": "string",
"title": "Replace the broken fridge seal"
}
]
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/templates/42', {
method: 'PUT',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Replace the broken fridge seal",
"kind": "onboarding",
"description": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"color": "string",
"sections": [
{
"key": "string",
"title": "Replace the broken fridge seal"
}
]
}),
});
const { data } = await res.json();import os, requests
res = requests.put(
"https://app.jecheck.io/api/ext/v1/hr/templates/42",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"name":"Replace the broken fridge seal","kind":"onboarding","description":"Seal on fridge #2 is torn, temperature rises to +9 °C.","color":"string","sections":[{"key":"string","title":"Replace the broken fridge seal"}]},
)
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', 'hr/templates/42', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'name' => 'Replace the broken fridge seal',
'kind' => 'onboarding',
'description' => 'Seal on fridge #2 is torn, temperature rises to +9 °C.',
'color' => 'string',
'sections' => [
[
'key' => 'string',
'title' => 'Replace the broken fridge seal',
],
],
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_templates_update",
"arguments": {
"id": 42,
"name": "Replace the broken fridge seal",
"kind": "onboarding",
"description": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"color": "string",
"sections": [
{
"key": "string",
"title": "Replace the broken fridge seal"
}
]
}
}
}{
"data": {
"id": 4,
"kind": "onboarding",
"name": "Barista onboarding",
"description": null,
"color": "#1f9d63",
"position_ids": [
7
],
"is_default": true,
"sections": [
{
"key": "s1",
"title": "Before the first day"
}
],
"items": [
{
"id": 31,
"section_key": "s1",
"title": "Prepare a uniform",
"description": null,
"assignee_type": "location_manager",
"assignee_id": null,
"due_offset": -1,
"requires": "none",
"required": true,
"create_task": true,
"position_ids": []
}
],
"items_count": 1,
"used": 14
}
}POSTDuplicate a checklist template
| Token scope | write |
|---|---|
| Permission |
hr.onboarding |
| MCP tool | hr_templates_duplicate |
Path parameters
id
integer
Required Responses
| Status | Description |
|---|---|
| 201 | Created |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.onboarding, 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
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/hr/templates/42/duplicate' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/templates/42/duplicate', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
},
});
const { data } = await res.json();import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/hr/templates/42/duplicate",
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('POST', 'hr/templates/42/duplicate', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_templates_duplicate",
"arguments": {
"id": 42
}
}
}{
"data": {
"id": 4,
"kind": "onboarding",
"name": "Barista onboarding",
"description": null,
"color": "#1f9d63",
"position_ids": [
7
],
"is_default": true,
"sections": [
{
"key": "s1",
"title": "Before the first day"
}
],
"items": [
{
"id": 31,
"section_key": "s1",
"title": "Prepare a uniform",
"description": null,
"assignee_type": "location_manager",
"assignee_id": null,
"due_offset": -1,
"requires": "none",
"required": true,
"create_task": true,
"position_ids": []
}
],
"items_count": 1,
"used": 14
}
}DELDelete a checklist template
| Token scope | write |
|---|---|
| Permission |
hr.onboarding |
| MCP tool | hr_templates_delete · destructive |
Path parameters
id
integer
Required Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.onboarding, 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
|
curl -X DELETE 'https://app.jecheck.io/api/ext/v1/hr/templates/42' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/templates/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/hr/templates/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', 'hr/templates/42', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_templates_delete",
"arguments": {
"id": 42
}
}
}{
"data": {
"deleted": true
}
}GETGet HR settings
Company defaults: annual vacation days, probation months, closing the account on dismissal, custom profile fields.
| Token scope | read |
|---|---|
| Permission |
hr.card or hr.onboarding |
| MCP tool | hr_settings_get · read-only |
Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.card / hr.onboarding
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl 'https://app.jecheck.io/api/ext/v1/hr/settings' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/settings', {
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/hr/settings",
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', 'hr/settings', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_settings_get",
"arguments": {}
}
}{
"data": {
"vacation_days": 24,
"probation_months": 3,
"block_on_dismissal": true,
"custom_fields": [
{
"key": "locker",
"label": "Locker no.",
"type": "text",
"options": []
}
]
}
}PATCHUpdate HR settings
| Token scope | write |
|---|---|
| Permission |
hr.onboarding |
| MCP tool | hr_settings_update |
Request body
vacation_days
integer | null
probation_months
integer | null
block_on_dismissal
boolean
custom_fields
array<object>
key
string
label
string
Required type
string
Required textdatenumberselectoptions
array<string>
Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks hr.onboarding, is read-only
|
| 422 | validation_failed — Invalid parameters — see error.fields
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl -X PATCH 'https://app.jecheck.io/api/ext/v1/hr/settings' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"vacation_days": 42,
"probation_months": 42,
"block_on_dismissal": true,
"custom_fields": [
{
"key": "string",
"label": "string",
"type": "text"
}
]
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/hr/settings', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"vacation_days": 42,
"probation_months": 42,
"block_on_dismissal": true,
"custom_fields": [
{
"key": "string",
"label": "string",
"type": "text"
}
]
}),
});
const { data } = await res.json();import os, requests
res = requests.patch(
"https://app.jecheck.io/api/ext/v1/hr/settings",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"vacation_days":42,"probation_months":42,"block_on_dismissal":True,"custom_fields":[{"key":"string","label":"string","type":"text"}]},
)
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', 'hr/settings', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'vacation_days' => 42,
'probation_months' => 42,
'block_on_dismissal' => true,
'custom_fields' => [
[
'key' => 'string',
'label' => 'string',
'type' => 'text',
],
],
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "hr_settings_update",
"arguments": {
"vacation_days": 42,
"probation_months": 42,
"block_on_dismissal": true,
"custom_fields": [
{
"key": "string",
"label": "string",
"type": "text"
}
]
}
}
}{
"data": {
"vacation_days": 24,
"probation_months": 3,
"block_on_dismissal": true,
"custom_fields": []
}
}