Evaluation and History
DMN evaluations are synchronous: you POST an input context, the engine runs the decision graph, and you get back the per-decision results in the response. Every evaluation is recorded so you can inspect what happened later.
The evaluate API
There are two equivalent endpoints. The body is the same; only the way you address the definition differs.
Evaluate by platform UUID
POST /projects/{projectID}/dmn/definitions/{definitionID}/evaluate
definitionID here is the platform UUID of a specific stored version. Use this when you've pinned to a version on purpose.
Evaluate by DMN definitions id
POST /projects/{projectID}/dmn/definitions/by-definitions-id/{definitionsID}/evaluate
definitionsID is the value of the <definitions id="…"> attribute in your DMN XML. Resolves to the latest version of that definition by default; pass an explicit version in the body to pin.
This is the right endpoint for callers that know decisions by their model-level identifier — for example, a frontend that hard-codes the definitions id and always wants the latest deployed logic.
Request body
{
"context": { "customerAge": 42, "annualIncome": 85000 },
"decisions": ["Eligibility"],
"version": 3
}
| Field | Required | Notes |
|---|---|---|
context | yes | The input scope. A FEEL context — keys are variable names, values are FEEL-typed (number, string, boolean, list, nested context) |
decisions | no | Names of decisions to evaluate. If empty, all decisions in the definition are evaluated |
decisionServices | no | Names of decision services to evaluate. If empty, no decision services are evaluated |
version | no | Pin to a specific version. Defaults to the latest |
The interaction between decisions and decisionServices is intentional: leaving both empty runs every decision but no services. If you want to invoke a decision service, name it explicitly.
Response shape
The response is a map keyed by decision name. Each value is an EvaluationResult:
{
"Eligibility": {
"decisionID": "decision_eligibility",
"name": "Eligibility",
"type": "DECISION",
"value": { "eligible": true, "tier": "gold" },
"hitRules": [
{ "ruleID": "rule_3", "outputs": { "eligible": true, "tier": "gold" } }
],
"dependencies": [
{
"decisionID": "decision_score",
"name": "Score",
"type": "DECISION",
"value": 720
}
],
"error": null
}
}
| Field | Notes |
|---|---|
decisionID | The decision's XML id |
name | Human-readable name |
type | DECISION, DECISION_SERVICE, BKM, or INPUT_DATA |
value | The FEEL value the decision produced. Shape depends on the decision's output type |
hitRules | For decision tables: which rules matched, and what each rule output. Empty for other expression types |
dependencies | The upstream decisions that this evaluation pulled in — the dependency tree of the result. Useful for tracing why a decision came out the way it did |
error | Error message if this decision failed to evaluate. null on success |
When a single decision in the graph errors, the engine still returns a response — the failed decision carries error, and decisions that depended on it propagate the failure. The HTTP status itself is 200 unless the request body was malformed.
Example
curl -X POST "$API/projects/$PROJECT/dmn/definitions/by-definitions-id/$DEFINITIONS_ID/evaluate" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"context": {
"applicant": { "age": 42, "income": 85000 },
"loanAmount": 25000
},
"decisions": ["Eligibility", "Pricing"]
}'
For authentication, see Authentication.
Calling decisions from a BPMN process
A BPMN business-rule task invokes a stored decision directly — no HTTP round-trip. The quantum:calledDecision decisionId="…" extension expects a decision XML id from the DMN Decisions list.
The runtime is the same engine; the only difference is that the BPMN side reads the input context from the process variables (after I/O input mapping) and writes the result into a process variable named by resultVariable.
Execution history
Every evaluation — whether it came in via the API or from a BPMN business-rule task — is recorded.
What's stored per execution
| Field | Description |
|---|---|
| Execution ID | Unique identifier of this evaluation |
| Definition ID | Platform UUID of the version that ran |
| Definitions ID | The <definitions id>, useful for grouping across versions |
| Inputs | The full input context |
| Outputs | The result FEEL value |
| Executed by | User or service account that issued the call |
| Executed at | Timestamp |
Retention depends on subscription tier. See Subscriptions for the limits that apply to your plan.
The Executions view
Open DMN Executions from the navigation. The view is a chronological list across all definitions in the project, with columns:
| Column | Description |
|---|---|
| Executed by | User or service account |
| Definitions ID | The <definitions id> of the model that ran |
| Executed at | Timestamp |
A filter input at the top narrows the list to a single definitionsID. The list paginates; default 20 per page.
API access
| Endpoint | Use |
|---|---|
GET /projects/{projectID}/dmn/executions | Project-wide execution list. Filter by definitionsID, paginate |
GET /projects/{projectID}/dmn/definitions/{definitionID}/executions | Executions for one specific definition version (by platform UUID) |
GET /projects/{projectID}/dmn/executions/{executionID} | Single execution detail — the inputs, outputs, and per-decision results |
The single-execution detail endpoint returns the full EvaluationResult tree as it was at evaluation time, so you can reproduce why a decision came out the way it did.
Where it fits
- Building an integration that calls decisions from outside? Use the evaluate API with authentication.
- Wiring a decision into a BPMN process? See the business-rule task.
- Investigating a past decision? Open the Executions view, or fetch the execution by ID.