Which past runs hold real data for ONE step
workflow:readLists 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 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
Workflow id (UUID).
uuidQuery Parameters
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.
1 <= lengthResponse 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" } ] }}