Processes & requests
Business processes (purchase, repair, refund…) with a request form and an approval route. Submit requests, see what waits for your decision, approve, return, reject, delegate, complete and track the route. Managing process definitions requires processes.manage; analytics — processes.reports.
GETList processes available for requests
Published processes the acting user may submit a request for, with the published form and a summary of the route.
| Token scope | read |
|---|---|
| Permission | Any employee; results follow the token's visibility |
| MCP tool | processes_list · read-only |
Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Plan without API access
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl 'https://app.jecheck.io/api/ext/v1/processes' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/processes', {
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/processes",
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', 'processes', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "processes_list",
"arguments": {}
}
}{
"data": [
{
"id": 7,
"name": "Purchase request",
"description": "Buying equipment and supplies",
"icon": "shopping_cart",
"color": "#5b54e8",
"prefix": "BUY",
"form": {
"title": {
"mode": "template",
"template": "{process} {number}: {f_item}"
},
"description": true,
"location": "required",
"priority": "input",
"priority_value": "medium",
"due": "input",
"sla_hours": null,
"fields": [
{
"id": "f_item",
"type": "text",
"label": "What to buy",
"required": true
},
{
"id": "f_sum",
"type": "money",
"label": "Amount",
"required": true
},
{
"id": "f_invoice",
"type": "file",
"label": "Invoice",
"required": false,
"photo": false
}
]
},
"location_ids": null,
"route": [
{
"type": "approval",
"name": "Manager approval"
},
{
"type": "task",
"name": "Purchase"
}
]
}
]
}GETRetrieve a process form
The published form of a process the acting user may submit. Field ids are the keys of values when submitting.
| Token scope | read |
|---|---|
| Permission | Any employee; results follow the token's visibility |
| MCP tool | processes_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 — Plan without API access
|
| 404 | not_found — The record does not exist or is not visible to the token
|
| 422 | validation_failed — Invalid parameters — see error.fields
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl 'https://app.jecheck.io/api/ext/v1/processes/42' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/processes/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/processes/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', 'processes/42', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "processes_get",
"arguments": {
"id": 42
}
}
}{
"data": {
"id": 7,
"name": "Purchase request",
"description": "Buying equipment and supplies",
"icon": "shopping_cart",
"color": "#5b54e8",
"prefix": "BUY",
"form": {
"title": {
"mode": "template",
"template": "{process} {number}: {f_item}"
},
"description": true,
"location": "required",
"priority": "input",
"priority_value": "medium",
"due": "input",
"sla_hours": null,
"fields": [
{
"id": "f_item",
"type": "text",
"label": "What to buy",
"required": true
},
{
"id": "f_sum",
"type": "money",
"label": "Amount",
"required": true
},
{
"id": "f_invoice",
"type": "file",
"label": "Invoice",
"required": false,
"photo": false
}
]
},
"location_ids": null,
"route": [
{
"type": "approval",
"name": "Manager approval"
},
{
"type": "task",
"name": "Purchase"
}
]
}
}POSTSubmit a request
Creates a request (a task with an approval route) by the published form. values — answers by field id. Files for file fields: multipart files[] (in MCP — objects with name and content_base64) plus file_fields[] with the field id of each file; if the form has one file field, file_fields may be omitted. Repeating the call with the same client_uuid returns the same request.
| Token scope | write |
|---|---|
| Permission | Any employee; results follow the token's visibility |
| MCP tool | processes_requests_create |
| Content type | multipart/form-data application/json |
Path parameters
id
integer
Required Request body
title
string
description
string
location_id
integer | null
due_date
date | null
priority
string
urgenthighmediumlowvalues
object
watcher_ids
array<integer>
files
array<file>
file fields.
Maximum items 10. file_fields
array<string>
files (same order).
Maximum items 10. client_uuid
uuid
Responses
| Status | Description |
|---|---|
| 201 | Created |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Read-only token
|
| 404 | not_found — The record does not exist or is not visible to the token
|
| 422 | validation_failed — Invalid parameters — see error.fields
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/processes/42/requests' \
-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.",
"location_id": 12,
"due_date": "2026-11-01"
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/processes/42/requests', {
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.",
"location_id": 12,
"due_date": "2026-11-01"
}),
});
const { data } = await res.json();import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/processes/42/requests",
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.","location_id":12,"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', 'processes/42/requests', [
'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.',
'location_id' => 12,
'due_date' => '2026-11-01',
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "processes_requests_create",
"arguments": {
"id": 42,
"title": "Replace the broken fridge seal",
"description": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"location_id": 12,
"due_date": "2026-11-01"
}
}
}{
"data": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"number": "BUY-42",
"title": "Purchase request BUY-42: coffee grinder",
"status": "approval",
"author": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"location": {
"id": 12,
"name": "Abay Ave"
},
"process": {
"id": 7,
"name": "Purchase request",
"icon": "shopping_cart",
"color": "#5b54e8"
},
"version": 3,
"state": "running",
"started_at": "2026-11-03T10:00:00+05:00",
"finished_at": null,
"values": [
{
"id": "f_item",
"label": "What to buy",
"type": "text",
"value": "Coffee grinder",
"text": "Coffee grinder",
"files": []
},
{
"id": "f_invoice",
"label": "Invoice",
"type": "file",
"value": [
77
],
"text": "1",
"files": [
{
"id": 77,
"name": "invoice.pdf",
"is_image": false,
"url": "https://app.jecheck.io/ui/tasks/files/77?signature=…"
}
]
}
],
"route": [
{
"id": 901,
"key": "s_approve",
"type": "approval",
"name": "Manager approval",
"state": "active",
"rule": "any",
"started_at": "2026-11-03T10:00:00+05:00",
"finished_at": null,
"due_at": "2026-11-04T10:00:00+05:00",
"overdue": false,
"people": [
{
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"decision": null,
"comment": null,
"decided_at": null,
"delegated_from": null
}
]
}
],
"ahead": [
{
"key": "s_buy",
"type": "task",
"name": "Purchase",
"users": [
{
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
}
]
}
],
"active_step": {
"id": 901,
"type": "approval",
"name": "Manager approval",
"rule": "any",
"mine": true,
"instructions": null,
"require_photo": false
},
"can": {
"decide": true,
"delegate": true,
"reject": true,
"comment_required": true,
"complete": false,
"resubmit": false,
"cancel": false,
"edit_values": false,
"override": false,
"move_to": false
},
"override_steps": [],
"url": "https://app.jecheck.io/ui/tasks?task=3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
}GETList requests
Requests visible to the acting user (same visibility as tasks), newest first.
| Token scope | read |
|---|---|
| Permission | Any employee; results follow the token's visibility |
| MCP tool | processes_requests_list · read-only |
Query parameters
page
integer
1. Minimum 1.
per_page
integer
25. Value 1–100.
process_id
integer
state
array<string>
mine
boolean
location_ids
array<integer>
date_from
date
date_to
date
updated_since
date-time
search
string
Responses
| Status | Description |
|---|---|
| 200 | OK — a page of results with meta |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Plan without API access
|
| 422 | validation_failed — Invalid parameters — see error.fields
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl 'https://app.jecheck.io/api/ext/v1/processes/requests?process_id=42' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/processes/requests?process_id=42', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
},
});
const { data, meta } = await res.json();import os, requests
res = requests.get(
"https://app.jecheck.io/api/ext/v1/processes/requests",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
params={"process_id":42},
)
res.raise_for_status()
data = res.json()["data"]$client = new GuzzleHttp\Client(['base_uri' => 'https://app.jecheck.io/api/ext/v1/']);
$res = $client->request('GET', 'processes/requests', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'query' => [
'process_id' => 42,
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "processes_requests_list",
"arguments": {
"process_id": 42
}
}
}{
"data": [
{
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"number": "BUY-42",
"title": "Purchase request BUY-42: coffee grinder",
"status": "approval",
"state": "running",
"process": {
"id": 7,
"name": "Purchase request"
},
"author": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"location": {
"id": 12,
"name": "Abay Ave"
},
"due_date": "2026-11-07",
"started_at": "2026-11-03T10:00:00+05:00",
"finished_at": null,
"updated_at": "2026-11-03T10:05:00+05:00",
"url": "https://app.jecheck.io/ui/tasks?task=3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
],
"meta": {
"page": 1,
"per_page": 25,
"total": 1,
"has_more": false
}
}GETList requests waiting for me
Requests where the acting user must approve or accept the active step (waiting = approval / review), or that were returned to the acting user for rework (rework).
| Token scope | read |
|---|---|
| Permission | Any employee; results follow the token's visibility |
| MCP tool | processes_approvals · read-only |
Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Plan without API access
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl 'https://app.jecheck.io/api/ext/v1/processes/approvals' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/processes/approvals', {
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/processes/approvals",
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', 'processes/approvals', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "processes_approvals",
"arguments": {}
}
}{
"data": [
{
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"number": "BUY-42",
"title": "Purchase request BUY-42: coffee grinder",
"process": {
"id": 7,
"name": "Purchase request",
"icon": "shopping_cart",
"color": "#5b54e8"
},
"waiting": "approval",
"step": "Manager approval",
"since": "2026-11-03T10:00:00+05:00",
"due_at": "2026-11-04T10:00:00+05:00",
"location": {
"id": 12,
"name": "Abay Ave"
},
"author": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
}
}
]
}GETRetrieve a request and its route
Form answers (file links valid for 1 hour), the route with decisions, the steps ahead (by current answers) and what the acting user may do now (can).
| Token scope | read |
|---|---|
| Permission | Any employee; results follow the token's visibility |
| MCP tool | processes_requests_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 — Plan without API access
|
| 404 | not_found — The record does not exist or is not visible to the token
|
| 422 | validation_failed — Invalid parameters — see error.fields
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl 'https://app.jecheck.io/api/ext/v1/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/processes/requests/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/processes/requests/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', 'processes/requests/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": "processes_requests_get",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
}
}{
"data": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"number": "BUY-42",
"title": "Purchase request BUY-42: coffee grinder",
"status": "approval",
"author": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"location": {
"id": 12,
"name": "Abay Ave"
},
"process": {
"id": 7,
"name": "Purchase request",
"icon": "shopping_cart",
"color": "#5b54e8"
},
"version": 3,
"state": "running",
"started_at": "2026-11-03T10:00:00+05:00",
"finished_at": null,
"values": [
{
"id": "f_item",
"label": "What to buy",
"type": "text",
"value": "Coffee grinder",
"text": "Coffee grinder",
"files": []
},
{
"id": "f_invoice",
"label": "Invoice",
"type": "file",
"value": [
77
],
"text": "1",
"files": [
{
"id": 77,
"name": "invoice.pdf",
"is_image": false,
"url": "https://app.jecheck.io/ui/tasks/files/77?signature=…"
}
]
}
],
"route": [
{
"id": 901,
"key": "s_approve",
"type": "approval",
"name": "Manager approval",
"state": "active",
"rule": "any",
"started_at": "2026-11-03T10:00:00+05:00",
"finished_at": null,
"due_at": "2026-11-04T10:00:00+05:00",
"overdue": false,
"people": [
{
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"decision": null,
"comment": null,
"decided_at": null,
"delegated_from": null
}
]
}
],
"ahead": [
{
"key": "s_buy",
"type": "task",
"name": "Purchase",
"users": [
{
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
}
]
}
],
"active_step": {
"id": 901,
"type": "approval",
"name": "Manager approval",
"rule": "any",
"mine": true,
"instructions": null,
"require_photo": false
},
"can": {
"decide": true,
"delegate": true,
"reject": true,
"comment_required": true,
"complete": false,
"resubmit": false,
"cancel": false,
"edit_values": false,
"override": false,
"move_to": false
},
"override_steps": [],
"url": "https://app.jecheck.io/ui/tasks?task=3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
}POSTApprove, return or reject a request
Decision of the acting user on the active approval/review step. return sends the request back to the author for rework; reject is available on approval steps. A comment may be required on reject/return (see can.comment_required).
| Token scope | write |
|---|---|
| Permission | Any employee; results follow the token's visibility |
| MCP tool | processes_requests_decide |
Path parameters
uuid
uuid
Required Request body
decision
string
Required approvereturnrejectcomment
string
Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Read-only token
|
| 404 | not_found — The record does not exist or is not visible to the token
|
| 422 | validation_failed — Invalid parameters — see error.fields
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/decide' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"decision": "approve",
"comment": "Seal on fridge #2 is torn, temperature rises to +9 °C."
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/decide', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"decision": "approve",
"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/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/decide",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"decision":"approve","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', 'processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/decide', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'decision' => 'approve',
'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": "processes_requests_decide",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"decision": "approve",
"comment": "Seal on fridge #2 is torn, temperature rises to +9 °C."
}
}
}{
"data": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"number": "BUY-42",
"title": "Purchase request BUY-42: coffee grinder",
"status": "approval",
"author": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"location": {
"id": 12,
"name": "Abay Ave"
},
"process": {
"id": 7,
"name": "Purchase request",
"icon": "shopping_cart",
"color": "#5b54e8"
},
"version": 3,
"state": "running",
"started_at": "2026-11-03T10:00:00+05:00",
"finished_at": null,
"values": [
{
"id": "f_item",
"label": "What to buy",
"type": "text",
"value": "Coffee grinder",
"text": "Coffee grinder",
"files": []
},
{
"id": "f_invoice",
"label": "Invoice",
"type": "file",
"value": [
77
],
"text": "1",
"files": [
{
"id": 77,
"name": "invoice.pdf",
"is_image": false,
"url": "https://app.jecheck.io/ui/tasks/files/77?signature=…"
}
]
}
],
"route": [
{
"id": 901,
"key": "s_approve",
"type": "approval",
"name": "Manager approval",
"state": "active",
"rule": "any",
"started_at": "2026-11-03T10:00:00+05:00",
"finished_at": null,
"due_at": "2026-11-04T10:00:00+05:00",
"overdue": false,
"people": [
{
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"decision": null,
"comment": null,
"decided_at": null,
"delegated_from": null
}
]
}
],
"ahead": [
{
"key": "s_buy",
"type": "task",
"name": "Purchase",
"users": [
{
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
}
]
}
],
"active_step": {
"id": 901,
"type": "approval",
"name": "Manager approval",
"rule": "any",
"mine": true,
"instructions": null,
"require_photo": false
},
"can": {
"decide": true,
"delegate": true,
"reject": true,
"comment_required": true,
"complete": false,
"resubmit": false,
"cancel": false,
"edit_values": false,
"override": false,
"move_to": false
},
"override_steps": [],
"url": "https://app.jecheck.io/ui/tasks?task=3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
}POSTDelegate my decision
Passes the acting user's decision on the active step to another employee (if the step allows delegation).
| Token scope | write |
|---|---|
| Permission | Any employee; results follow the token's visibility |
| MCP tool | processes_requests_delegate |
Path parameters
uuid
uuid
Required Request body
user_id
integer
Required comment
string
Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Read-only token
|
| 404 | not_found — The record does not exist or is not visible to the token
|
| 422 | validation_failed — Invalid parameters — see error.fields
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/delegate' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"user_id": 42,
"comment": "Seal on fridge #2 is torn, temperature rises to +9 °C."
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/delegate', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"user_id": 42,
"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/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/delegate",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"user_id":42,"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', 'processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/delegate', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'user_id' => 42,
'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": "processes_requests_delegate",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"user_id": 42,
"comment": "Seal on fridge #2 is torn, temperature rises to +9 °C."
}
}
}{
"data": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"number": "BUY-42",
"title": "Purchase request BUY-42: coffee grinder",
"status": "approval",
"author": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"location": {
"id": 12,
"name": "Abay Ave"
},
"process": {
"id": 7,
"name": "Purchase request",
"icon": "shopping_cart",
"color": "#5b54e8"
},
"version": 3,
"state": "running",
"started_at": "2026-11-03T10:00:00+05:00",
"finished_at": null,
"values": [
{
"id": "f_item",
"label": "What to buy",
"type": "text",
"value": "Coffee grinder",
"text": "Coffee grinder",
"files": []
},
{
"id": "f_invoice",
"label": "Invoice",
"type": "file",
"value": [
77
],
"text": "1",
"files": [
{
"id": 77,
"name": "invoice.pdf",
"is_image": false,
"url": "https://app.jecheck.io/ui/tasks/files/77?signature=…"
}
]
}
],
"route": [
{
"id": 901,
"key": "s_approve",
"type": "approval",
"name": "Manager approval",
"state": "active",
"rule": "any",
"started_at": "2026-11-03T10:00:00+05:00",
"finished_at": null,
"due_at": "2026-11-04T10:00:00+05:00",
"overdue": false,
"people": [
{
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"decision": null,
"comment": null,
"decided_at": null,
"delegated_from": null
}
]
}
],
"ahead": [
{
"key": "s_buy",
"type": "task",
"name": "Purchase",
"users": [
{
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
}
]
}
],
"active_step": {
"id": 901,
"type": "approval",
"name": "Manager approval",
"rule": "any",
"mine": true,
"instructions": null,
"require_photo": false
},
"can": {
"decide": true,
"delegate": true,
"reject": true,
"comment_required": true,
"complete": false,
"resubmit": false,
"cancel": false,
"edit_values": false,
"override": false,
"move_to": false
},
"override_steps": [],
"url": "https://app.jecheck.io/ui/tasks?task=3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
}POSTComplete the work step
Marks the active task step of the route as done; the request moves on.
| Token scope | write |
|---|---|
| Permission | Any employee; results follow the token's visibility |
| MCP tool | processes_requests_complete |
Path parameters
uuid
uuid
Required Request body
comment
string
Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Read-only token
|
| 404 | not_found — The record does not exist or is not visible to the token
|
| 422 | validation_failed — Invalid parameters — see error.fields
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/complete' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"comment": "Seal on fridge #2 is torn, temperature rises to +9 °C."
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/complete', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"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/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/complete",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"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', 'processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/complete', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'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": "processes_requests_complete",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"comment": "Seal on fridge #2 is torn, temperature rises to +9 °C."
}
}
}{
"data": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"number": "BUY-42",
"title": "Purchase request BUY-42: coffee grinder",
"status": "approval",
"author": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"location": {
"id": 12,
"name": "Abay Ave"
},
"process": {
"id": 7,
"name": "Purchase request",
"icon": "shopping_cart",
"color": "#5b54e8"
},
"version": 3,
"state": "running",
"started_at": "2026-11-03T10:00:00+05:00",
"finished_at": null,
"values": [
{
"id": "f_item",
"label": "What to buy",
"type": "text",
"value": "Coffee grinder",
"text": "Coffee grinder",
"files": []
},
{
"id": "f_invoice",
"label": "Invoice",
"type": "file",
"value": [
77
],
"text": "1",
"files": [
{
"id": 77,
"name": "invoice.pdf",
"is_image": false,
"url": "https://app.jecheck.io/ui/tasks/files/77?signature=…"
}
]
}
],
"route": [
{
"id": 901,
"key": "s_approve",
"type": "approval",
"name": "Manager approval",
"state": "active",
"rule": "any",
"started_at": "2026-11-03T10:00:00+05:00",
"finished_at": null,
"due_at": "2026-11-04T10:00:00+05:00",
"overdue": false,
"people": [
{
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"decision": null,
"comment": null,
"decided_at": null,
"delegated_from": null
}
]
}
],
"ahead": [
{
"key": "s_buy",
"type": "task",
"name": "Purchase",
"users": [
{
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
}
]
}
],
"active_step": {
"id": 901,
"type": "approval",
"name": "Manager approval",
"rule": "any",
"mine": true,
"instructions": null,
"require_photo": false
},
"can": {
"decide": true,
"delegate": true,
"reject": true,
"comment_required": true,
"complete": false,
"resubmit": false,
"cancel": false,
"edit_values": false,
"override": false,
"move_to": false
},
"override_steps": [],
"url": "https://app.jecheck.io/ui/tasks?task=3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
}POSTResubmit a returned request
The author sends a returned request again, optionally with corrected answers and title.
| Token scope | write |
|---|---|
| Permission | Any employee; results follow the token's visibility |
| MCP tool | processes_requests_resubmit |
Path parameters
uuid
uuid
Required Request body
values
object
title
string
Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Read-only token
|
| 404 | not_found — The record does not exist or is not visible to the token
|
| 422 | validation_failed — Invalid parameters — see error.fields
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/resubmit' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"values": [],
"title": "Replace the broken fridge seal"
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/resubmit', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"values": [],
"title": "Replace the broken fridge seal"
}),
});
const { data } = await res.json();import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/resubmit",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"values":[],"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', 'processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/resubmit', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'values' => [
],
'title' => 'Replace the broken fridge seal',
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "processes_requests_resubmit",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"values": [],
"title": "Replace the broken fridge seal"
}
}
}{
"data": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"number": "BUY-42",
"title": "Purchase request BUY-42: coffee grinder",
"status": "approval",
"author": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"location": {
"id": 12,
"name": "Abay Ave"
},
"process": {
"id": 7,
"name": "Purchase request",
"icon": "shopping_cart",
"color": "#5b54e8"
},
"version": 3,
"state": "running",
"started_at": "2026-11-03T10:00:00+05:00",
"finished_at": null,
"values": [
{
"id": "f_item",
"label": "What to buy",
"type": "text",
"value": "Coffee grinder",
"text": "Coffee grinder",
"files": []
},
{
"id": "f_invoice",
"label": "Invoice",
"type": "file",
"value": [
77
],
"text": "1",
"files": [
{
"id": 77,
"name": "invoice.pdf",
"is_image": false,
"url": "https://app.jecheck.io/ui/tasks/files/77?signature=…"
}
]
}
],
"route": [
{
"id": 901,
"key": "s_approve",
"type": "approval",
"name": "Manager approval",
"state": "active",
"rule": "any",
"started_at": "2026-11-03T10:00:00+05:00",
"finished_at": null,
"due_at": "2026-11-04T10:00:00+05:00",
"overdue": false,
"people": [
{
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"decision": null,
"comment": null,
"decided_at": null,
"delegated_from": null
}
]
}
],
"ahead": [
{
"key": "s_buy",
"type": "task",
"name": "Purchase",
"users": [
{
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
}
]
}
],
"active_step": {
"id": 901,
"type": "approval",
"name": "Manager approval",
"rule": "any",
"mine": true,
"instructions": null,
"require_photo": false
},
"can": {
"decide": true,
"delegate": true,
"reject": true,
"comment_required": true,
"complete": false,
"resubmit": false,
"cancel": false,
"edit_values": false,
"override": false,
"move_to": false
},
"override_steps": [],
"url": "https://app.jecheck.io/ui/tasks?task=3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
}PATCHEdit request answers
Changes answers of an open request — allowed when can.edit_values is true (the author before decisions, or processes.override).
| Token scope | write |
|---|---|
| Permission | Any employee; results follow the token's visibility |
| MCP tool | processes_requests_values |
Path parameters
uuid
uuid
Required Request body
values
object
title
string
Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Read-only token
|
| 404 | not_found — The record does not exist or is not visible to the token
|
| 422 | validation_failed — Invalid parameters — see error.fields
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl -X PATCH 'https://app.jecheck.io/api/ext/v1/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/values' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"values": [],
"title": "Replace the broken fridge seal"
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/values', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"values": [],
"title": "Replace the broken fridge seal"
}),
});
const { data } = await res.json();import os, requests
res = requests.patch(
"https://app.jecheck.io/api/ext/v1/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/values",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"values":[],"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('PATCH', 'processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/values', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'values' => [
],
'title' => 'Replace the broken fridge seal',
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "processes_requests_values",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"values": [],
"title": "Replace the broken fridge seal"
}
}
}{
"data": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"number": "BUY-42",
"title": "Purchase request BUY-42: coffee grinder",
"status": "approval",
"author": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"location": {
"id": 12,
"name": "Abay Ave"
},
"process": {
"id": 7,
"name": "Purchase request",
"icon": "shopping_cart",
"color": "#5b54e8"
},
"version": 3,
"state": "running",
"started_at": "2026-11-03T10:00:00+05:00",
"finished_at": null,
"values": [
{
"id": "f_item",
"label": "What to buy",
"type": "text",
"value": "Coffee grinder",
"text": "Coffee grinder",
"files": []
},
{
"id": "f_invoice",
"label": "Invoice",
"type": "file",
"value": [
77
],
"text": "1",
"files": [
{
"id": 77,
"name": "invoice.pdf",
"is_image": false,
"url": "https://app.jecheck.io/ui/tasks/files/77?signature=…"
}
]
}
],
"route": [
{
"id": 901,
"key": "s_approve",
"type": "approval",
"name": "Manager approval",
"state": "active",
"rule": "any",
"started_at": "2026-11-03T10:00:00+05:00",
"finished_at": null,
"due_at": "2026-11-04T10:00:00+05:00",
"overdue": false,
"people": [
{
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"decision": null,
"comment": null,
"decided_at": null,
"delegated_from": null
}
]
}
],
"ahead": [
{
"key": "s_buy",
"type": "task",
"name": "Purchase",
"users": [
{
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
}
]
}
],
"active_step": {
"id": 901,
"type": "approval",
"name": "Manager approval",
"rule": "any",
"mine": true,
"instructions": null,
"require_photo": false
},
"can": {
"decide": true,
"delegate": true,
"reject": true,
"comment_required": true,
"complete": false,
"resubmit": false,
"cancel": false,
"edit_values": false,
"override": false,
"move_to": false
},
"override_steps": [],
"url": "https://app.jecheck.io/ui/tasks?task=3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
}POSTCancel a request
The author (if the process allows it) or a user with processes.override cancels an open request.
| Token scope | write |
|---|---|
| Permission | Any employee; results follow the token's visibility |
| MCP tool | processes_requests_cancel |
Path parameters
uuid
uuid
Required Request body
reason
string
Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Read-only token
|
| 404 | not_found — The record does not exist or is not visible to the token
|
| 422 | validation_failed — Invalid parameters — see error.fields
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/cancel' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"reason": "Seal on fridge #2 is torn, temperature rises to +9 °C."
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/cancel', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"reason": "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/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/cancel",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"reason":"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', 'processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/cancel', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'reason' => '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": "processes_requests_cancel",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"reason": "Seal on fridge #2 is torn, temperature rises to +9 °C."
}
}
}{
"data": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"number": "BUY-42",
"title": "Purchase request BUY-42: coffee grinder",
"status": "approval",
"author": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"location": {
"id": 12,
"name": "Abay Ave"
},
"process": {
"id": 7,
"name": "Purchase request",
"icon": "shopping_cart",
"color": "#5b54e8"
},
"version": 3,
"state": "running",
"started_at": "2026-11-03T10:00:00+05:00",
"finished_at": null,
"values": [
{
"id": "f_item",
"label": "What to buy",
"type": "text",
"value": "Coffee grinder",
"text": "Coffee grinder",
"files": []
},
{
"id": "f_invoice",
"label": "Invoice",
"type": "file",
"value": [
77
],
"text": "1",
"files": [
{
"id": 77,
"name": "invoice.pdf",
"is_image": false,
"url": "https://app.jecheck.io/ui/tasks/files/77?signature=…"
}
]
}
],
"route": [
{
"id": 901,
"key": "s_approve",
"type": "approval",
"name": "Manager approval",
"state": "active",
"rule": "any",
"started_at": "2026-11-03T10:00:00+05:00",
"finished_at": null,
"due_at": "2026-11-04T10:00:00+05:00",
"overdue": false,
"people": [
{
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"decision": null,
"comment": null,
"decided_at": null,
"delegated_from": null
}
]
}
],
"ahead": [
{
"key": "s_buy",
"type": "task",
"name": "Purchase",
"users": [
{
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
}
]
}
],
"active_step": {
"id": 901,
"type": "approval",
"name": "Manager approval",
"rule": "any",
"mine": true,
"instructions": null,
"require_photo": false
},
"can": {
"decide": true,
"delegate": true,
"reject": true,
"comment_required": true,
"complete": false,
"resubmit": false,
"cancel": false,
"edit_values": false,
"override": false,
"move_to": false
},
"override_steps": [],
"url": "https://app.jecheck.io/ui/tasks?task=3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
}POSTSkip the active step
Intervention: skips the active step of the route. Requires processes.override for the request location.
| Token scope | write |
|---|---|
| Permission | Any employee; results follow the token's visibility |
| MCP tool | processes_requests_skip |
Path parameters
uuid
uuid
Required Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Read-only token
|
| 404 | not_found — The record does not exist or is not visible to the token
|
| 422 | validation_failed — Invalid parameters — see error.fields
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/skip' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/skip', {
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/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/skip",
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', 'processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/skip', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "processes_requests_skip",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
}
}{
"data": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"number": "BUY-42",
"title": "Purchase request BUY-42: coffee grinder",
"status": "approval",
"author": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"location": {
"id": 12,
"name": "Abay Ave"
},
"process": {
"id": 7,
"name": "Purchase request",
"icon": "shopping_cart",
"color": "#5b54e8"
},
"version": 3,
"state": "running",
"started_at": "2026-11-03T10:00:00+05:00",
"finished_at": null,
"values": [
{
"id": "f_item",
"label": "What to buy",
"type": "text",
"value": "Coffee grinder",
"text": "Coffee grinder",
"files": []
},
{
"id": "f_invoice",
"label": "Invoice",
"type": "file",
"value": [
77
],
"text": "1",
"files": [
{
"id": 77,
"name": "invoice.pdf",
"is_image": false,
"url": "https://app.jecheck.io/ui/tasks/files/77?signature=…"
}
]
}
],
"route": [
{
"id": 901,
"key": "s_approve",
"type": "approval",
"name": "Manager approval",
"state": "active",
"rule": "any",
"started_at": "2026-11-03T10:00:00+05:00",
"finished_at": null,
"due_at": "2026-11-04T10:00:00+05:00",
"overdue": false,
"people": [
{
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"decision": null,
"comment": null,
"decided_at": null,
"delegated_from": null
}
]
}
],
"ahead": [
{
"key": "s_buy",
"type": "task",
"name": "Purchase",
"users": [
{
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
}
]
}
],
"active_step": {
"id": 901,
"type": "approval",
"name": "Manager approval",
"rule": "any",
"mine": true,
"instructions": null,
"require_photo": false
},
"can": {
"decide": true,
"delegate": true,
"reject": true,
"comment_required": true,
"complete": false,
"resubmit": false,
"cancel": false,
"edit_values": false,
"override": false,
"move_to": false
},
"override_steps": [],
"url": "https://app.jecheck.io/ui/tasks?task=3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
}POSTReplace people on the active step
Intervention: replaces approvers / executors of the active step. Requires processes.override.
| Token scope | write |
|---|---|
| Permission | Any employee; results follow the token's visibility |
| MCP tool | processes_requests_reassign |
Path parameters
uuid
uuid
Required Request body
user_ids
array<integer>
Required Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Read-only token
|
| 404 | not_found — The record does not exist or is not visible to the token
|
| 422 | validation_failed — Invalid parameters — see error.fields
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/reassign' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"user_ids": [
12,
14
]
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/reassign', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"user_ids": [
12,
14
]
}),
});
const { data } = await res.json();import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/reassign",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"user_ids":[12,14]},
)
res.raise_for_status()
data = res.json()["data"]$client = new GuzzleHttp\Client(['base_uri' => 'https://app.jecheck.io/api/ext/v1/']);
$res = $client->request('POST', 'processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/reassign', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'user_ids' => [
12,
14,
],
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "processes_requests_reassign",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"user_ids": [
12,
14
]
}
}
}{
"data": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"number": "BUY-42",
"title": "Purchase request BUY-42: coffee grinder",
"status": "approval",
"author": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"location": {
"id": 12,
"name": "Abay Ave"
},
"process": {
"id": 7,
"name": "Purchase request",
"icon": "shopping_cart",
"color": "#5b54e8"
},
"version": 3,
"state": "running",
"started_at": "2026-11-03T10:00:00+05:00",
"finished_at": null,
"values": [
{
"id": "f_item",
"label": "What to buy",
"type": "text",
"value": "Coffee grinder",
"text": "Coffee grinder",
"files": []
},
{
"id": "f_invoice",
"label": "Invoice",
"type": "file",
"value": [
77
],
"text": "1",
"files": [
{
"id": 77,
"name": "invoice.pdf",
"is_image": false,
"url": "https://app.jecheck.io/ui/tasks/files/77?signature=…"
}
]
}
],
"route": [
{
"id": 901,
"key": "s_approve",
"type": "approval",
"name": "Manager approval",
"state": "active",
"rule": "any",
"started_at": "2026-11-03T10:00:00+05:00",
"finished_at": null,
"due_at": "2026-11-04T10:00:00+05:00",
"overdue": false,
"people": [
{
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"decision": null,
"comment": null,
"decided_at": null,
"delegated_from": null
}
]
}
],
"ahead": [
{
"key": "s_buy",
"type": "task",
"name": "Purchase",
"users": [
{
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
}
]
}
],
"active_step": {
"id": 901,
"type": "approval",
"name": "Manager approval",
"rule": "any",
"mine": true,
"instructions": null,
"require_photo": false
},
"can": {
"decide": true,
"delegate": true,
"reject": true,
"comment_required": true,
"complete": false,
"resubmit": false,
"cancel": false,
"edit_values": false,
"override": false,
"move_to": false
},
"override_steps": [],
"url": "https://app.jecheck.io/ui/tasks?task=3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
}POSTMove a request to another step
Intervention: returns the request to a step of the route (override_steps[].key). Requires processes.override.
| Token scope | write |
|---|---|
| Permission | Any employee; results follow the token's visibility |
| MCP tool | processes_requests_move |
Path parameters
uuid
uuid
Required Request body
step
string
Required Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Read-only token
|
| 404 | not_found — The record does not exist or is not visible to the token
|
| 422 | validation_failed — Invalid parameters — see error.fields
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/move' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"step": "string"
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/move', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"step": "string"
}),
});
const { data } = await res.json();import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/move",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"step":"string"},
)
res.raise_for_status()
data = res.json()["data"]$client = new GuzzleHttp\Client(['base_uri' => 'https://app.jecheck.io/api/ext/v1/']);
$res = $client->request('POST', 'processes/requests/3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b/move', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'step' => 'string',
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "processes_requests_move",
"arguments": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"step": "string"
}
}
}{
"data": {
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"number": "BUY-42",
"title": "Purchase request BUY-42: coffee grinder",
"status": "approval",
"author": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"location": {
"id": 12,
"name": "Abay Ave"
},
"process": {
"id": 7,
"name": "Purchase request",
"icon": "shopping_cart",
"color": "#5b54e8"
},
"version": 3,
"state": "running",
"started_at": "2026-11-03T10:00:00+05:00",
"finished_at": null,
"values": [
{
"id": "f_item",
"label": "What to buy",
"type": "text",
"value": "Coffee grinder",
"text": "Coffee grinder",
"files": []
},
{
"id": "f_invoice",
"label": "Invoice",
"type": "file",
"value": [
77
],
"text": "1",
"files": [
{
"id": 77,
"name": "invoice.pdf",
"is_image": false,
"url": "https://app.jecheck.io/ui/tasks/files/77?signature=…"
}
]
}
],
"route": [
{
"id": 901,
"key": "s_approve",
"type": "approval",
"name": "Manager approval",
"state": "active",
"rule": "any",
"started_at": "2026-11-03T10:00:00+05:00",
"finished_at": null,
"due_at": "2026-11-04T10:00:00+05:00",
"overdue": false,
"people": [
{
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"decision": null,
"comment": null,
"decided_at": null,
"delegated_from": null
}
]
}
],
"ahead": [
{
"key": "s_buy",
"type": "task",
"name": "Purchase",
"users": [
{
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
}
]
}
],
"active_step": {
"id": 901,
"type": "approval",
"name": "Manager approval",
"rule": "any",
"mine": true,
"instructions": null,
"require_photo": false
},
"can": {
"decide": true,
"delegate": true,
"reject": true,
"comment_required": true,
"complete": false,
"resubmit": false,
"cancel": false,
"edit_values": false,
"override": false,
"move_to": false
},
"override_steps": [],
"url": "https://app.jecheck.io/ui/tasks?task=3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b"
}
}GETList all processes (library)
All processes of the company including drafts and archived ones, with request counters. Requires processes.manage or processes.reports.
| Token scope | read |
|---|---|
| Permission |
processes.manage or processes.reports |
| MCP tool | processes_definitions_list · read-only |
Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks processes.manage / processes.reports
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl 'https://app.jecheck.io/api/ext/v1/processes/definitions' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/processes/definitions', {
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/processes/definitions",
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', 'processes/definitions', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "processes_definitions_list",
"arguments": {}
}
}{
"data": [
{
"id": 7,
"name": "Purchase request",
"description": "Buying equipment and supplies",
"icon": "shopping_cart",
"color": "#5b54e8",
"prefix": "BUY",
"status": "active",
"version": 3,
"has_unpublished_changes": false,
"published_at": "2026-10-20T09:00:00+05:00",
"updated_at": "2026-10-20T09:00:00+05:00",
"open_requests": 4,
"total_requests": 120,
"avg_minutes": 1440,
"overdue_steps": 1,
"fields_count": 5,
"route": [
{
"type": "approval",
"name": "Manager approval"
}
]
}
]
}GETList process templates
Ready-made processes to start from (preset in processes.definitions.create).
| Token scope | read |
|---|---|
| Permission |
processes.manage |
| MCP tool | processes_presets · read-only |
Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks processes.manage
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl 'https://app.jecheck.io/api/ext/v1/processes/presets' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/processes/presets', {
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/processes/presets",
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', 'processes/presets', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "processes_presets",
"arguments": {}
}
}{
"data": [
{
"key": "purchase",
"name": "Purchase request",
"description": "Approval and purchase",
"icon": "shopping_cart",
"color": "#5b54e8",
"fields_count": 5,
"route": [
{
"type": "approval",
"name": "Manager approval"
}
]
}
]
}GETRetrieve a process definition
Draft form, route and settings of a process, validation errors that block publishing and whether it has unpublished changes.
| Token scope | read |
|---|---|
| Permission |
processes.manage |
| MCP tool | processes_definitions_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 processes.manage
|
| 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/processes/42/definition' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/processes/42/definition', {
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/processes/42/definition",
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', 'processes/42/definition', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "processes_definitions_get",
"arguments": {
"id": 42
}
}
}{
"data": {
"id": 7,
"name": "Purchase request",
"description": "Buying equipment and supplies",
"icon": "shopping_cart",
"color": "#5b54e8",
"prefix": "BUY",
"status": "active",
"version": 3,
"has_unpublished_changes": false,
"published_at": "2026-10-20T09:00:00+05:00",
"form": {
"title": {
"mode": "template",
"template": "{process} {number}: {f_item}"
},
"description": true,
"location": "required",
"priority": "input",
"priority_value": "medium",
"due": "input",
"sla_hours": null,
"fields": [
{
"id": "f_item",
"type": "text",
"label": "What to buy",
"required": true
},
{
"id": "f_sum",
"type": "money",
"label": "Amount",
"required": true
},
{
"id": "f_invoice",
"type": "file",
"label": "Invoice",
"required": false,
"photo": false
}
]
},
"flow": {
"steps": [
{
"id": "s_approve",
"type": "approval",
"approvers": {
"kind": "manager"
},
"rule": "any",
"hours": 24
}
]
},
"settings": {
"submit": {
"mode": "all"
},
"locations": null,
"watchers": [],
"author_cancel": true,
"show_route": true
},
"errors": [],
"has_requests": true
}
}POSTCreate a process
Creates a draft process, empty or from a template. Publish it with processes.definitions.publish.
| Token scope | write |
|---|---|
| Permission |
processes.manage |
| MCP tool | processes_definitions_create |
Request body
preset
string
purchaserepairrefundwriteoffadvanceaccesstripResponses
| Status | Description |
|---|---|
| 201 | Created |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks processes.manage, 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/processes/definitions' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"preset": "purchase"
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/processes/definitions', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"preset": "purchase"
}),
});
const { data } = await res.json();import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/processes/definitions",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"preset":"purchase"},
)
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', 'processes/definitions', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'preset' => 'purchase',
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "processes_definitions_create",
"arguments": {
"preset": "purchase"
}
}
}{
"data": {
"id": 7,
"name": "Purchase request",
"description": "Buying equipment and supplies",
"icon": "shopping_cart",
"color": "#5b54e8",
"prefix": "BUY",
"status": "active",
"version": 3,
"has_unpublished_changes": false,
"published_at": "2026-10-20T09:00:00+05:00",
"form": {
"title": {
"mode": "template",
"template": "{process} {number}: {f_item}"
},
"description": true,
"location": "required",
"priority": "input",
"priority_value": "medium",
"due": "input",
"sla_hours": null,
"fields": [
{
"id": "f_item",
"type": "text",
"label": "What to buy",
"required": true
},
{
"id": "f_sum",
"type": "money",
"label": "Amount",
"required": true
},
{
"id": "f_invoice",
"type": "file",
"label": "Invoice",
"required": false,
"photo": false
}
]
},
"flow": {
"steps": [
{
"id": "s_approve",
"type": "approval",
"approvers": {
"kind": "manager"
},
"rule": "any",
"hours": 24
}
]
},
"settings": {
"submit": {
"mode": "all"
},
"locations": null,
"watchers": [],
"author_cancel": true,
"show_route": true
},
"errors": [],
"has_requests": true
}
}PUTSave a process draft
Replaces the draft definition. Requests keep using the published version until processes.definitions.publish.
| Token scope | write |
|---|---|
| Permission |
processes.manage |
| MCP tool | processes_definitions_update |
Path parameters
id
integer
Required Request body
name
string
Required description
string | null
icon
string
color
string
prefix
string
BUY → BUY-42.
Maximum length 8. form
object
Required fields (types: text, textarea, number, money, date, datetime, select, multiselect, checkbox, user, location, file, url, phone, heading, note). Same format as returned by processes.definitions.get.
flow
object
Required processes_pro.
settings
object
Required submit), available locations, default watchers, author cancel, route visibility.
Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks processes.manage, is read-only
|
| 404 | not_found — The record does not exist or is not visible to the token
|
| 422 | validation_failed — Invalid parameters — see error.fields
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl -X PUT 'https://app.jecheck.io/api/ext/v1/processes/42/definition' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"name": "Replace the broken fridge seal",
"description": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"icon": "string",
"color": "string",
"form": [],
"flow": [],
"settings": []
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/processes/42/definition', {
method: 'PUT',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Replace the broken fridge seal",
"description": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"icon": "string",
"color": "string",
"form": [],
"flow": [],
"settings": []
}),
});
const { data } = await res.json();import os, requests
res = requests.put(
"https://app.jecheck.io/api/ext/v1/processes/42/definition",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"name":"Replace the broken fridge seal","description":"Seal on fridge #2 is torn, temperature rises to +9 °C.","icon":"string","color":"string","form":[],"flow":[],"settings":[]},
)
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', 'processes/42/definition', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'name' => 'Replace the broken fridge seal',
'description' => 'Seal on fridge #2 is torn, temperature rises to +9 °C.',
'icon' => 'string',
'color' => 'string',
'form' => [
],
'flow' => [
],
'settings' => [
],
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "processes_definitions_update",
"arguments": {
"id": 42,
"name": "Replace the broken fridge seal",
"description": "Seal on fridge #2 is torn, temperature rises to +9 °C.",
"icon": "string",
"color": "string",
"form": [],
"flow": [],
"settings": []
}
}
}{
"data": {
"id": 7,
"name": "Purchase request",
"description": "Buying equipment and supplies",
"icon": "shopping_cart",
"color": "#5b54e8",
"prefix": "BUY",
"status": "active",
"version": 3,
"has_unpublished_changes": false,
"published_at": "2026-10-20T09:00:00+05:00",
"form": {
"title": {
"mode": "template",
"template": "{process} {number}: {f_item}"
},
"description": true,
"location": "required",
"priority": "input",
"priority_value": "medium",
"due": "input",
"sla_hours": null,
"fields": [
{
"id": "f_item",
"type": "text",
"label": "What to buy",
"required": true
},
{
"id": "f_sum",
"type": "money",
"label": "Amount",
"required": true
},
{
"id": "f_invoice",
"type": "file",
"label": "Invoice",
"required": false,
"photo": false
}
]
},
"flow": {
"steps": [
{
"id": "s_approve",
"type": "approval",
"approvers": {
"kind": "manager"
},
"rule": "any",
"hours": 24
}
]
},
"settings": {
"submit": {
"mode": "all"
},
"locations": null,
"watchers": [],
"author_cancel": true,
"show_route": true
},
"errors": [],
"has_requests": true
}
}POSTPublish a process
Validates and publishes the draft; new requests use the new version. Returns 422 with the list of problems if the definition is not valid.
| Token scope | write |
|---|---|
| Permission |
processes.manage |
| MCP tool | processes_definitions_publish |
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 processes.manage, is read-only
|
| 404 | not_found — The record does not exist or is not visible to the token
|
| 422 | validation_failed — Invalid parameters — see error.fields
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/processes/42/publish' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/processes/42/publish', {
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/processes/42/publish",
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', 'processes/42/publish', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "processes_definitions_publish",
"arguments": {
"id": 42
}
}
}{
"data": {
"id": 7,
"name": "Purchase request",
"description": "Buying equipment and supplies",
"icon": "shopping_cart",
"color": "#5b54e8",
"prefix": "BUY",
"status": "active",
"version": 3,
"has_unpublished_changes": false,
"published_at": "2026-10-20T09:00:00+05:00",
"form": {
"title": {
"mode": "template",
"template": "{process} {number}: {f_item}"
},
"description": true,
"location": "required",
"priority": "input",
"priority_value": "medium",
"due": "input",
"sla_hours": null,
"fields": [
{
"id": "f_item",
"type": "text",
"label": "What to buy",
"required": true
},
{
"id": "f_sum",
"type": "money",
"label": "Amount",
"required": true
},
{
"id": "f_invoice",
"type": "file",
"label": "Invoice",
"required": false,
"photo": false
}
]
},
"flow": {
"steps": [
{
"id": "s_approve",
"type": "approval",
"approvers": {
"kind": "manager"
},
"rule": "any",
"hours": 24
}
]
},
"settings": {
"submit": {
"mode": "all"
},
"locations": null,
"watchers": [],
"author_cancel": true,
"show_route": true
},
"errors": [],
"has_requests": true
}
}POSTArchive or restore a process
| Token scope | write |
|---|---|
| Permission |
processes.manage |
| MCP tool | processes_definitions_archive |
Path parameters
id
integer
Required Request body
archived
boolean
true — archive, false — restore.
Default true. Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks processes.manage, is read-only
|
| 404 | not_found — The record does not exist or is not visible to the token
|
| 422 | validation_failed — Invalid parameters — see error.fields
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/processes/42/archive' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"archived": true
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/processes/42/archive', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"archived": true
}),
});
const { data } = await res.json();import os, requests
res = requests.post(
"https://app.jecheck.io/api/ext/v1/processes/42/archive",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"archived":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', 'processes/42/archive', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'archived' => true,
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "processes_definitions_archive",
"arguments": {
"id": 42,
"archived": true
}
}
}{
"data": {
"id": 7,
"name": "Purchase request",
"description": "Buying equipment and supplies",
"icon": "shopping_cart",
"color": "#5b54e8",
"prefix": "BUY",
"status": "active",
"version": 3,
"has_unpublished_changes": false,
"published_at": "2026-10-20T09:00:00+05:00",
"form": {
"title": {
"mode": "template",
"template": "{process} {number}: {f_item}"
},
"description": true,
"location": "required",
"priority": "input",
"priority_value": "medium",
"due": "input",
"sla_hours": null,
"fields": [
{
"id": "f_item",
"type": "text",
"label": "What to buy",
"required": true
},
{
"id": "f_sum",
"type": "money",
"label": "Amount",
"required": true
},
{
"id": "f_invoice",
"type": "file",
"label": "Invoice",
"required": false,
"photo": false
}
]
},
"flow": {
"steps": [
{
"id": "s_approve",
"type": "approval",
"approvers": {
"kind": "manager"
},
"rule": "any",
"hours": 24
}
]
},
"settings": {
"submit": {
"mode": "all"
},
"locations": null,
"watchers": [],
"author_cancel": true,
"show_route": true
},
"errors": [],
"has_requests": true
}
}POSTDuplicate a process
| Token scope | write |
|---|---|
| Permission |
processes.manage |
| MCP tool | processes_definitions_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 processes.manage, is read-only
|
| 404 | not_found — The record does not exist or is not visible to the token
|
| 422 | validation_failed — Invalid parameters — see error.fields
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl -X POST 'https://app.jecheck.io/api/ext/v1/processes/42/duplicate' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/processes/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/processes/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', 'processes/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": "processes_definitions_duplicate",
"arguments": {
"id": 42
}
}
}{
"data": {
"id": 7,
"name": "Purchase request",
"description": "Buying equipment and supplies",
"icon": "shopping_cart",
"color": "#5b54e8",
"prefix": "BUY",
"status": "active",
"version": 3,
"has_unpublished_changes": false,
"published_at": "2026-10-20T09:00:00+05:00",
"form": {
"title": {
"mode": "template",
"template": "{process} {number}: {f_item}"
},
"description": true,
"location": "required",
"priority": "input",
"priority_value": "medium",
"due": "input",
"sla_hours": null,
"fields": [
{
"id": "f_item",
"type": "text",
"label": "What to buy",
"required": true
},
{
"id": "f_sum",
"type": "money",
"label": "Amount",
"required": true
},
{
"id": "f_invoice",
"type": "file",
"label": "Invoice",
"required": false,
"photo": false
}
]
},
"flow": {
"steps": [
{
"id": "s_approve",
"type": "approval",
"approvers": {
"kind": "manager"
},
"rule": "any",
"hours": 24
}
]
},
"settings": {
"submit": {
"mode": "all"
},
"locations": null,
"watchers": [],
"author_cancel": true,
"show_route": true
},
"errors": [],
"has_requests": true
}
}DELDelete a process
Only a process without requests can be deleted; otherwise archive it.
| Token scope | write |
|---|---|
| Permission |
processes.manage |
| MCP tool | processes_definitions_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 processes.manage, is read-only
|
| 404 | not_found — The record does not exist or is not visible to the token
|
| 422 | validation_failed — Invalid parameters — see error.fields
|
| 429 | rate_limited — Too many requests — retry after Retry-After seconds
|
curl -X DELETE 'https://app.jecheck.io/api/ext/v1/processes/42' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/processes/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/processes/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', 'processes/42', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "processes_definitions_delete",
"arguments": {
"id": 42
}
}
}{
"data": {
"deleted": true
}
}PUTReorder processes
| Token scope | write |
|---|---|
| Permission |
processes.manage |
| MCP tool | processes_definitions_reorder |
Request body
ids
array<integer>
Required Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks processes.manage, is read-only
|
| 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/processes/order' \
-H 'Authorization: Bearer $JECHECK_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"ids": [
12,
14
]
}'const res = await fetch('https://app.jecheck.io/api/ext/v1/processes/order', {
method: 'PUT',
headers: {
Authorization: `Bearer ${process.env.JECHECK_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"ids": [
12,
14
]
}),
});
const { data } = await res.json();import os, requests
res = requests.put(
"https://app.jecheck.io/api/ext/v1/processes/order",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
json={"ids":[12,14]},
)
res.raise_for_status()
data = res.json()["data"]$client = new GuzzleHttp\Client(['base_uri' => 'https://app.jecheck.io/api/ext/v1/']);
$res = $client->request('PUT', 'processes/order', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'json' => [
'ids' => [
12,
14,
],
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "processes_definitions_reorder",
"arguments": {
"ids": [
12,
14
]
}
}
}{
"data": {
"ok": true
}
}GETGet process analytics
Requests by state, durations (average and median), time per stage, slowest approvers, who has requests waiting, by location and by week, recent requests. Limited to the locations of processes.reports.
| Token scope | read |
|---|---|
| Permission |
processes.reports |
| Plan feature | processes_pro |
| MCP tool | processes_stats · read-only |
Path parameters
id
integer
Required Query parameters
days
integer
90. 73090365Responses
| Status | Description |
|---|---|
| 200 | OK |
| 401 | unauthorized — Missing, invalid, revoked or expired token
|
| 403 | forbidden · insufficient_scope · plan_required — Token lacks processes.reports, or the plan has no processes_pro
|
| 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/processes/42/stats?days=90' \
-H 'Authorization: Bearer $JECHECK_TOKEN'const res = await fetch('https://app.jecheck.io/api/ext/v1/processes/42/stats?days=90', {
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/processes/42/stats",
headers={"Authorization": f"Bearer {os.environ['JECHECK_TOKEN']}"},
params={"days":90},
)
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', 'processes/42/stats', [
'headers' => ['Authorization' => 'Bearer ' . getenv('JECHECK_TOKEN')],
'query' => [
'days' => 90,
],
]);
$data = json_decode($res->getBody(), true)['data'];{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "processes_stats",
"arguments": {
"id": 42,
"days": 90
}
}
}{
"data": {
"days": 90,
"total": 120,
"states": {
"done": 100,
"running": 12,
"rejected": 8
},
"avg_minutes": 1440,
"median_minutes": 900,
"overdue_steps": 1,
"rejected_share": 7,
"stages": [
{
"key": "s_approve",
"name": "Manager approval",
"type": "approval",
"count": 118,
"avg_minutes": 300,
"late": 4,
"returned": 6,
"rejected": 8
}
],
"approvers": [
{
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"count": 50,
"avg_minutes": 420,
"rejected": 3,
"returned": 2
}
],
"waiting": [
{
"user": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"count": 3,
"oldest": "2026-11-01T09:00:00+05:00"
}
],
"locations": [
{
"location": {
"id": 12,
"name": "Abay Ave"
},
"count": 40,
"open": 3
}
],
"weeks": [
{
"week": "2026-44",
"from": "2026-10-26",
"count": 9
}
],
"recent": [
{
"uuid": "3f2b8c1e-7a4d-4e2f-9b1a-6c5d4e3f2a1b",
"number": "BUY-42",
"title": "Purchase request BUY-42: coffee grinder",
"location": {
"id": 12,
"name": "Abay Ave"
},
"author": {
"id": 311,
"uuid": "1e2d3c4b-5a69-4788-9a0b-1c2d3e4f5a6b",
"name": "Aigerim Sadykova"
},
"state": "running",
"started_at": "2026-11-03T10:00:00+05:00",
"finished_at": null
}
]
}
}