Get one run
Returns one run with its per-step results, so a caller can see what each step produced and where a run failed.
- Method
- GET
- Path
https://api.returning.ai / v1/ workflow-builder/ data-workflows/ runs/ {runId} - Permission
- workflowBuilder
- Retries
- Safe to retry: it writes nothing.
Authentication#
- Header
Authorization: Bearer <API_KEY>- Permission
- workflowBuilder
The run is read only if it belongs to the key's community, so a run id from another community answers 404 RUN_NOT_FOUND.
| Failure | Meaning | Recovery |
|---|---|---|
403 API_KEY_PERMISSION_DENIED | No workflowBuilder | Grant the permission. |
404 RUN_NOT_FOUND | Unknown run id, or a run of another community | Use a run id from GET /{workflowId}/runs. |
Behaviour#
Credentials in the results are replaced by the redaction marker and listed in redactedPaths.
The run id is enough on its own; the route is not nested under the workflow. The lookup is still scoped to the key's community.
Request#
Path parameters#
Rule^[0-9a-fA-F]{24}$
Eg65f1a2b3c4d5e6f708192a40
Headers#
Bearer <API_KEY>.EgBearer <API_KEY>
Watch for
resultsisnullor partial for a run that did not reach every step, so treat a missing key as "did not run", not as an empty result.- Credentials inside a recorded result are replaced by
["__REDACTED__"]and named inredactedPaths. A secret an author typed into a raw body template is returned as recorded. - A result that came from a leaderboard outside the key's community is replaced by a redacted placeholder with the code
LEADERBOARD_NOT_FOUND, rather than returned. - The route works for a run of a workflow that has since been undeployed. A deleted workflow takes its runs with it.
More examples and details
{
"data": {
"_id": "65f1a2b3c4d5e6f708192a40",
"workflowId": "65f1a2b3c4d5e6f708192a3b",
"communityId": "65f1a2b3c4d5e6f708192a50",
"status": "success",
"startTime": "2026-10-24T10:02:14.000Z",
"endTime": "2026-10-24T10:02:19.000Z",
"createdAt": "2026-10-24T10:02:13.000Z",
"updatedAt": "2026-10-24T10:02:19.000Z",
"results": {
"65f1a2b3c4d5e6f708192a3c": { "status": "success", "result": { "XP": 150 } },
"65f1a2b3c4d5e6f708192a3e": { "status": "success", "result": { "branches": [{ "branchName": "XP > 100", "branchIndex": 1, "evaluation": true }, { "branchName": "Otherwise", "branchIndex": 2, "evaluation": false }] } },
"65f1a2b3c4d5e6f708192a3d": { "status": "success", "result": { "XP": 160 } },
"65f1a2b3c4d5e6f708192a3f": { "status": "skipped" }
},
"redactedPaths": []
}
}
curl --request GET \
--url 'https://api.returning.ai/v1/workflow-builder/data-workflows/runs/<runId>' \
--header 'Authorization: Bearer <API_KEY>'
Response#
HTTP 200 with the run in data. results is an object keyed by step id, so a caller can join it to the workflow's steps:
results[stepId].statusis that step's outcome:success,failorskipped.- A router's result lists every branch as
{branchName, branchIndex, evaluation}, with 1-basedbranchIndex; the write side counts branches from0. results[stepId].resultis what the step produced.- A step that did not run in this execution is absent or
skipped, depending on how the run reached it.
This is the readback for a real run: after firing a trigger, poll GET /{workflowId}/runs for the new run id and read it here. For a reward step, what settles it is this result plus the member's own field value, read through the platform API.
Eg{ ... }
Eg"65f1a2b3c4d5e6f708192a40"
Eg"65f1a2b3c4d5e6f708192a3b"
Eg"65f1a2b3c4d5e6f708192a50"
success, error, running, queued or unknown.Eg"success"
Eg"2026-10-24T10:02:14.000Z"
Eg"2026-10-24T10:02:19.000Z"
Eg"2026-10-24T10:02:13.000Z"
Eg"2026-10-24T10:02:19.000Z"
RuleNullable
Eg{ ... }
Eg[]
{
"data": {
"_id": "65f1a2b3c4d5e6f708192a40",
"workflowId": "65f1a2b3c4d5e6f708192a3b",
"communityId": "65f1a2b3c4d5e6f708192a50",
"status": "success",
"startTime": "2026-10-24T10:02:14.000Z",
"endTime": "2026-10-24T10:02:19.000Z",
"createdAt": "2026-10-24T10:02:13.000Z",
"updatedAt": "2026-10-24T10:02:19.000Z",
"results": {
"65f1a2b3c4d5e6f708192a3c": {
"status": "success",
"result": {
"Total XP": 150
}
},
"65f1a2b3c4d5e6f708192a3e": {
"status": "success",
"result": {
"branches": [
{
"branchName": "XP > 100",
"branchIndex": 1,
"evaluation": true
},
{
"branchName": "Otherwise",
"branchIndex": 2,
"evaluation": false
}
]
}
},
"65f1a2b3c4d5e6f708192a3d": {
"status": "success",
"result": {
"XP": 160
}
}
},
"redactedPaths": []
}
}
Errors#
Fix the request04
VALIDATION_FAILEDFix the requestAUTHENTICATION_REQUIREDFix the requestAPI_KEY_REQUIREDFix the requestAPI_KEY_PERMISSION_DENIEDFix the requestworkflowBuilder. Grant the permission.Fix the data01
RUN_NOT_FOUNDFix the dataRetry with backoff02
RATE_LIMITEDRetry with backoffINTERNAL_ERRORRetry with backoffRetries
Safe to retry: it writes nothing. A run that is still running can gain results between two reads, so poll while the status is transient and stop when it is success or error.
{
"meta": {
"status": "error",
"statusCode": 400,
"code": "VALIDATION_FAILED",
"errors": [
{
"path": "params.workflowId",
"message": "Id must be a 24 character hex string"
}
],
"requestId": "3f4d0e8b-7a6c-4f1e-9b2d-5a7c8e1f0a3b"
},
"message": "API request rejected error.",
"detail": "The request body is not valid.",
"solution": "Read error detail and try again."
}