Skip to content

Cases (classic API)

The cases resource is the heart of the classic API: list the cases a user can see, read one, act on it, and reach its documents, notes and variables.

Paths are relative to /api/1.0/{workspace}/cases.

Listing

Route Returns
GET / The cases the caller can see
GET /paged The same, paginated
GET /draft, /participated, /unassigned, /paused One tray, with the same paged variant
GET /advanced-search, /advanced-search/paged The result of a saved filter
GET /advanced-search/filters The filters this user saved
POST /advanced-search/filter · PUT/DELETE …/:filterUid Create, update, delete a filter

The trays are also available through home/ and lists/, with counts. Prefer one of the three families in an integration: they return the same cases in different shapes, and mixing them means parsing two field sets.

The list endpoints share a set of query parameters and return 15 cases by default, sorted by case number, newest first:

Parameter Meaning
caseNumber One case number
process The process id
task The task id
limit How many to return
offset Where to start
caseTitle Text in the case title
reviewStatus READ or UNREAD: whether the assignee has opened the case

Reading a case

Route Returns
GET /:appUid The case
GET /:appUid/current-task The task it is on
GET /:appUid/tasks Every task of the case
GET /:appUid/:del_index/steps The steps of one delegation
GET /:appNumber/supervisor The supervisor of the case
GET /:appUid/sub-process-cases The cases it spawned

app_uid is the case id (APP_UID); del_index is the position of the task in the case, and both appear in every list response.

GET /:appUid answers with the case header and its open tasks:

{
  "app_uid": "36722263554ca70b82c52e8020802754",
  "app_number": "5",
  "app_name": "#5",
  "app_status": "TO_DO",
  "pro_uid": "35648267754ca36d119ecc1014698225",
  "pro_name": "Safety training course",
  "app_create_date": "2026-01-29 12:41:12",
  "current_task": [
    { "usr_uid": "…", "usr_name": "Administrator", "tas_uid": "…",
      "tas_title": "Written safety test", "del_index": 2, "del_thread_status": "OPEN" }
  ]
}

Reading a case you do not participate in requires a process permission such as the summary form or ALL.

Notes

Route Does
GET /:appUid/notes · /:appUid/notes/paged List the notes; the paged variant accepts search
POST /:appUid/note Add one

POST takes note_content — plain text, \n for a line break — and send_mail, which when set to 1 emails the note to every participant. The message is queued, not sent immediately: it leaves when the scheduler runs.

Documents

Route Does
GET /:appUid/input-documents The input documents of the case
GET /:appUid/input-document/:inp_doc_uid One definition
GET /:appUid/input-document/:app_doc_uid/file Download the file
GET /:appUid/input-document/:app_doc_uid/versions Its versions
POST /:appUid/input-document Upload
DELETE /:appUid/:del_index/input-document/:app_doc_uid Delete
GET /:appUid/output-documents The generated documents
GET /:appUid/output-document/:app_doc_uid/file Download one
POST /:appUid/:del_index/output-document/:out_doc_uid Generate one
DELETE /:appUid/output-document/:app_doc_uid Delete one

The upload takes inp_doc_uid (the definition), tas_uid (the task where the document is a step) and app_doc_comment. Generating an output document takes the del_index and the out_doc_uid — the id behind Show ID in the list of output documents.

Uploading into a variable (a file field of a form) is a separate family:

POST /:appUid/upload/:var_name
POST /:appUid/upload/:var_name/:doc_uid
POST /:appUid/upload/:var_name/:doc_uid/:app_doc_uid

The three variants add a version to an existing document instead of replacing it.

Variables

Route Does
GET /:appUid/variables Every variable of the case
PUT /:appUid/variable?del_index=N Write variables; del_index says which delegation records the change
GET /:appUid/:del_index/variable/:var_name Read one variable at that delegation
GET /:appUid/:del_index/variable/:var_name/paged Read a grid variable, paginated

del_index is the delegation index — the position of the task in the case, also exposed to the process as the system variable @%INDEX. Reading a variable per delegation is what tells you what the case held at that step, not what it holds now.

Acting on a case

Each action takes its id in the path and the rest in the body:

  • reassign-case — usr_uid_source (the current assignee) and usr_uid_target are required; the target must already be in the task's pool of users. del_index is optional and defaults to the most recent open task.
  • pause — unpaused_date in YYYY-MM-DD or YYYY-MM-DD HH:MM:SS; an empty string pauses the case indefinitely.
  • unpause — unpaused_date optional; empty or absent resumes immediately.
  • route-case — del_index optional, defaults to the highest open task. executeTriggersBeforeAssignment exists but is not recommended: it can send the case into a loop.
  • execute-trigger — the tri_uid of the trigger; it runs even when that trigger is not attached to the case's process.
  • cancel and delete — only app_uid.

A failure answers with an error object, not a bare status:

{"error": {"code": 400,
           "message": "Bad Request: This case delegation is already closed or does not exist"}}
Route Effect
PUT /:appUid/claim Assigns an unassigned case to the caller
PUT /:appUid/:usrUid/assign Assigns it to another user
PUT /:appUid/reassign-case Reassigns it
POST /reassign Reassigns in batch
PUT /:appUid/pause · /unpause Pauses and resumes
PUT /:appUid/cancel Cancels
DELETE /:appUid Deletes
PUT /:appUid/route-case Moves it to the next task
PUT /:appUid/execute-trigger/:tri_uid Runs one trigger
PUT /:appUid/execute-triggers Runs several

Routing is the one to watch: route-case moves the case to the next task without a form submission. When the step has a DynaForm, the workspace API's case-derivate is the call that stores the form and moves the case together.

Starting cases

Route Returns
GET /start-cases The tasks the caller can start
GET /bookmark-start-cases The ones they bookmarked
POST /bookmark/:tas_uid · DELETE /bookmark/:tas_uid Add or remove a bookmark
POST / Starts a case
POST /impersonate Starts it as another user

POST /cases takes the task, the user and the initial variables; the response carries the new APP_UID.

Who can start a process

Two resources answer that question without starting anything:

Route Returns
GET /project/:prj_uid/process-permissions The permission rules of the process
GET /project/:prj_uid/users The users related to the process
GET /project/:prj_uid/user/:usr_uid/starting-tasks The tasks that user can start

That last one is the practical check: an empty list means the user cannot start anything in the process, whatever the diagram says.