get-cloudflow-flow-run
dci get-cloudflow-flow-run <flowId> <runId>
Returns a run's status and, for each node, the JSON it consumed and produced. This is how you find out why a run failed, or that it "succeeded" while producing the wrong data.
input is null for most node types, and that is not an error. Only action nodes — the
AWS, GCP, Azure, Oracle, DoiT and admin operations — record their inputs. Transform, code,
branch, switch, datastore, subflow and trigger nodes record none, so their input is
always null. output is recorded by every node that finishes, so read a transform's
behaviour from its output.
Payloads appear as soon as a node reports a terminal status, so a poll loop can read results while later nodes are still running.
Any value the node's schema marks sensitive is replaced with a redaction marker; credentials and connection configuration never appear.
Each input and output is capped at 64KB. When a payload exceeds that, whole entries
are dropped from the end, truncated is true, and totalBytes reports the untruncated
size — nothing is silently cut, and what you receive is always valid JSON.
Runs belonging to another tenant, or to a different flow, return 404. Nodes inside a
fan-out currently report only the last path to finish.
flowId— The ID of the flow the run belongs to.runId— The run identifier, as returned when the run was started.
input is null for every non-action node by design — only action nodes (cloud and DoiT
operations) record inputs. output is recorded by every node that finishes, so read a
transform or code node's behavior from its output. Payloads appear as soon as a node reaches
a terminal status, so a poll loop can read early nodes while later ones still run; each payload
is capped at 64KB (truncated: true and totalBytes when cut) and sensitive values are redacted.
Examples
# Show a run's status and where it stopped.
dci get-cloudflow-flow-run <flow-id> <run-id>
# Read what each node consumed and produced, for debugging a failed or wrong-but-green run.
dci get-cloudflow-flow-run <flow-id> <run-id> --output json
# Per-node status and error only.
dci get-cloudflow-flow-run <flow-id> <run-id> --output json | jq '.nodes[] | {name, status, error}'
Output
The run and its per-node detail.
By default dci renders the result as a table. Use --output json to get the full structure described below — see Output formats.
| Field | Type | Description |
|---|---|---|
nodes | array of object | One entry per node, in execution order. |
nodes[].nodeId | string | Node identifier, matching the node in the flow's graph. |
nodes[].name | string | Node display name. |
nodes[].status | string | Current node status. One of: "pending", "in-progress", "complete", "completed-with-errors", "failed", "rejected", "approval-timed-out", "pending-approval", "sleeping", "skipped", "stopped". |
nodes[].stepNumber | integer | Position in execution order. Absent for nodes that never started. |
nodes[].startTime | string (date-time) | |
nodes[].endTime | string (date-time) | |
nodes[].error | string | Failure message. Present when the node failed. |
nodes[].input | object | What the node consumed. Always null for non-action nodes — see the operation description. |
nodes[].input.value | array of any | The recorded JSON, always an array. Sensitive values are replaced with a redaction marker. |
nodes[].input.truncated | boolean | True when entries were dropped to fit the size cap. |
nodes[].input.totalBytes | integer | Size of the untruncated payload in bytes. |
nodes[].output | object | What the node produced. Null until the node reaches a terminal status. |
nodes[].output.value | array of any | The recorded JSON, always an array. Sensitive values are replaced with a redaction marker. |
nodes[].output.truncated | boolean | True when entries were dropped to fit the size cap. |
nodes[].output.totalBytes | integer | Size of the untruncated payload in bytes. |
id | string | |
flowId | string | |
flowName | string | |
status | string | One of: "pending", "running", "complete", "completed-with-errors", "pending-approval", "failed", "sleeping", "stopped". |
isTest | boolean | True when the run was started through actions/test-run. |
triggeredBy | string | |
triggerTime | string (date-time) | |
startTime | string (date-time) | |
endTime | string (date-time) | |
error | string | |
stoppedBy | string |
Raw JSON schema
{
"type": "object",
"description": "A run plus what each of its nodes consumed and produced.",
"required": [
"id",
"flowId",
"status",
"isTest",
"triggeredBy",
"triggerTime",
"nodes"
],
"allOf": [
{
"type": "object",
"description": "A run without its per-node detail.",
"required": [
"id",
"flowId",
"status",
"isTest",
"triggeredBy",
"triggerTime"
],
"properties": {
"id": {
"type": "string"
},
"flowId": {
"type": "string"
},
"flowName": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"pending",
"running",
"complete",
"completed-with-errors",
"pending-approval",
"failed",
"sleeping",
"stopped"
]
},
"isTest": {
"type": "boolean",
"description": "True when the run was started through `actions/test-run`."
},
"triggeredBy": {
"type": "string"
},
"triggerTime": {
"type": "string",
"format": "date-time"
},
"startTime": {
"type": "string",
"format": "date-time"
},
"endTime": {
"type": "string",
"format": "date-time"
},
"error": {
"type": "string",
"nullable": true
},
"stoppedBy": {
"type": "string",
"nullable": true
}
}
},
{
"type": "object",
"properties": {
"nodes": {
"type": "array",
"description": "One entry per node, in execution order.",
"items": {
"type": "object",
"description": "One node's contribution to a run.",
"required": [
"nodeId",
"name",
"status",
"input",
"output"
],
"properties": {
"nodeId": {
"type": "string",
"description": "Node identifier, matching the node in the flow's graph."
},
"name": {
"type": "string",
"description": "Node display name."
},
"status": {
"type": "string",
"description": "Current node status.",
"enum": [
"pending",
"in-progress",
"complete",
"completed-with-errors",
"failed",
"rejected",
"approval-timed-out",
"pending-approval",
"sleeping",
"skipped",
"stopped"
]
},
"stepNumber": {
"type": "integer",
"description": "Position in execution order. Absent for nodes that never started."
},
"startTime": {
"type": "string",
"format": "date-time"
},
"endTime": {
"type": "string",
"format": "date-time"
},
"error": {
"type": "string",
"nullable": true,
"description": "Failure message. Present when the node failed."
},
"input": {
"nullable": true,
"description": "What the node consumed. **Always null for non-action nodes** — see the operation\ndescription.",
"allOf": [
{
"type": "object",
"description": "JSON a node consumed or produced, bounded in size. Null when the node records nothing of\nthat kind — normal for `input` on any non-action node.",
"required": [
"value"
],
"properties": {
"value": {
"type": "array",
"description": "The recorded JSON, always an array. Sensitive values are replaced with a redaction\nmarker.",
"items": {}
},
"truncated": {
"type": "boolean",
"description": "True when entries were dropped to fit the size cap."
},
"totalBytes": {
"type": "integer",
"description": "Size of the untruncated payload in bytes."
}
}
}
]
},
"output": {
"nullable": true,
"description": "What the node produced. Null until the node reaches a terminal status.",
"allOf": [
{
"type": "object",
"description": "JSON a node consumed or produced, bounded in size. Null when the node records nothing of\nthat kind — normal for `input` on any non-action node.",
"required": [
"value"
],
"properties": {
"value": {
"type": "array",
"description": "The recorded JSON, always an array. Sensitive values are replaced with a redaction\nmarker.",
"items": {}
},
"truncated": {
"type": "boolean",
"description": "True when entries were dropped to fit the size cap."
},
"totalBytes": {
"type": "integer",
"description": "Size of the untruncated payload in bytes."
}
}
}
]
}
}
}
}
}
}
]
}
Errors
On failure, dci prints a single error message — with a hint when one is available — and exits with a typed code your scripts can branch on. See Errors and exit codes for the full contract.
HTTP status to exit code mapping
| HTTP status | Exit code | Error code | Meaning |
|---|---|---|---|
| 400 | 30 | VALIDATION_ERROR | The arguments or request body were rejected. Review the command's flags and payload. |
| 401 | 10 | AUTHENTICATION_FAILED | Not signed in, or the API token is invalid. Run dci login or check DCI_API_KEY. |
| 403 | 11 | PERMISSION_DENIED | The DoiT user or the active customer context does not have access. |
| 404 | 20 | RESOURCE_NOT_FOUND | The requested resource does not exist. Check the identifier argument. |
| 429 | 50 | RATE_LIMITED | Too many requests. Retryable — the CLI reports the server-provided delay. |
| 500 | 40 | API_SERVER_ERROR | The API failed to process the request. Retryable; contact DoiT support if it persists. |
Related
- list-cloudflow-flow-runs — List a flow's runs
- test-run-cloudflow-flow — Test-run a flow
- list-cloudflows — List CloudFlows
- API reference: GET /cloudflow/v1/flows/{flowId}/runs/{runId}
Aliases: getcloudflowflowrun