Skip to main content
TroopyDocs
Open Troopy
Troopy

API reference / Tests and incidents

Make a bug ticket of a problem that the QA tester found

Makes an engineering bug ticket of a problem that the QA tester found. The ticket has the problem's title, what the QA tester expected and saw, its steps, its place in the code and a link to the report. The Engineer takes it from Analyze. One ticket for each problem: a second call gives back the first. A problem in the test run of an engineering ticket belongs to that ticket.

post/api/v1/test-runs/{id}/findings/{finding}/ticket

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 tests file
MCP tooltroopy_file_test_finding
Rate limit20 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

id*string

A 24-character id

finding*string

A problem of the run: f1, f2 and so on across its parts

Response

201 · application/json
data*object
2 properties
run*object
21 properties
id*string

A 24-character id

kind*enum<string>

ticket: a change. review: Troopy's code review of a change. screens: the blind critic's look at the pictures of a change. cases: tests of the library. explore: a look for problems. first_users: the QA tester tries it as 5 kinds of new user. check: whether the place loads

ticketreviewscreenscasesexplorefirst_userscheck

status*enum<string>

queuedrunningdonecanceled

waitingFor*enum<string> | null

In the queue: a QA tester to hire, one of the workspace's 2 places, the computer, a release that reaches Production, or a Claude plan that is out of usage

qaslotcomputerdeployplan

verdict*enum<string> | null

When done: fail when a part failed, blocked when a part couldn't be checked, pass only when each part passed

passfailblocked

error*string | null

Why it ended early: its place didn't load or is gone, or its ticket moved on

environment*object | null

The place, as it was when the run started: a place to test, or a preview of a ticket's change. Null when it reads only the code of the change

4 properties
id*string | null

Null for the preview of a ticket's change, which is no place of the workspace

name*string
kind*enum<string>

productionstagingpreview

url*string
note*string | null

What Troopy noted on the way, like a preview that didn't load

ticket*object | null

The engineering ticket whose change it tests: its key, its pull request, and the commit tested

5 properties
id*string

A 24-character id

key*string
repo*string
pr*integer
sha*string
progress*object

Its parts: one for each test, or one for a ticket or a look

2 properties
done*integer
total*integer
trigger*enum<string> | null

schedule: its place's schedule started it. release: a release started it. null: a person, the API or a ticket

schedulerelease

release*object | null

A check after a release: the tickets that the release took live

1 properties
tickets*array<object>
2 properties
id*string

A 24-character id

key*string
replayed*integer

Parts that replayed a test's recording whole, with no AI

replaying*boolean

Troopy replays a part now, with no AI

createdBy*object

Who wrote it

3 properties
type*enum<string>

personagentapi

id*string
name*string
createdAt*string

ISO 8601 date and time

finishedAt*string | null
parts*array<object>
11 properties
title*string
test*string | null

The test of the library that it ran

how*enum<string> | null

qa: the QA tester tested it. replay: Troopy replayed the test's recording with no AI. takeover: a replay stopped, and the QA tester went on

qareplaytakeover

from*string | null

A takeover: the step where the replay stopped

stop*string | null

A takeover: why the replay stopped

provider*string | null

A code review of a council: the AI provider of the plan that reads this part

reviewer*string | null

A code review of a council: the agent that reads this part, as Grok or Claude Opus 5.5

status*enum<string>

queuedrunningdone

verdict*enum<string> | null

passfailblocked

checks*array<object>
2 properties
id*string
text*string
report*object | null
6 properties
summary*string

Troopy's line on what was checked

note*string

The QA tester's own words

results*array<object>
5 properties
id*string
status*enum<string>

passfailskip

observed*string
pictures*array<string>
proof*enum<string> | null

How a pass was proved: the browser saw the words, a picture, or only a read of the code

seenpicturecode

findings*array<object>
13 properties
id*string

A problem of the run: f1, f2 and so on across its parts

severity*enum<string>

blockermajorminornit

source*enum<string>

reviewtestexplore

title*string
expected*string
observed*string
steps*array<string>
check*string | null
path*string | null
line*integer | null
pictures*array<string>
status*enum<string>

openticketdismissed

ticket*object | null

The bug ticket that a person made of it

2 properties
id*string

A 24-character id

key*string
by*string | null
at*string | null
pictures*array<object>

What the QA tester's browser saw. Never sent to a model

5 properties
n*integer
url*string

Served to callers that read tests

part*integer

The part that took it, by its place in parts; -1 for the first look at the place

step*string | null
by*enum<string>

checkscreenshot

ranked*array<object> | null

A run of first users: its problems as one list, the worst first. Problems that read alike are one

2 properties
finding*string

A problem of the run: f1, f2 and so on across its parts

users*array<string>

Who hit it

picturesGone*boolean

Troopy deleted its pictures. A run that passed keeps them 7 days

ticket*object
2 properties
id*string

A 24-character id

key*string

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.