jeCheckDevelopers
Get an API key
Developers/API reference/Processes & requests

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

GET /processes

Published processes the acting user may submit a request for, with the published form and a summary of the route.

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

Responses

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Plan without API access
429rate_limited — Too many requests — retry after Retry-After seconds
Request
curl 'https://app.jecheck.io/api/ext/v1/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": {}
    }
}
Response 200
{
  "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

GET /processes/{id}

The published form of a process the acting user may submit. Field ids are the keys of values when submitting.

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

Path parameters

id integer Required
Process id.

Responses

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

POST /processes/{id}/requests

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 scopewrite
Permission Any employee; results follow the token's visibility
MCP toolprocesses_requests_create
Content typemultipart/form-data application/json

Path parameters

id integer Required
Process id.

Request body

title string
Title (when the form asks for it; otherwise generated by the template). Maximum length 512.
description string
Description (when the form has it). Maximum length 20000.
location_id integer | null
Location (required if the form says so).
due_date date | null
Due date (when the form asks for it).
priority string
Priority (when the form lets the author choose).
urgenthighmediumlow
values object
Answers: {"": value}.
watcher_ids array<integer>
Additional watchers. Maximum items 50.
files array<file>
Files for file fields. Maximum items 10.
file_fields array<string>
Field id for each file in files (same order). Maximum items 10.
client_uuid uuid
Idempotency key.

Responses

StatusDescription
201Created
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Read-only token
404not_found — The record does not exist or is not visible to the token
422validation_failed — Invalid parameters — see error.fields
429rate_limited — Too many requests — retry after Retry-After seconds
Request
curl -X POST 'https://app.jecheck.io/api/ext/v1/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"
        }
    }
}
Response 201
{
  "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

GET /processes/requests

Requests visible to the acting user (same visibility as tasks), newest first.

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

Query parameters

page integer
Page number, starting from 1. Default 1. Minimum 1.
per_page integer
Items per page (max 100). Default 25. Value 1–100.
process_id integer
Only this process.
state array<string>
Route state: running, returned, approved, done, rejected, cancelled.
mine boolean
Only requests submitted by the acting user.
location_ids array<integer>
Only these locations.
date_from date
Submitted from (inclusive).
date_to date
Submitted to (inclusive).
updated_since date-time
Only requests changed after this moment.
search string
Search in title and number. Maximum length 200.

Responses

StatusDescription
200OK — a page of results with meta
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Plan without API access
422validation_failed — Invalid parameters — see error.fields
429rate_limited — Too many requests — retry after Retry-After seconds
Request
curl 'https://app.jecheck.io/api/ext/v1/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
        }
    }
}
Response 200
{
  "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

GET /processes/approvals

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

Responses

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Plan without API access
429rate_limited — Too many requests — retry after Retry-After seconds
Request
curl 'https://app.jecheck.io/api/ext/v1/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": {}
    }
}
Response 200
{
  "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

GET /processes/requests/{uuid}

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

Path parameters

uuid uuid Required
Request (task) UUID.

Responses

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

POST /processes/requests/{uuid}/decide

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

Path parameters

uuid uuid Required
Request (task) UUID.

Request body

decision string Required
approvereturnreject
comment string
Comment. Maximum length 2000.

Responses

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

POST /processes/requests/{uuid}/delegate

Passes the acting user's decision on the active step to another employee (if the step allows delegation).

Token scopewrite
Permission Any employee; results follow the token's visibility
MCP toolprocesses_requests_delegate

Path parameters

uuid uuid Required
Request (task) UUID.

Request body

user_id integer Required
Employee to delegate to.
comment string
Comment. Maximum length 2000.

Responses

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

POST /processes/requests/{uuid}/complete

Marks the active task step of the route as done; the request moves on.

Token scopewrite
Permission Any employee; results follow the token's visibility
MCP toolprocesses_requests_complete

Path parameters

uuid uuid Required
Request (task) UUID.

Request body

comment string
Comment. Maximum length 2000.

Responses

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

POST /processes/requests/{uuid}/resubmit

The author sends a returned request again, optionally with corrected answers and title.

Token scopewrite
Permission Any employee; results follow the token's visibility
MCP toolprocesses_requests_resubmit

Path parameters

uuid uuid Required
Request (task) UUID.

Request body

values object
Corrected answers: {"": value}.
title string
Maximum length 512.

Responses

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

PATCH /processes/requests/{uuid}/values

Changes answers of an open request — allowed when can.edit_values is true (the author before decisions, or processes.override).

Token scopewrite
Permission Any employee; results follow the token's visibility
MCP toolprocesses_requests_values

Path parameters

uuid uuid Required
Request (task) UUID.

Request body

values object
Answers to change: {"": value}.
title string
Maximum length 512.

Responses

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

POST /processes/requests/{uuid}/cancel

The author (if the process allows it) or a user with processes.override cancels an open request.

Token scopewrite
Permission Any employee; results follow the token's visibility
MCP toolprocesses_requests_cancel

Path parameters

uuid uuid Required
Request (task) UUID.

Request body

reason string
Reason. Maximum length 1000.

Responses

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

POST /processes/requests/{uuid}/skip

Intervention: skips the active step of the route. Requires processes.override for the request location.

Token scopewrite
Permission Any employee; results follow the token's visibility
MCP toolprocesses_requests_skip

Path parameters

uuid uuid Required
Request (task) UUID.

Responses

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

POST /processes/requests/{uuid}/reassign

Intervention: replaces approvers / executors of the active step. Requires processes.override.

Token scopewrite
Permission Any employee; results follow the token's visibility
MCP toolprocesses_requests_reassign

Path parameters

uuid uuid Required
Request (task) UUID.

Request body

user_ids array<integer> Required
Items 1–20.

Responses

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

POST /processes/requests/{uuid}/move

Intervention: returns the request to a step of the route (override_steps[].key). Requires processes.override.

Token scopewrite
Permission Any employee; results follow the token's visibility
MCP toolprocesses_requests_move

Path parameters

uuid uuid Required
Request (task) UUID.

Request body

step string Required
Step key. Maximum length 20.

Responses

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

GET /processes/definitions

All processes of the company including drafts and archived ones, with request counters. Requires processes.manage or processes.reports.

Token scoperead
Permission processes.manage or processes.reports
MCP toolprocesses_definitions_list · read-only

Responses

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

GET /processes/presets

Ready-made processes to start from (preset in processes.definitions.create).

Token scoperead
Permission processes.manage
MCP toolprocesses_presets · read-only

Responses

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

GET /processes/{id}/definition

Draft form, route and settings of a process, validation errors that block publishing and whether it has unpublished changes.

Token scoperead
Permission processes.manage
MCP toolprocesses_definitions_get · read-only

Path parameters

id integer Required
Process id.

Responses

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

POST /processes/definitions

Creates a draft process, empty or from a template. Publish it with processes.definitions.publish.

Token scopewrite
Permission processes.manage
MCP toolprocesses_definitions_create

Request body

preset string
Template key.
purchaserepairrefundwriteoffadvanceaccesstrip

Responses

StatusDescription
201Created
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Token lacks processes.manage, is read-only
422validation_failed — Invalid parameters — see error.fields
429rate_limited — Too many requests — retry after Retry-After seconds
Request
curl -X POST 'https://app.jecheck.io/api/ext/v1/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"
        }
    }
}
Response 201
{
  "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

PUT /processes/{id}/definition

Replaces the draft definition. Requests keep using the published version until processes.definitions.publish.

Token scopewrite
Permission processes.manage
MCP toolprocesses_definitions_update

Path parameters

id integer Required
Process id.

Request body

name string Required
Process name. Maximum length 120.
description string | null
Maximum length 1000.
icon string
Material Symbols icon name. Maximum length 40.
color string
Hex color. Maximum length 9.
prefix string
Request number prefix, e.g. BUY → BUY-42. Maximum length 8.
form object Required
Request form: title mode/template, description/location/priority/due settings and 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
Route: {"steps": [...]} with step types approval, task, review, condition, notify, set, watchers, finish. Conditions and timeout actions require the paid feature processes_pro.
settings object Required
Who may submit (submit), available locations, default watchers, author cancel, route visibility.

Responses

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Token lacks processes.manage, is read-only
404not_found — The record does not exist or is not visible to the token
422validation_failed — Invalid parameters — see error.fields
429rate_limited — Too many requests — retry after Retry-After seconds
Request
curl -X PUT 'https://app.jecheck.io/api/ext/v1/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": []
        }
    }
}
Response 200
{
  "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

POST /processes/{id}/publish

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 scopewrite
Permission processes.manage
MCP toolprocesses_definitions_publish

Path parameters

id integer Required
Process id.

Responses

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

POST /processes/{id}/archive
Token scopewrite
Permission processes.manage
MCP toolprocesses_definitions_archive

Path parameters

id integer Required
Process id.

Request body

archived boolean
true — archive, false — restore. Default true.

Responses

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

POST /processes/{id}/duplicate
Token scopewrite
Permission processes.manage
MCP toolprocesses_definitions_duplicate

Path parameters

id integer Required
Process id.

Responses

StatusDescription
201Created
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Token lacks processes.manage, is read-only
404not_found — The record does not exist or is not visible to the token
422validation_failed — Invalid parameters — see error.fields
429rate_limited — Too many requests — retry after Retry-After seconds
Request
curl -X POST 'https://app.jecheck.io/api/ext/v1/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
        }
    }
}
Response 201
{
  "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

DELETE /processes/{id}

Only a process without requests can be deleted; otherwise archive it.

Token scopewrite
Permission processes.manage
MCP toolprocesses_definitions_delete · destructive

Path parameters

id integer Required
Process id.

Responses

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

PUTReorder processes

PUT /processes/order
Token scopewrite
Permission processes.manage
MCP toolprocesses_definitions_reorder

Request body

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

Responses

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

GETGet process analytics

GET /processes/{id}/stats

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 scoperead
Permission processes.reports
Plan featureprocesses_pro
MCP toolprocesses_stats · read-only

Path parameters

id integer Required
Process id.

Query parameters

days integer
Period, days. Default 90.
73090365

Responses

StatusDescription
200OK
401unauthorized — Missing, invalid, revoked or expired token
403forbidden · insufficient_scope · plan_required — Token lacks processes.reports, or the plan has no processes_pro
404not_found — The record does not exist or is not visible to the token
422validation_failed — Invalid parameters — see error.fields
429rate_limited — Too many requests — retry after Retry-After seconds
Request
curl 'https://app.jecheck.io/api/ext/v1/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
        }
    }
}
Response 200
{
  "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
      }
    ]
  }
}