Record a result
/api/v1/resultsKey role tester or aboveRecords a result for one check on one platform, replacing whatever was recorded there before. The response says what the grid now shows — which is not always what you sent.
Body
checkstringrequired- The check's ref (
AUTH-01) withapp, or its id alone. appstring- App id or name. Required when
checkis a ref or title. sectionstring- Section id, ref or title, to settle a title more than one section uses.
platformstringrequired- A platform code the app has, e.g.
WL. A check marked N/A there answers400. resultstringrequiredpass,fail, orretest— which clears the recorded result and puts the check back in the queue.
curl -X POST "https://qarunbook.com/api/v1/results" \
-H "Authorization: Bearer $QARUNBOOK_KEY" \
-H "Content-Type: application/json" \
-d '{
"app": "Checkout",
"check": "AUTH-01",
"platform": "IOS",
"result": "pass"
}'{
"data": {
"check": {
"id": "mfq3k2qa7bc",
"ref": "AUTH-01",
"title": "Sign in with email and password"
},
"app": {
"id": "mfq3k2p9x1a",
"name": "Checkout"
},
"platform": "IOS",
"result": "pass",
"status": "passed",
"recorded_by": "CI · nightly via API",
"recorded_at": "2026-09-28T02:14:51.260Z"
}
}List results
/api/v1/resultsKey role viewer or aboveThe results recorded now, most recently recorded first. Paged — see Pagination. For a dashboard, a report, or a poller such as Zapier that acts on each new result.
The runbook keeps one result per check per platform, so this is the current state, not an audit log: recording again replaces the row, and retest removes it. Each row's id includes the time it was recorded, so a result recorded again comes back with a new id.
Query parameters
appstring- App id or name. Leave out for every app this key can reach.
checkstring- Only results on this check — its id, or its ref together with
app. platformstring- Only results on this platform code, e.g.
IOS. resultstringpass,failorall(default).limitinteger- 1–200, default 50.
cursorstring- From the previous page's
next_cursor.
curl "https://qarunbook.com/api/v1/results?app=Checkout&result=fail" \
-H "Authorization: Bearer $QARUNBOOK_KEY"{
"data": [
{
"id": "mfq3k2p9x1a|mfq3k2qa7bc|WL|2026-09-28T02:14:51.260Z",
"app": {
"id": "mfq3k2p9x1a",
"name": "Checkout"
},
"check": {
"id": "mfq3k2qa7bc",
"ref": "AUTH-01",
"title": "Sign in with email and password"
},
"platform": "WL",
"result": "fail",
"status": "failed",
"recorded_by": "CI · nightly via API",
"recorded_at": "2026-09-28T02:14:51.260Z"
}
],
"next_cursor": null
}Result fields
idstringapp|check|platform|recorded_at. Unique per recording, so safe to deduplicate on.resultstring- What was recorded:
passorfail. statusstring- What the grid shows for it now —
failedunder an open issue,retestafter a later fix. recorded_bystring- The tester's name, or
<key name> via API.
What the grid shows
Status is derived, never stored, so a result is one input among several. Three cases are worth knowing before you build on this:
- An open issue wins. Record a pass on a platform with an open issue and the response answers
status: "failed"with anote. The pass is kept, and shows once the issue is fixed. - A fix asks for a retest. After an issue is marked fixed, the platforms it affected read
retestuntil a result is recorded — which is exactly what a CI run after the deploy should send. - Retest clears.
result: "retest"removes the recorded result. The check readsuntested, orretestif a fix is still waiting to be confirmed.
Results are attributed to the key — CI · nightly via API — so anyone reading the grid can tell a machine's pass from a person's.