List executions
GET /v1/executions — recent runs of your decisions with answers, action, reason and metrics, filtered by decision and status and paginated with a cursor. Inputs are never returned.
GET https://api.dcision.io/v1/executionsLists the executions of the API key's workspace, newest first: each run's answers, action and reason, destinations, status and error code, and metrics. Use it to monitor a deployment, export outcomes to your warehouse or calibrate thresholds against what really happened.
Inputs are never returned
The state of a run may contain personal data, so this endpoint never returns it. Workspace members can see stored inputs in the app's Executions screen.
Request
Query parameters
| Parameter | Description |
|---|---|
limit | Executions per page, 1 to 100. Default 20. |
decision | Only the executions of the decision with this slug. |
status | success or error. |
cursor | The next_cursor of the previous page, to read the next one. |
An invalid value fails with 400 INVALID_REQUEST — for example limit=1000 or a malformed cursor.
curl "https://api.dcision.io/v1/executions?decision=lead-qualification&status=error&limit=50" \
-H "Authorization: Bearer $DCISION_API_KEY"Response
{
"data": [
{
"execution_id": "exec_8HsT2kQw9ZyR4vMn1cXe",
"decision": "lead-qualification",
"version": 1,
"source": "api",
"status": "success",
"error_code": null,
"result": { "purchase_intent": 0.9412, "priority": "high", "route": "sales" },
"confidence": { "purchase_intent": 0.8824, "priority": 0.69, "route": 0.85 },
"action": "continue",
"action_reason": { "type": "default" },
"destinations": [
{ "key": "sales_crm", "type": "workflow", "status": "queued", "delivery_id": "dlv_8kJx2mQp4LzN7vR1tY6w" }
],
"metrics": { "latency_ms": 412, "engine": "jev", "model": "jev-1.13.0", "estimated_cost_usd": 0.00001575 },
"created_at": "2026-10-05T14:03:27.512Z"
},
{
"execution_id": "exec_2Lm7Qw4Xz9Tk1Rb6Vn3C",
"decision": "lead-qualification",
"version": 1,
"source": "api",
"status": "error",
"error_code": "INVALID_STATE",
"result": null,
"confidence": null,
"action": null,
"action_reason": null,
"destinations": null,
"metrics": { "latency_ms": 2, "engine": "jev", "model": null, "estimated_cost_usd": 0 },
"created_at": "2026-10-05T14:01:09.880Z"
}
],
"next_cursor": "exec_2Lm7Qw4Xz9Tk1Rb6Vn3C"
}| Field | Type | Description |
|---|---|---|
data | array | The executions of this page, newest first. |
data[].execution_id | string | The run's ID — the execution_id its response returned. |
data[].decision | string | The decision's slug. |
data[].version | integer or null | The version that ran; null for Playground runs, which use the draft. |
data[].source | string | api, webhook (a call to the decision's webhook URL) or playground. |
data[].status | string | success or error. |
data[].error_code | string or null | The error code of a failed run. |
data[].result | object or null | The answers, keyed by question. null for failed runs and when the decision's storeOutput is off. |
data[].confidence | object or null | The confidence of each answer, with the same rules as result. |
data[].action | string or null | The action returned; null for failed runs. |
data[].action_reason | object or null | Why that action was chosen. |
data[].destinations | array or null | The destination entries the run returned — replies, LLM and agent answers, functions, queued deliveries with their delivery_id, skipped destinations. null when none fired. A queued entry keeps the status it had when the run answered: the delivery's progress is in the app. |
data[].metrics | object | latency_ms, engine, model and estimated_cost_usd of the run. |
data[].created_at | string | When the run happened, ISO 8601. |
next_cursor | string or null | Pass it as cursor to read the next page; null on the last page. |
Failed runs are listed too — invalid states, engine errors — so you can see what your integration sends. A run answered with the engine-error fallback appears with status error and the engine's error code, even though the call itself returned 200.
Only executions still within your log retention are listed.
Destination entries can hold personal data
The state itself is never returned, but destinations is kept as the run returned it — whatever the decision's storeInput and storeOutput settings: function params mapped from the state, fixed replies, LLM texts and agent answers included. Map only the values your code needs into params.
Paginate
async function* executions(params = {}) {
let cursor;
do {
const query = new URLSearchParams({ limit: "100", ...params, ...(cursor ? { cursor } : {}) });
const page = await fetch(`https://api.dcision.io/v1/executions?${query}`, {
headers: { Authorization: `Bearer ${process.env.DCISION_API_KEY}` },
}).then((response) => response.json());
yield* page.data;
cursor = page.next_cursor;
} while (cursor);
}
for await (const run of executions({ decision: "voice-banking", status: "success" })) {
console.log(run.created_at, run.result?.intent, run.confidence?.intent, run.action);
}Errors
| Status | Code | When |
|---|---|---|
| 400 | INVALID_REQUEST | A query parameter is invalid: limit outside 1–100, a malformed decision slug, status or cursor. |
| 401 | INVALID_API_KEY | The key is missing, malformed, unknown or revoked. |
| 429 | RATE_LIMITED | Too many read requests in the current minute. |
GET /v1/executions shares the read rate-limit window with GET /v1/me, separate from decisions. A key only sees its own workspace's executions.
Get account and usage
GET /v1/me — the workspace, API key and plan behind a key, plus this billing period's usage. Verify a key in CI and watch your quota from code.
Webhook trigger
POST /v1/hooks/{token} — run a deployed decision from a secret URL without an API key, from forms, CRMs, Zapier, n8n, Make or any backend, optionally signed with a whsec_ secret.