Skip to main content
TroopyDocs
Open Troopy
Troopy

API reference / Tasks and projects

Create a task

Adds a task. Leave assignee out and it goes to the one teammate of its area, when the area has exactly one, or else to the Chief of Staff, who passes it to the right teammate; set it to null to leave it in the backlog. A new task for a teammate is queued (todo) and the teammate starts it. A new task for a person starts in the backlog. Send status to choose: a task that starts in progress, in review, done or canceled moves there as a move on the board does, so a teammate's task in progress waits at the top of To do. Give parent to make it a sub-task (one level only), and waitsOn to have it wait until other tasks are done, such as sibling sub-tasks (research, then write).

post/api/v1/tasks

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 create
MCP tooltroopy_create_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.

Body

application/json
title*string

At least 1 characters · At most 200 characters

descriptionstring

Markdown: the goal, the steps, what done looks like

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

milestonestring | null
areaenum<string>

Engineering, marketing or operations. Left out: the area of its parent, then of its teammate, then operations

engineeringmarketingoperations

kindenum<string>

An engineering ticket: bug, feature or change. It goes to an Engineer, who analyzes it, plans it with you and builds it (the engineering flow)

bugfeaturechange

parentstring

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

At least 1 characters · At most 40 characters

waitsOnarray<string>

Tasks that must be done before it starts: what blocks it

At most 10 items

labelsarray<string>

At most 10 items

dueAtstring | null

Response

201 · 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.
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.