Summarize a range of runs
GET/
Summarizes the runs in a range: causes of failure, days, triggers and the busiest workflows.
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.tzOptional · stringA time zone name, such as
Europe/Berlin, for “today” and the days. Unknown or left out: UTC.
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.qOptional · stringUp to 200 characters. Finds runs whose ID starts with it, or whose workflow name or error has it, ignoring case.
reasonOptional · stringUp to 200 characters. Runs whose error has it, ignoring case.
groupOptional · stringA failure group’s
key, from Group failed runs.
Read it
byCause holds the 5 biggest failure groups (see Group failed runs), byWorkflow the 10 busiest workflows. byDay uses the days of tz.
slowerThanUsual counts finished runs that took at least slowerFactor times (3) their workflow’s usual time.
Responses
- 200OK
The summary.
A filter has a value it doesn’t take. The message names it.
- 403
FORBIDDENThe token lacks the Read permission for runs.
The summary 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
URL="$GORUNNER/api/runs/range?window=7d&tz=Europe/"
URL="${URL}Berlin"
curl "$URL" \
-H "Authorization: Bearer $GORUNNER_TOKEN"const GORUNNER = "https://api.gorunner.io";
const TOKEN = process.env.GORUNNER_TOKEN;
const res = await fetch(
`${GORUNNER}/api/runs/` +
`range?window=7d&tz=Europe/Berlin`,
{
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/range",
params={
"window": "7d",
"tz": "Europe/Berlin",
},
headers={"Authorization": f"Bearer {TOKEN}"},
)
data = res.json()["data"]Response · 200 OK, shortened
{
"data": {
"runs": 120,
"failed": 10,
"failedWorkedOnRetry": 4,
"slowerThanUsual": 2,
"slowerFactor": 3,
"byCause": [
{
"key": "gAAAAB…",
"workflowId": "3b1e5c2a-7d4f-4e8b-a1c6-5f2d9b0e7a31",
"workflowName": "Order intake",
"step": "Forward to fulfilment",
"reason": "the service answered 503",
"count": 10
}
],
"byDay": [
{
"day": "2026-10-25",
"from": "2026-10-25T00:00:00+02:00",
"runs": 15,
"failed": 1
},
"…"
],
"byTrigger": [
{
"triggerType": "webhook",
"runs": 98,
"failed": 10
}
],
"byWorkflow": [
{
"workflowId": "3b1e5c2a-7d4f-4e8b-a1c6-5f2d9b0e7a31",
"workflowName": "Order intake",
"runs": 64,
"failed": 10
}
]
}
}Every field
It takes no body.
Response · 200 OK
dataobjectrunsintegerfailedintegerfailedWorkedOnRetryintegerslowerThanUsualintegerslowerFactorintegerbyCausearray of objectsThe biggest failure groups (at most 5), biggest first.
keystringThe failure group’s
key(GET /api/runs?group={key}).workflowIdUUIDworkflowNamestringstepstringThe failed step’s display name; absent when the messages name no step.
reasonstringcountintegerbyDayarray of objectsEach local day in
tzwith runs in the range.daystringfromtimeThe day’s own start.
runsintegerfailedintegerbyTriggerarray of objectsRuns and failures by the run’s own trigger type (as
GET /api/runs?triggerType).triggerTypestringrunsintegerfailedintegerbyWorkflowarray of objectsThe 10 busiest workflows.
workflowIdUUIDworkflowNamestringrunsintegerfailedinteger