GoRunner

Which past runs hold real data for ONE step

Requires scope workflow:read
GET
/api/workflows/{id}/step-sources

Lists up to 10 recent runs that actually produced data for the named step, newest first. Existence is proven per run, so a run that never reached the step — an upstream failure, a branch not taken, a version where the step did not exist — is simply not offered.

Unlike GET /api/workflows/{id}/test-context, this spans BOTH environments, because a webhook workflow may only ever have fired in production and refusing to show that run would leave the picker empty for exactly the workflows that need it most. Every row carries its environment and triggerType so you can label it.

step is the step's stable NAME (FlowAction.name). Two spellings resolve to the trigger: the literal "trigger" and the trigger's own configured name — a renamed trigger still stores its payload under the engine's trigger key, so both work.

Feed a chosen runId back into GET /api/workflows/{id}/step-sources/{runId}?step=… to fetch the data itself.

Authorization

bearerAuth
AuthorizationBearer <token>

An API token: Authorization: Bearer grt_…. Mint one in the app under Settings → Workspace → API tokens; the raw value is shown once. Scopes confine the token — see x-permission on each operation.

In: header

Path Parameters

id*string

Workflow id (UUID).

Formatuuid

Query Parameters

step*string

The step's stable name, or trigger (or the trigger's own name) for the trigger payload. Required — an empty or missing value is a 400.

Length1 <= length

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/api/workflows/497f6eca-6276-4993-bfeb-53cbbbba6f08/step-sources?step=string"
{  "data": {    "sources": [      {        "runId": "78c33d18-170c-44d3-a227-b3194f134f73",        "status": "pending",        "startedAt": "2019-08-24T14:15:22Z",        "environment": "test",        "triggerType": "string"      }    ]  }}