Group failed runs
GET/
Groups the failed runs in a range by workflow, step and cause, still-failing first.
Needs an API token with the Read permission for runs (run:read).
Parameters
Query
workflowIdOptional · UUIDOne workflow’s runs.
environmentOptional · stringproduction(the default),testorall.windowOptional · string24h,7d,30d,90dorall(the default). Not withfromorto.
What are the rarely used parameters?
triggerTypeOptional · stringHow it began:
manual,webhook,cron,poll,error,run_finished,event,api,mcporsubflow.tagOptional · stringRuns with exactly this tag, added by the Tags app.
fromOptional · timeRuns started at or after this time (RFC 3339).
toOptional · timeRuns started before this time. After
from.
Read a group
Runs fall in one group when they failed at the same step for the same kind of reason: IDs, quoted values and numbers are taken out, an HTTP status is kept. reason is the newest one’s.
stillFailing: the workflow is live and its latest finished production run failed this way. Otherwise workedSince says when a run first worked again.
rerunnable is the runs not yet made good by a retry, and rerunIds the oldest 200 of them: send them to Run many runs again. List a group’s runs with List runs and group={key}.
Responses
- 200OK
The groups, at most 100.
A filter has a value it doesn’t take. The message names it.
- 403
FORBIDDENThe token lacks the Read permission for runs.
The groups couldn’t be read. Try again.
Any call can also answer: 401 UNAUTHORIZED · 401 TOKEN_ENDED · 403 TOKEN_SURFACE_OFF · 403 FEATURE_OFF · 403 EMBED_NOT_ALLOWED · 403 EMBED_NOT_AVAILABLE · 403 ACCOUNT_SUSPENDED · 429 RATE_LIMITED · 503 BUSY · 503 PAUSED · 503 SERVICE_UNAVAILABLE. See Errors.
Request
GORUNNER="https://api.gorunner.io"
GORUNNER_TOKEN="grt_…" # needs Read for runs
curl "$GORUNNER/api/runs/failures?window=7d" \
-H "Authorization: Bearer $GORUNNER_TOKEN"const GORUNNER = "https://api.gorunner.io";
const TOKEN = process.env.GORUNNER_TOKEN;
const res = await fetch(
`${GORUNNER}/api/runs/failures?window=7d`,
{
headers: { Authorization: `Bearer ${TOKEN}` },
},
);
const { data } = await res.json();import os, requests
GORUNNER = "https://api.gorunner.io"
TOKEN = os.environ["GORUNNER_TOKEN"]
res = requests.get(
f"{GORUNNER}/api/runs/failures",
params={"window": "7d"},
headers={"Authorization": f"Bearer {TOKEN}"},
)
data = res.json()["data"]Response · 200 OK, shortened
{
"data": {
"failed": 12,
"groupCount": 1,
"groups": [
{
"key": "gAAAAB…",
"workflowId": "3b1e5c2a-7d4f-4e8b-a1c6-5f2d9b0e7a31",
"workflowName": "Order intake",
"workflowStatus": "active",
"stepKey": "forward",
"step": "Forward to fulfilment",
"reason": "the service answered 503",
"count": 12,
"firstAt": "2026-10-23T07:10:00Z",
"lastAt": "2026-10-25T08:59:58Z",
"latestRunId": "8f0c41d2-6b7e-4c1a-9d3f-2a5b7c9e1f04",
"stillFailing": true,
"workedSince": null,
"retried": 3,
"retriedWorked": 2,
"retryOpen": 0,
"rerunnable": 10,
"rerunIds": [
"1d7f3b9e-2c4a-4e6b-8d0f-5a3c9e1b7d26",
"…"
],
"ranVersionNumber": 3,
"publishedVersionNumber": 3
}
]
}
}Every field
It takes no body.
Response · 200 OK
dataobjectfailedintegergroupCountintegergroupsarray of objectskeystringOpaque.
GET /api/runs?group={key}lists the group’s runs.workflowIdUUIDworkflowNamestringworkflowStatusstringOne of
active,paused,draft.stepKeystringAbsent when the messages name no step.
stepstringThe step’s display name (published version, else draft, else key).
reasonstringThe newest failure’s reason without the step prefix, at most 300 characters.
countintegerfirstAttimelastAttimelatestRunIdUUIDstillFailingbooleanThe workflow is live and its newest finished production run failed in this group.
workedSincetime or nullWhen not still failing: the first production run that worked after
lastAt.retriedintegerretriedWorkedintegerretryOpenintegerrerunnableintegercount - retriedWorked - retryOpen.rerunIdsarray of UUIDsThe oldest 200 rerunnable runs, oldest first.
ranVersionNumberintegerThe version the newest failure ran; absent for the draft.
publishedVersionNumberintegerpublishedAttime