Skip to main content
TroopyDocs
Open Troopy
Troopy

API reference / Tests and incidents

Say how bad an incident is

Keeps a look at an incident: its severity, what to do about it, and a summary that an owner understands. From a person, verdict noise also ignores an open incident until its errors grow ten times. From a teammate, it only says so, and a person ignores the incident. The QA tester calls it after it reads the incident.

post/api/v1/incidents/{number}/triage

Authorization

HeaderAuthorization: Bearer <API key>
Or the headerX-API-Key: <API key>
API keyMake one in Troopy under Settings > API keys. It acts as you, in its workspace.

Other ways to call it

CLItroopy incidents triage
MCP tooltroopy_triage_incident
Rate limit60 calls in 60 seconds, for each key
RetriesSend an Idempotency-Key header. A retry with the same key gets the first answer back, and the operation runs one time.

Path parameters

number*integer

At least 1

Body

application/json
severity*enum<string>

criticalhighmediumlow

verdict*enum<string>

fixnoisewatch

summary*string

What happened, for an owner who doesn't read code: 400 characters at most

At least 1 characters · At most 400 characters

why*string

Why that severity and that verdict: 400 characters at most

At least 1 characters · At most 400 characters

Response

200 · application/json
data*object
24 properties
number*integer

Its number in the workspace, as in Incident 14

title*string

The error and its message

culprit*string | null

Where it happens: the last frame of the app's own code, or the route

type*string | null

The type of the error, like TypeError. null for a message

level*enum<string>

fatalerrorwarninginfodebug

crash*boolean

One of its errors crashed the app: nothing caught it

status*enum<string>

ignored becomes open when its ignore runs out

openresolvedignored

regressedAt*string | null

When it came back after a person resolved it

app*object
4 properties
id*string

A 24-character id

name*string
slug*string
platform*enum<string>

websitenextjsnodepythonother

count*integer

Its errors, each counted

users*integer

The people who saw it, about

firstSeen*string

ISO 8601 date and time

lastSeen*string

ISO 8601 date and time

environments*array<string>
firstRelease*string | null
lastRelease*string | null
resolved*object | null
3 properties
by*object

Who wrote it

3 properties
type*enum<string>

personagentapi

id*string
name*string
at*string

ISO 8601 date and time

nextRelease*boolean

Resolved in the next release: only a newer release brings it back

ignored*object | null
5 properties
by*object

Who wrote it

3 properties
type*enum<string>

personagentapi

id*string
name*string
at*string

ISO 8601 date and time

until*string | null

It is open again after this time

events*integer | null

It is open again when its count reaches this

users*integer | null

It is open again when this many people saw it

last24h*array<integer>

Its errors in each of the last 24 hours, oldest first

alert*object | null

Why it needs a look, and whether a person saw it. A resolve or an ignore clears it

3 properties
why*enum<string>

newregressedescalatedspike

at*string

ISO 8601 date and time

seen*boolean
triage*object | null

The latest look of the QA tester, or of a person

6 properties
severity*enum<string>

criticalhighmediumlow

verdict*enum<string>

fixnoisewatch

summary*string

What happened, in words that an owner understands

why*string

Why that severity and that verdict

by*object

Who wrote it

3 properties
type*enum<string>

personagentapi

id*string
name*string
at*string

ISO 8601 date and time

triageDue*string | null

Since when it waits for the QA tester's look: an alert, or a person's ask

ticket*object | null

The engineering ticket that fixes it

3 properties
key*string

Like VIR-42

title*string
status*enum<string>

backlogtodoin_progressneeds_youin_reviewdonecanceled

fix*object | null

The ticket that fixed it, once that ticket went live. Then Troopy resolves the incident in the next release

5 properties
key*string

The ticket, like VIR-42

title*string
at*string

When the ticket went live

release*string | null

The first release of the app after that: the fix is in it

back*string | null

When an error of a newer release brought the incident back

Errors

400 invalid_inputFix the field named in detail. Each operation's schema is in /api/v1/openapi.json.
401 unauthorizedSend an API key as `Authorization: Bearer tr_live_...`. Create one in Troopy under Settings.
403 forbiddenThe key lacks a scope this operation needs, or its owner lacks the role. detail says which; create a key with the scope, or ask an organization owner or admin.
404 not_foundCheck the path and any id in it. Every operation is listed in /api/v1/openapi.json.
409 conflictThis Idempotency-Key was used for a different request, or that request is still running. Use a new key for a new request.
429 rate_limitedWait the number of seconds in Retry-After, then retry.