For concepts, see Ticketing overview. For the workflow and form spec, see Workflows and Forms.
Authentication
Every route requires:
Form and workflow bodies (
POST/PATCH on ticket-forms and ticket-workflows, plus /validate) also accept YAML. Send Content-Type: application/yaml (or text/yaml, application/x-yaml) and keep the same top-level key (form: or workflow:).
Idempotency
Send anIdempotency-Key header to make retries safe on these routes: create, update, and delete ticket; transition; assign; unassign; remove tag; instantiate template. A retry with the same key while the first request is still running returns 409 in progress.
Permissions
Transitions also check the transition’s
permit list in the workflow. A Project member who does not match any permit gets 403 transition permit denied. See Workflows for permit values.
Rate limits
Back off on
429.
Response envelopes
Paginated lists accept
page (default 1), limit (default 10, max 200), and offset (used only when page is absent). meta contains:
Forms
Forms are versioned byname. POST with a name that already exists, or PATCH on any version, writes the next version. Older versions stay intact. A workflow require_form without a version uses the latest version.
List forms
data.items[] of form items plus data.meta.
Get form
form_id is the id of one form version.
data.item — a form item. 404 form not found if the id is not in this Project.
Create form
writes_to.kind is tag (needs tag_kind) or metadata (needs metadata_path, dotted paths allowed).
name or schema, or a bad binding, returns 400.
Update form
form.name must match the existing form (400 spec name must match existing form name).
data.item — the new version, with a new id and version incremented by one.
Delete form
{"ok": 1}
Workflows
A workflow has a stable definition (workflow_def_id, one per name) and immutable versions (id). Creating or patching writes a new version that is inactive. Activate a version before you create tickets against the definition. Only one version per definition is active.
List workflow versions
data.items[] of workflow version items plus data.meta.
Get workflow version
workflow_id is a version id.
data.item — a workflow version item.
List state labels
label value as to_label when you transition.
data.items[] of state label items. Not paginated.
Validate a workflow
{"workflow": {…}} — same as create.
data fields:
name or initial, returns 400 invalid workflow instead of a report.
Create workflow
{"workflow": {…}}. Top-level spec fields:
Full field reference: Workflows and Automation.
maintenance-request.json:
Update workflow
workflow_id is any existing version id. workflow.name must match the definition (400 workflow yaml name must match existing workflow).
Request body: {"workflow": {…}} — full spec, as in create.
data.item — the new workflow version item.
Activate workflow version
data.item with is_active: true. 400 workflow validation failed if the version’s validation_report.ok is false.
Delete workflow version
{"ok": 1}
Returns 409 when the version is active (cannot delete active workflow version), when tickets use it (workflow version is referenced by tickets), or when it has pending actions (workflow version has pending actions).
Workflow templates
Templates are platform-provided workflows (with their forms) that you install into a Project as your own editable copy. The catalog is the same for every Project.List templates
data.items[], not paginated:
Instantiate template
already_installed: true and re-creates any forms you deleted.
template_key. 409 when a workflow or form you authored already uses the template’s name.
Tickets
List tickets
fields accepts: id, org_id, project_id, workflow_version_id, state_label_id, system_class, title, body, assigned_to, assigned_group_id, opened_at, closed_at, due_at, metadata, created_by, created_at, updated_at, number, tags, state_label. An unknown name returns 400 unknown field: ….
tags and state_label are only available through fields:
tags—[{ id, ticket_id, kind, value, label, metadata, created_at }], oldest firststate_label— a state label item
Get ticket
data.item — a Ticket. 404 ticket not found.
Create ticket
Set at most one of
assigned_user_id and assigned_group_id. Unknown body fields return 400.
Update ticket
State, assignment, and tags have their own routes. Unknown fields return 400.
data.item — the updated Ticket.
Delete ticket
{"ok": 1}
Transitions
Transition a ticket
permit on the transition
Request body:
The workflow must declare a transition from the current label to
to_label.
state_label_id and system_class. Moving to a terminal label sets closed_at.
The sub-ticket check only counts children linked by a
subticket tag on the parent (value = child ticket id). The Console links sub-tickets through metadata.parent_ticket_id, which this check does not read.List transition history
data.items[] of transition records plus data.meta.
Assignment
A ticket has one user assignee (assigned_to) or one group assignee (assigned_group_id). Assigning a group clears assigned_to.
Assign a ticket
{"ok": 1, "data": {"ok": true}}
400 when both or neither field is set, when the user is not a Project member, or when the group is not in this Organization.
Unassign a ticket
{"ok": 1, "data": {"ok": true}}
→ Notifications for assignment changes: Assignment and notifications
Tags
Tags link a ticket to entities (device, asset, user, subticket, …) or carry scalar values (priority, severity, …). Entity tags must reference something that exists in the Project; a user tag must be a Project member. Read tags with GET …/tickets?fields=id,tags.
Add a tag
Remove a tag
{"ok": 1}. 404 ticket tag if the tag is not on this ticket.
Object reference
Ticket
The Console’s Due date field writes
metadata.due_at, not the top-level due_at. Only the top-level due_at drives due_policy timers.Workflow version item
Form item
State label item
Transition record
Error codes
Related
- Ticketing overview — concepts and lifecycle
- Create your first ticket — end-to-end walkthrough
- Workflows — labels, transitions, permits, guards
- Forms — JSON Schema forms and bindings
- Automation — actions, trigger intake, due policy, alarm work orders
- Troubleshooting — when calls fail