Skip to content

API reference

TinyConductor has two REST APIs. Start with the Orchestration API v2: it is the primary API for new clients and covers the whole engine, from deploying and starting processes to identity and tenant administration. The REST API v1 serves existing v1 clients and adds the history, analytics, audit, console and system routes.

ReferenceWhat it covers
Orchestration API v2 (primary)Process instances, deployments, process definitions, element instances, variables, user tasks, jobs, messages, signals, incidents, decisions, resources, the Embedded clock, and identity and tenant administration, under /v2/…
REST API v1The v1 surface under both /v1/… and /api/v1/…, plus history, analytics, audit, console, health, metrics and the Embedded and Bundled engine routes

Every operation has its own page, with a link you can share. Each page shows:

  • the method and path, and a ready-to-run request as cURL, JavaScript or Java (the samples call http://localhost:8080, the quickstart address);
  • Available in: the deployment modes that serve the operation;
  • Auth: whether it needs credentials, which kinds, and the action the caller must hold;
  • the parameters and request body, with an example, then the success response and, folded underneath, the error responses.

The search box finds operations by name, path or description. A running engine also serves its v1 document at GET /openapi.yaml (public). Which versions each surface is compatible with is stated in Compatibility.

All three deployment modes — Embedded, Bundled and Cluster — are served by one route layer. Every operation in both references works in every mode; the modes differ only in durability, latency, capacity and tenancy. Each operation carries x-tinyconductor-modes, which is supported for all three modes except on the short list below.

Mode-specific routes exist for one mode only:

RouteServed byWhy
GET /v1/embedded/recordsEmbeddedEvery record the in-memory test engine has written, for test assertions
POST /v1/embedded/resetEmbeddedRemoves every deployment, instance and record and sets the clock back to its fixed starting time
GET /v1/embedded/clock, POST /v1/embedded/clock/freeze, POST /v1/embedded/clock/advance-by, POST /v1/embedded/clock/advance-toEmbeddedThe virtual clock; Bundled and Cluster use the real clock
PUT /v2/clock, POST /v2/clock/resetEmbeddedThe v2-compatible form of the virtual clock

Shared routes one mode cannot serve:

RouteRefused byWhy
GET /api/v1/analytics/reportsEmbeddedReports need durable storage, which Embedded mode does not have
GET /api/v1/analytics/process-definitions/{key}/reportsEmbeddedAs above

A refused route answers 501 with the problem type urn:bpm:error:mode-not-supported, the mode in mode and the reason in detail — never a silent 404. The console (/console) is outside the API reference. So is GET /metrics: Bundled and Cluster serve it on a metrics port of its own (9090), and the API port answers 404 there.

The v2 user-task operations (/v2/user-tasks/…) are a complete task-list API: a per-user search with filters, sort and paging, a task’s form, variables and audit log, and the claim, assign, update and complete commands. Building an external task list walks through them.

Every route that reads or changes engine state needs Authorization: Bearer <token> — a static credential, a token the engine issued at /oauth/token, or an access token from your identity provider — or a signed-in console session. GET /livez, GET /healthz, GET /readyz, GET /openapi.yaml and the /auth/* endpoints are public. A principal that may act in several tenants names the tenant of each request in X-Tenant-Id. See Identity and access for roles, grants and the permission each route requires (listed per operation as x-tinyconductor-action).

An Embedded engine started without credentials is anonymous and answers local callers only; see Embedded mode.

Errors are RFC 7807 application/problem+json documents whose type is a urn:bpm:error:* URN, for example:

typeMeaning
urn:bpm:error:unauthorizedNo valid credential (401)
urn:bpm:error:forbiddenThe caller lacks the permission the route requires (403)
urn:bpm:error:not-foundNo such entity or route, or an entity the principal may not see (404)
urn:bpm:error:invalid-argumentThe request is malformed (400)
urn:bpm:error:mode-not-supportedThe route exists but this deployment mode does not serve it (501, names the mode)
urn:bpm:error:unavailableA component the route needs is not available (503)
urn:bpm:error:quota-exhaustedThe tenant reached one of its limits; detail names it. Retry after the Retry-After delay (429)
urn:bpm:error:payload-too-largeThe request is larger than the engine accepts (413)
urn:bpm:error:tenant-limit-exceededThe request goes over one of the tenant’s size limits; detail names it, and nothing was changed (413)
urn:bpm:error:backpressureThe tenant’s searches are too far behind; retry after the Retry-After delay with the same idempotency key (503)
urn:bpm:error:partition-movedThe tenant moved to another partition while the request was on its way; send it again (409)
urn:bpm:error:partition-unavailableThe tenant’s partition cannot serve at the moment (for example while it reloads); retry after the Retry-After delay with the same idempotency key (503)
urn:bpm:error:tenant-unavailableThe tenant is quarantined after a fault; an operator releases it (503)

A request that changes state may carry an Idempotency-Key header (at most 200 bytes). When its answer never arrives (a timeout, a dropped connection, a 503 saying the outcome is unknown), send the same request again with the same key. If the engine applied it the first time, the retry gets that first answer, even when the task, job or instance has moved on or finished since: completing a user task twice with one key answers 204 both times, not 404 the second time. The same key on a different request answers 409. The engine remembers a key for 24 hours by default (CONDUCTOR_DEDUP_RETENTION).

Entity keys are 64-bit integers. Responses encode them as decimal strings so that JavaScript clients keep full precision; send them back as strings.