Skip to main content
TroopyDocs
Open Troopy
Troopy

API reference / Tasks and projects

Change a task

Changes any of a task's fields; send only those to change. A new assignee never changes the status: a teammate starts on a task of the backlog only when its status becomes todo. Moving it out of needs_you withdraws what its teammates asked. A teammate's task set to in_progress while nothing works on it goes to the top of todo instead, and its teammate starts it at once if it is free. Canceling it cancels its open sub-tasks; done with closeSubtasks marks them done too. before puts it just above that task in its column (null: at the bottom); beforeSibling does the same for a sub-task among its parent's sub-tasks. Send the version you read to refuse the change if someone edited it since (409 stale_version).

patch/api/v1/tasks/{key}

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 tasks update
MCP tooltroopy_update_task
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

key*string

A task's key (VIR-12), its number (12) or its id

At least 1 characters · At most 40 characters

Body

application/json
titlestring

At least 1 characters · At most 200 characters

descriptionstring

At most 20000 characters

statusenum<string>

backlogtodoin_progressin_reviewdonecanceled

priorityenum<string>

noneurgenthighmediumlow

assigneestring | null

A teammate's handle (like writer), a person's user id, me for yourself, or null for nobody

projectstring | null

A project's id or name. Moving it to another project takes it off its milestone

milestonestring | null
areaenum<string>

Engineering, marketing or operations

engineeringmarketingoperations

parentstring | null
waitsOnarray<string>

The tasks that block it, all of them ([] for none)

At most 10 items

labelsarray<string>

At most 10 items

dueAtstring | null
beforestring | null
beforeSiblingstring | null

For a sub-task: put it just above this sibling among its parent's sub-tasks (null: last)

closeSubtasksboolean

With status done: its open sub-tasks are marked done too

stageenum<string> | null

An engineering ticket's step. Back to analyze or plan unlocks its plan. Forward to build approves the plan in your name. Release skips testing. Its own step starts it again from the backlog, closed or stuck. null takes it out of the flow. Only people move it

analyzeplanbuildtestrelease

planVersioninteger

With a move to build: the version of the plan that you read. If the plan changed since, the move is refused

At least 1

versioninteger

Response

200 · application/json
data*object
30 properties
id*string

A 24-character id

key*string

Its key, like VIR-12

number*integer
title*string
status*enum<string>

backlogtodoin_progressneeds_youin_reviewdonecanceled

priority*enum<string>

noneurgenthighmediumlow

assignee*object | null
3 properties
type*enum<string>

agentperson

id*string
name*string
project*object | null
2 properties
id*string

A 24-character id

name*string
milestone*object | null

The milestone of its project it counts toward

2 properties
id*string

A 24-character id

name*string
area*enum<string>

Engineering, marketing or operations. Every task is in one

engineeringmarketingoperations

parent*object | null

The task this is a sub-task of

3 properties
id*string

A 24-character id

key*string
title*string
labels*array<string>
dueAt*string | null
sortOrder*number

Its place in its board column, lowest first

subOrder*number

Its place among its parent's sub-tasks, lowest first (then by number)

waitsOn*array<object>

The tasks that block it: they must be done before it starts

4 properties
id*string

A 24-character id

key*string
title*string
status*enum<string>

backlogtodoin_progressneeds_youin_reviewdonecanceled

blocked*boolean

Something it waits on is still open, so no teammate starts it yet

progress*object

Its sub-tasks: how many are done, of those not canceled

2 properties
done*integer
total*integer
comments*integer
waiting*integer

Questions and approvals its teammates are waiting on a person for

working*object | null

A teammate is on it now, and what it says it is doing

2 properties
runId*string

A 24-character id

doing*string | null
error*string | null

Why its teammate couldn't start it; pickup tries again

pr*object | null

The pull request its code work opened on GitHub

3 properties
number*integer
url*string
state*enum<string>

openclosedmerged

flow*object | null

An engineering ticket: its step in Analyze, Plan, Build, Test and Release. null for other tasks

17 properties
stage*enum<string>

Its step: analyze, plan, build, test or release. Its status says who has it now. A released ticket is done

analyzeplanbuildtestrelease

kind*enum<string> | null

bugfeaturechange

size*enum<string> | null

How big a change the Engineer thinks it is

smallmediumlarge

repo*string | null

owner/name: the repo it changes

engineer*string | null

The Engineer's handle: it builds the ticket, and gets it back after testing

qa*string | null

The QA tester's handle, while one tests it

enteredAt*string

When it came to its step

tries*object

How many times testing sent it back to Build, of the times the workspace allows

2 properties
used*integer
max*integer
stuck*string | null

Why it waits on a person with nothing to answer: read it, then move it on or back

retry*enum<string> | null

While it is stuck: the step to move it to, to try again

analyzeplanbuildtestrelease

approve*boolean

A plan waits for a person's approval

tested*object | null

The commit that passed every gate: the only one Release merges

3 properties
sha*string
at*string

ISO 8601 date and time

verified*boolean

Troopy's own run of the repo's tests passed on this commit

refused*string | null

Why GitHub refused the last Release of the tested commit

checks*enum<string>

GitHub's checks on its change

nonependingpassfailunknown

codeReview*enum<string>

Troopy's code review of its change: a second agent reads the change for problems

nonependingpassfailunknown

tests*enum<string>

The QA tester's report on its change

nonependingpassfailunknown

screens*enum<string>

The blind critic's look at the pictures of its test run

nonependingpassfailunknown

requestedBy*object

Who it is for

3 properties
type*enum<string>

personagentapi

id*string
name*string
createdBy*object

Who wrote it

3 properties
type*enum<string>

personagentapi

id*string
name*string
createdAt*string

ISO 8601 date and time

updatedAt*string

ISO 8601 date and time

closedAt*string | null
version*integer

Send it back with a change to refuse the change if someone edited the task since

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.