Api Reference
This page lists every model you can read and every action you can call. See the Quick Guide to Codecks API for tokens and first examples.
Everything listed here is covered by the stability promise. Items marked preview may change in any release, and each change is listed in the API changelog. Models, fields and actions that aren’t listed here are internal: they may work today, but can change or disappear without notice.
Basics
simple syntax example:
{
"_root": [{
"relname($query)": [...fields and relations],
"relname($query2)": [...fields and relations],
}]
}
curl example:
curl 'https://api.codecks.io/' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer [TOKEN]' \
--data-binary '{"query":{"_root":[{"account":["name"]}]}}'
Owners and admins create a token under Organization Settings → Integrations → API Tokens; see the API guide for what a token may reach.
Query syntax
here’s the syntax for what a $query looks like.
{fieldName1: $val, fieldName2: {"op": $op, "value": $val}}
Note that {fieldName1: $val} is a shortcut for {fieldName1: {"op": "eq", "value": $val}}
The $query portion needs to be sent to JSON.stringify() or similar. For readiablity’s sake we display the non-stringified versions here.
If you want to fetch all related items you can leave out the $query portion like this:
...
"deck": [{
"cards": [...fields and relations],
}]
...
Possible values for $op
eq: value | null
neq: value | null
in: array
notIn: array
gt: ordinal value
gte: ordinal value
lt: ordinal value
lte: ordinal value
inOrNull: array
contains: string (if field is of type string)
has: value (if field is of type array)
overlaps: array (if field is of type array)
search: string if field is searchable (so far only available for the content field within the card model)
Filtering by values of relation fields
fieldName can also be used to access a relation’s properties. For a card this could be e.g {resolvables: {context: ["block", "review"], isClosed: false}}.
This would fetch all cards that have at least one non-closed resolvable with the blockorreview context
Negation:
you can also do {!resolvables: {context: ["block", "review"], isClosed: false}} to say only show cards with no such resolvables.
“in” - shortcut
relname({"projectId": [123, 234]})
is equivalent to
relname({"projectId": {"op": "in", value: [123, 234]}})
special fields
-
$or
combines multiple queries via or, sub queries may not contain special fields (beside more $or and $and)
relname({"$or": [{"isArchived": true}, {"status": "done"}]})
-
$and
combines multiple queries via and, sub queries may not contain special fields (beside more $or and $and)
relname({"$and": [
{"effort": {"op": "gt", value: 0}},
{"effort": {"op": "lte", value: 5}}
]})
-
$order: OrderExpression
relname({"deckId": 123, "$order": "createdAt"})
An OrderExpression is a field name or a list of field names. A leading - sorts descending:
fieldName sorts ascending
-fieldName sorts descending
["year", "-month"] sorts by year, then by month descending
Objects like {"field": fieldName, "dir": "desc"} are rejected with invalid_order.
-
$first: true
only works when order is provided, return singleton
relname({"deckId": 123, "$order": "createdAt", "$first": true})
-
$limit: number
only works when order is provided. Every list returns at most 3000 rows, with or without $limit, and a longer list is cut off without an error
relname({"deckId": 123, "$order": "createdAt", "$limit": 10})
-
$offset: number
only works when limit (and thus order) is provided
relname({"deckId": 123, "$order": "createdAt", "$limit": 10, "$offset": 20})
Checking for null
null works as a value for eq and neq, and with the shortcut:
cards({"assigneeId": null})
cards({"milestoneId": {"op": "neq", "value": null}})
Counting rows
Put count: or exists: in front of a list relation in a field list to get a number or a boolean instead of the rows:
{"_root": [{"account": ["count:cards", "exists:projects"]}]}
A query works the same as on the relation itself:
"count:cards({\"status\": \"started\"})"
The result is stored on the row under exactly the key you sent, e.g. "count:cards({\"status\":\"started\"})": 12. Only relations that return a list can be counted: count:deck on a card fails with invalid_aggregate.
Repeated relations
Each key in a field list is its own relation, so you can ask for the same relation several times with different queries, next to its counts:
{
"deck([DECK_ID])": [
"count:cards",
{"cards({\"status\": \"started\"})": ["title"]},
{"cards({\"$order\": \"-createdAt\", \"$first\": true})": ["title"]}
]
}
The response stores each list under its key as you wrote it. The $first one holds a single id, or null if nothing matched. The cards themselves are listed once under card, whichever of the three returned them.
Id-list relations
A few list relations hold a plain list of ids on the row itself, e.g. a card’s childCards, attachments, inDeps and outDeps. They don’t take a $query: you can select their fields and use count: and exists:, but you can’t filter, order or limit them. Filter on the related model instead, e.g. cards({"parentCardId": "[CARD_ID]"}) for a card’s sub cards.
Root queries by id
root level queries look like this:
{
"modelname($id)": [...fields and relations]
}
$id is either a string for single id models or a JSON array for compound ids.
Relations as fields
A relation that points to a single row can also be named in a field list without a nested list. "deck" instead of {"deck": [...]} returns the deck’s id.
To filter by such a relation, use its id: cards({"deckId": "[DECK_ID]"}).
Writing data
Every change goes through an action, sent as a POST with a JSON body:
curl 'https://api.codecks.io/dispatch/cards/create' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer [TOKEN]' \
--data-binary '{"content": "My card", "deckId": "[DECK_ID]"}'
- Params marked required have to be sent. All others can be left out, and leaving them out never changes anything else.
- Params the action doesn’t know are ignored without an error. Check the spelling of a param when an action seems to have no effect.
- The response is listed with each action. Most actions answer without a body.
- A token that lacks a scope the action requires gets a
403 with "error": "missing_scope", the requiredScope and a message naming it, e.g. requires card:write.
Scopes
Every action lists the scopes it requires, like card:write. Reading a field needs one too: most fields need <model>:read, a few need another scope, like account.billingEmail, which needs account:readAdmin.
A scope is a model and a verb. No scope includes another one: card:write doesn’t allow reading cards, so a permission that allows both includes card:read as well.
| Verb |
Allows |
read |
reading the model’s fields |
readPublic |
reading the fields an Open Decks visitor sees too |
readAdmin |
reading fields only admins see, like account.billingEmail |
readSelf |
reading your own settings on user, like timezone |
write |
creating and changing rows |
writeOwn |
changing rows that belong to the token’s user. For a personal token, that’s you |
writeAny |
changing rows that belong to someone else |
create |
creating a project |
delete |
deleting a project, a deck or a stored file. Removing a file from a card is write |
writeAccess |
changing a project’s defaultUserAccess, i.e. whether the whole team sees it |
The Permission you pick when creating a token decides which scopes it holds. Each permission includes everything of the one before it:
_root:readaccount:readaccount:readPublicaccountRole:readactivity:readassigneeAssignment:readassigneeDeckAssignment:readattachment:readcard:readcardHistory:readcardOrder:readcardOrderInDeck:readcardPreset:readcardSubscription:readcardUpvote:readcardsEffortHistory:readcardsFinishedHistory:readcardsStatusHistory:readcardsTimeToFinished:readdeck:readdeckAssignment:readdeckGuardian:readdeckSubscription:readdueCard:readfile:readforecastOverwrite:readhandCard:readmilestone:readmilestoneProgress:readmilestoneProject:readpinnedMilestone:readproject:readprojectOrder:readprojectTag:readprojectUser:readprojectUserSetting:readpublicProjectInfo:readqueueEntry:readrelease:readresolvable:readresolvableEntry:readresolvableEntryHistory:readresolvableEntryReaction:readresolvableParticipant:readresolvableParticipantHistory:readsprint:readsprintConfig:readsprintConfigProgress:readsprintProgress:readsprintProject:readtimeTrackingSegment:readtimeTrackingSum:readuser:readuserTag:readvisionBoard:readvisionBoardQuery:readworkflowItem:readworkflowItemHistory:readworkflowTemplate:readworkflowTemplateItem:read
Personal tokens
also hold these, for your own data
accountUserSetting:readcardDiffNotification:readlastSeenCardUpvote:readprojectSelection:readqueueSelection:readresolvableNotification:readsavedSearch:readuser:readSelfuserNotificationChannel:read
Read & write
everything in Read, plus
attachment:writecard:writecardOrder:writecardPreset:writecardSubscription:writeOwncardUpvote:writeOwndeckSubscription:writeOwnfile:writehandCard:writeOwnpinnedMilestone:writeOwnqueueEntry:writeresolvable:writeresolvableEntry:writeOwnresolvableEntryReaction:writeOwnresolvableParticipant:writeOwntimeTrackingSegment:writeOwnuserTag:writeOwnvisionBoard:writevisionBoardQuery:write
Organization tokens
also hold these
handCard:writeAny
Personal tokens
also hold these, for your own data
accountUserSetting:writeOwncardDiffNotification:writeOwnlastSeenCardUpvote:writeprojectOrder:writeOwnprojectSelection:writeOwnqueueSelection:writeOwnresolvableNotification:writeOwnsavedSearch:writeOwnuser:writeOwnuserNotificationChannel:writeOwn
Producer
everything in Read & write, plus
deck:deletedeck:writedeckGuardian:writeforecastOverwrite:writemilestone:writeproject:writeprojectTag:writeprojectUser:writesprint:writesprintConfig:writetimeTrackingSegment:writeAnyworkflowItem:writeworkflowTemplate:write
Admin
everything in Producer, plus
account:readAdminaccount:writeaccountRole:writeaffiliateCode:readfile:deleteinvoice:readproject:createproject:deleteproject:writeAccess
A personal token never holds more than your role in the organization allows. If your role is below the token’s permission, the token acts with the permission your role allows, see Personal tokens.
Reading this reference
| null means the value may be null.
- A
timestamp is an ISO 8601 string in UTC, like "2026-09-25T13:37:00.000Z". A day is a date without a time, like "2026-09-25".
int32 is a whole number. any is a JSON value the reference doesn’t describe further.
- A type like
"a" | "b" lists the values known today. New values may be added at any time, so your code needs to handle values it doesn’t know.
Models
The starting point of every query.
Relations
| account | The organization the request is for. |
| loggedInUser | The user the request acts as. For an organization's API token it's the token's own user. null when nobody is signed in. |
| releases | The entries of the Codecks changelog. |
An organization and its settings.
Fields
| id | |
| allowInheritHeroCover | true makes the web app show a hero card's cover image on its sub cards, in place of their own.
|
| attachmentCoverMode | "none" | "first" | "last" previewWhich uploaded image attachment becomes the card's coverFile. first only sets it if the card has no cover yet, last always uses the newest image, none never sets it. |
| createdAt | |
| dependenciesEnabled | |
| dueDateEnabled | |
| effortScale | The effort values the web app offers for a card. A card's effort may still be any other number. |
| fallbackEffort | The effort the web app counts for cards without an effort, e.g. in charts, hero cards and run capacity. |
| hideCompletedCardCountForDecks | true hides the number of done cards on decks in the web app.
|
| maxHandSlotCount | How many cards that aren't done each user may have in their Hand, between 7 and 28. handQueue/addCardsToHand, handQueue/setCardOrders and cards/create with putInQueue fail beyond it. Starting a card and hand sync can still go beyond it. |
| milestonesEnabled | |
| name | |
| priorityLabels | {a: string; b: string; c: string} The names the web app shows for the card priorities a, b and c. |
| sprintsEnabled | Whether the organization uses runs. |
| startWeekday | "monday" | "saturday" | "sunday" The first day of the week in the calendar and timeline. Users can override it for themselves. |
| statusChangeDurations | {snooze: int32; archive: int32 | null} previewIn seconds. A started card without changes for snooze seconds becomes snoozing. A done card without changes and open comment threads for archive seconds gets archived. archive is null when done cards never get archived. |
| subdomain | The part before .codecks.io in the organization's web address. |
| timeTrackingMode | "none" | "manual" | "strict" previewnone turns time tracking off. manual allows only manual time entries. strict also adds a timer that users start with the play button on a card.
|
| timelineScaleType | Whether the timeline shows days or weeks. Users can override it for themselves. |
| visionBoardEnabled | |
| workdays | {monday: boolean; tuesday: boolean; wednesday: boolean; thursday: boolean; friday: boolean; saturday: boolean; sunday: boolean} The days the team works. The web app only counts these days, e.g. for the days left until a milestone. |
| workflowMode | "none" | "only_parent_cards" | "journeys" previewjourneys when the organization uses journeys, only_parent_cards when not.
|
Relations
| archivedProjects | |
| attachments | |
| cards | |
| decks | |
| files | |
| handCards | The bookmarked cards of all users. |
| milestones | |
| projects | Projects that are neither archived nor deleted. |
| queueEntries | The cards in the Card Hand of all users. |
| resolvableEntries | The comments of all cards. |
| resolvableParticipants | |
| resolvables | The comment threads of all cards. |
| roles | The organization's members, one row per person. |
| sprintConfigs | The organization's run configs. |
| sprints | |
| workflowItems | The organization's journey steps. |
A person's membership in an organization.
Identified by accountId, userId
Fields
| accountId | |
| userId | |
| createdAt | |
| role | owner, admin, guest, observer or disabled. The web app calls guest Staff. A disabled member can't log in or be assigned cards.
|
A file attached to a card.
Fields
| id | |
| accountId | |
| cardId | |
| content | The attachment's label as markdown. It starts as the file name. |
| createdAt | |
| creatorId | |
| fileId | |
| title | The first line of content as plain text, cut to 80 characters. |
A task or a document card when isDoc is set or a hero card if it contains sub cards.
The card's color is derived from status, visibility, isDoc and whether it has sub cards or open block or review conversations.
Fields
| cardId | |
| accountId | |
| accountSeq | The card's number within the organization. It's stored as a plain number starting at 1. The web app shows it encoded as a short code after a $, like $12a. Check this gist for how to translate the number into the shown string and vice versa. |
| assigneeId | |
| checkboxInfo | {label: string; checked: boolean}[] previewThe checkboxes in content, in order. |
| checkboxStats | {total: int32; checked: int32} How many checkboxes content has, and how many of them are checked. |
| content | The card's text as markdown. Its first line is the title. Tags, mentions, checkboxes and card references in it fill tags, masterTags, mentionedUsers, checkboxStats, checkboxInfo and cardReferences. |
| coverFileId | The image shown on the card's front. |
| createdAt | |
| creatorId | null for cards an import created.
|
| deckId | null for a private card, which only its creator sees.
|
| derivedStatus | "deleted" | "archived" | "archivedDone" | "archivedHeroDone" | "doc" | "blocked" | "review" | "hero" | "heroDone" | "heroDoc" | "assigned" | "unassigned" | "started" | "done" | "snoozing" | "archivedHero" previewThe state the web app shows, combining status, visibility, isDoc, open review and blocker threads, the assignee and whether it's a hero card: e.g. blocked for an open blocker thread, unassigned for a not started card without an assignee. |
| dueDate | |
| effort | On the organization's scale, account.effortScale. |
| hasBlockingDeps | One of inDeps isn't done yet. |
| isBlockingDep | The card isn't done yet, and one of its outDeps isn't either. |
| isDoc | true for a document card: it holds information instead of a task, so it's never started or done.
|
| lastUpdatedAt | When the card last changed. |
| masterTags | The card's project tags: the tags from the project's tag list, whether written as #tag in content or set directly, plus the deck's auto-tag. Writing them may change content. |
| mentionedUsers | The users mentioned in content. |
| milestoneId | |
| parentCardId | The hero card this card is a sub card of. |
| priority | a, b or c: High, Medium and Low, unless the organization renamed them (account.priorityLabels).
|
| sourceWorkflowItemId | The journey step the card was created from. |
| sprintId | The run the card is planned into. |
| status | "not_started" | "started" | "snoozing" | "done" snoozing is only set on a started card that nobody changed for the organization's snooze time (account.statusChangeDurations). It can't be written. derivedStatus is the state the web app shows.
|
| tags | Every tag on the card: the #tags in content and the masterTags, each once. |
| title | The first line of content as plain text, without markdown and cut to 80 characters. Write content to change it. |
| version | Goes up with every change to the card. |
| visibility | "default" | "archived" | "deleted" archived cards are put away, deleted ones are in the trash. Both stay readable.
|
Relations
| account | |
| assignee | |
| attachments | In the order the card shows them. |
| cardReferences | The cards that content links to. |
| childCards | A hero card's sub cards, in order. |
| coverFile | The image shown on the card's front. |
| creator | null for cards an import created.
|
| deck | null for a private card, which only its creator sees.
|
| diffs | The card's change history. |
| handCards | One entry per user who bookmarked the card. |
| inDeps | The cards that have to be done before this one. |
| milestone | |
| outDeps | The cards that wait for this one. The counterpart of their inDeps. |
| parentCard | The hero card this card is a sub card of. |
| queueEntries | One entry per user who has the card in their Card Hand. |
| resolvableEntries | Every comment on the card, across its threads. |
| resolvables | The card's comment threads, including reviews and blockers (context). |
| sourceWorkflowItem | The journey step the card was created from. |
| sprint | The run the card is planned into. |
One version of a card and what changed in it. The web app shows these in the card's history.
Identified by cardId, version
Fields
| cardId | |
| version | The card's version after this change. |
| accountId | |
| changerId | |
| content | The card's full content at this version. |
| diff | The changed fields: [old, new] for single values, {"+": added, "-": removed} for lists, and an encoded text diff for content and title. |
| versionCreatedAt | |
A list of cards within a project. deckType says which kind of cards it is meant for.
Fields
| id | |
| accountId | |
| accountSeq | The deck's number within the organization. The web app uses it in the deck's URL, like /decks/12-my-deck. |
| coverColor | A hex color like #ff8800. |
| coverFileId | |
| createdAt | |
| creatorId | |
| deckType | "task" | "hero" | "doc" | "mixed" The web app calls these Task (task), Asset (hero), Knowledge (doc) and Mixed (mixed) decks. Cards in a hero deck count as hero cards unless they are docs or sub cards. A started card that moves into a hero or doc deck goes back to not_started. |
| defaultCard | {content?: string; assigneeId?: User id | null; priority?: "a" | "b" | "c" | null; effort?: int32 | null; masterTags?: string[]} previewThe deck's Template Card. The web app fills in these values when you create a card in this deck. cards/create doesn't use them. |
| defaultProjectTagId | The deck's auto tag. Cards that are created in or moved into the deck get this project tag. |
| description | |
| handSyncEnabled | Cards in this deck that have an assignee go into the assignee's Hand. This happens when a card is created, moved into the deck or gets a new assignee. |
| hasGuardians | The deck has guardians. Then only guardians, producers and admins may mark its cards as done or not done, archive, delete, restore or move them. |
| isDeleted | |
| manualOrderLabels | The names of the zones in the deck's manual order, in order. null is a zone without a name. A card's zone is the label of its cardOrder in the deck context. |
| milestoneId | Setting it also puts the deck's cards into this milestone. |
| projectId | |
| sortValue | Decks within a space are sorted by it. Change it with decks/addToSpaceAfter or decks/addToSpaceBefore. |
| spaceId | The space of the project the deck is in, one of the ids in project.spaces. |
| title | |
Relations
| account | |
| cards | |
| coverFile | |
| creator | |
| defaultProjectTag | The deck's auto tag. Cards that are created in or moved into the deck get this project tag. |
| milestone | Setting it also puts the deck's cards into this milestone. |
| project | |
| workflowItems | The steps of the deck's journey. |
An uploaded file, like a card attachment or a cover image.
Fields
| id | |
| accountId | |
| createdAt | |
| name | |
| size | In bytes. 0 once the file is deleted. |
| uploaderId | |
| url | Where to download the file. "" once the file is deleted. |
A card a user bookmarked. Deleting the card removes its bookmarks.
Identified by cardId, userId, accountId
Fields
| cardId | |
| userId | |
| accountId | |
| sortIndex | Bookmarks are listed by ascending sortIndex. There may be gaps. |
A date that cards are planned towards. It belongs to a list of projects, or with isGlobal to all projects of the organization.
Fields
| id | |
| accountId | |
| accountSeq | The milestone's number within the organization. The web app uses it in the milestone's URL: /milestones/<accountSeq>. |
| color | "gray" | "brown" | "yellow" | "red" | "pink" | "blue" | "green" |
| coverFileId | |
| createdAt | |
| creatorId | |
| date | |
| description | |
| handSyncEnabled | Its cards that are not done and have an assignee are added to the assignee's Hand. |
| isDeleted | |
| isGlobal | The milestone belongs to all projects of the organization, also to projects created later. |
| manualOrderLabels | The names of the zones the web app groups the cards into when they are ordered by hand, in order. null is the zone without a name. |
| name | |
| startDate | |
| userCapacities | {[userId: User id]: int32} previewThe planned effort per user, keyed by user id. The web app compares it with the effort of the user's cards, where a card without effort counts as account.fallbackEffort. |
Relations
| account | |
| cards | |
| coverFile | |
| creator | |
| milestoneProjects | |
| progress | The daily progress history. |
The state of a milestone's cards on a day (UTC). A row is only written on days when the numbers change, so a day without a row has the numbers of the row before it.
Identified by milestoneId, date
Fields
| milestoneId | |
| date | |
| progress | Counts the cards in decks of active projects by their derivedStatus, with all done states counted as done. cards and effort have the card count and the effort sum for each state (done, started, review, blocked, snoozing, assigned, unassigned, hero), stats has [count, effort sum, cards without effort] for each state and noEffortCards counts the cards without effort. States without cards are left out. |
Links a milestone to a project whose cards and decks can use it. A milestone with isGlobal is linked to every project.
Identified by milestoneId, projectId
Fields
| milestoneId | |
| projectId | |
| accountId | |
Groups decks. A card belongs to the project of its deck.
Fields
| id | |
| accountId | |
| coverFileId | |
| createdAt | |
| name | |
| spaces | The spaces that group the project's decks. Removing a space moves its decks into the first remaining one. |
| visibility | "default" | "archived" | "deleted" Setting archived or deleted closes all open comment threads on the project's cards. |
Relations
| account | |
| coverFile | |
| decks | |
| milestoneProjects | Links to the milestones this project can use. |
| sprintProjects | Links to the run configs this project can use. |
| tags | The project's tag list. A card in the project with one of these tags lists it in masterTags. |
A tag in a project's tag list. A card in the project with this tag lists it in masterTags.
Fields
| id | |
| color | A hex color like #ff0000 for cards with this tag. The web app sets either color or emoji, not both. |
| createdAt | |
| description | What the tag is for, as markdown. |
| emoji | |
| projectId | |
| tag | Without the #. Renaming it also renames the tag in the content and masterTags of the project's cards. |
A card in a user's Hand. When a card is done, its owner gets an entry in their Hand's done pile, even if the card wasn't in their Hand.
Fields
| id | |
| accountId | |
| cardDoneAt | When the card was done. Other users' entries for the card are removed then. Setting the card back to not done moves the entry to the end of the Hand. |
| cardId | |
| createdAt | |
| sortIndex | The position in the Hand, 0 is the first card. null once the card is done. |
| userId | |
An entry in the Codecks changelog. It's the same for every organization.
Fields
| id | |
| content | The release notes as markdown. |
| createdAt | |
| title | |
| version | |
A comment thread on a card. Its context says if it's a plain conversation or if it marks the card as blocked or in review.
Fields
| id | |
| accountId | |
| cardId | |
| closedAt | |
| context | "block" | "review" | "comment" block marks the card as blocked and review marks it as in review while the thread is open (see card.derivedStatus). comment is a plain conversation.
|
| createdAt | |
| creatorId | |
| isClosed | Archiving or deleting the card closes its open threads. |
| latestEntryAt | When the thread's newest comment was written. null for a thread without comments. |
| reopenedAt | Only set while the thread is open again after being closed. Closing it clears the value. |
Relations
| account | |
| card | |
| closedBy | null while the thread is open, or when it was closed automatically.
|
| creator | |
| entries | |
| participants | |
| reopenedBy | Only set while the thread is open again after being closed. |
A comment in a comment thread.
Fields
| entryId | |
| accountId | |
| authorId | |
| cardId | |
| content | Markdown. Mentions are stored as @[userId:<id>]. |
| createdAt | |
| lastChangedAt | When the comment was last edited. Same as createdAt if it never was. |
| resolvableId | |
| version | Starts at 1 and goes up with every edit. |
Relations
| author | |
| card | |
| reactions | |
| resolvable | |
An emoji reaction to a comment. A user can add each emoji only once per comment.
Fields
| id | |
| accountId | |
| createdAt | |
| entryId | |
| resolvableId | |
| userId | |
| value | {type: "emoji"; value: string} {"type": "emoji", "value": "👍"}. value is the emoji character itself.
|
Relations
| account | |
| resolvable | |
| resolvableEntry | |
| user | |
A comment thread in a person's inbox. Only readable for the person themselves.
Identified by userId, resolvableId
Fields
| userId | |
| resolvableId | |
| accountId | |
| createdAt | |
| isLastParticipant | |
| isMuted | |
| isParticipating | |
| isSnoozing | |
| lastUpdatedAt | |
| latestEntryId | |
| latestSeenEntryId | |
| remindMeOn | |
| snoozeUntil | |
| unseenAuthors | |
| unseenEntryCount | |
Relations
| account | |
| latestEntry | |
| latestSeenEntry | |
| resolvable | |
| user | |
A person taking part in a comment thread. They are notified about its new comments until they opt out.
Identified by participantId, resolvableId
Fields
| participantId | |
| resolvableId | |
| accountId | |
| addedById | |
| done | The person opted out, or approved a review thread. They are no longer notified. |
| firstJoinedAt | |
| lastChangedAt | |
| latestEntryAtMs | When the thread's newest comment was written, in milliseconds since 1970. null for a thread without comments. Sort by it to list a person's threads by recent activity. |
| resolvableIsClosed | |
| status | "active" | "opt_out" | "approve" |
Relations
| account | |
| addedBy | |
| resolvable | |
| user | |
A run: one time box of a Run Config, from startDate to endDate. Codecks creates the upcoming runs ahead of time and completes a run when it ends.
Fields
| id | |
| accountId | |
| accountSeq | The run's number within the organization. The web app uses it in the run's URL: /milestones/run/<accountSeq>. |
| autoMilestoneId | Cards that are added to this run get this milestone, unless they already have one. |
| completedAt | When the run was completed, at its end or with complete in sprints/updateSprint. |
| coverFileId | |
| createdAt | |
| description | |
| endDate | |
| handSyncEnabled | A card that is created in this run with an assignee is added to the assignee's Hand. |
| index | The position of the run within its Run Config, starting at 0. The web app shows index + 1 as the run's number. |
| isDeleted | |
| lockedAt | When Beast Mode started for this run. In Beast Mode the run's cards are locked in, and moving one of them to another run raises its Beast level. null while it is off. |
| manualOrderLabels | The names of the zones the web app groups the cards into when they are ordered by hand, in order. null is the zone without a name. A new run starts with the zones of the run before it. |
| name | null unless set by hand. The web app then shows a label from the Run Config's runLabelTemplate, or Run <index + 1>.
|
| sprintConfigId | |
| startDate | |
| userCapacities | {[userId: User id]: int32} previewThe planned effort per user, keyed by user id. The web app compares it with the effort of the user's cards, where a card without effort counts as account.fallbackEffort. A new run starts with the capacities of the run before it. |
Relations
| account | |
| autoMilestone | Cards that are added to this run get this milestone, unless they already have one. |
| cards | |
| coverFile | |
| progress | The daily progress history. |
| sprintConfig | |
A Run Config. It creates runs of the same length one after the other, like sprints, for its projects.
Fields
| id | |
| accountId | |
| autoAssignNewCard | The web app puts new cards in its projects into the current run. Journeys do the same, cards/create doesn't. |
| autoAssignStartedCard | A card in one of its projects that is started without a run is added to the current run. |
| autoBeastModeDurationHours | Beast Mode starts on its own this many hours after the start of a run, counted from midnight in the Run Config's time zone. 0 starts it right away, null turns it off. |
| beastGracePeriodHours | In Beast Mode, a card added to the run is only locked in after this many hours. Until then it can move to another run without raising its Beast level. |
| color | "gray" | "brown" | "yellow" | "red" | "pink" | "blue" | "green" |
| createdAt | |
| creatorId | |
| isGlobal | The Run Config belongs to all projects of the organization, also to projects created later. |
| moveOnFinish | ("undone" | "review" | "blocked")[] previewWhich cards move to the next run when a run ends: review for cards with an open review, blocked for cards with an open blocker and undone for all other cards that aren't done. Archived cards and docs stay. |
| name | |
| runLabelTemplate | The label for runs without a name. %RUN_NR% becomes the run's index + 1 and %CALENDAR_WEEK% the ISO week of its startDate. null means Run %RUN_NR%. |
Relations
| account | |
| creator | |
| progress | The daily history of the done cards across all runs. |
| sprintProjects | |
| sprints | |
The done cards of all runs of a Run Config on a day (UTC). A row is only written on days when the numbers change, so a day without a row has the numbers of the row before it.
Identified by sprintConfigId, date
Fields
| sprintConfigId | |
| date | |
| progress | stats.done is [count, effort sum, cards without effort] of the done cards in all runs, counting only cards in decks of active projects.
|
The state of a run's cards on a day (UTC). A row is only written on days when the numbers change, so a day without a row has the numbers of the row before it.
Identified by sprintId, date
Fields
| sprintId | |
| date | |
| progress | Counts the cards in decks of active projects by their derivedStatus, with all done states counted as done. cards and effort have the card count and the effort sum for each state (done, started, review, blocked, snoozing, assigned, unassigned, hero), stats has [count, effort sum, cards without effort] for each state and noEffortCards counts the cards without effort. States without cards are left out. |
Links a run config to a project whose cards can be planned into its runs. A run config with isGlobal is linked to every project.
Identified by sprintConfigId, projectId
Fields
| sprintConfigId | |
| projectId | |
| accountId | |
Relations
| account | |
| project | |
| sprintConfig | |
A person, or an integration or API token that acts in an organization. kind tells them apart.
Fields
| id | |
| fullName | null unless the user entered one.
|
| isIntegration | true for every kind other than human.
|
| kind | "human" | "integration" | "api_token" integration is the user an integration like GitHub or Slack acts as, api_token the one an organization's API token acts as.
|
| name | The username. "" when none is set. An API token's user carries the token's label. |
| profileImageId | |
| timezone | An IANA time zone like Europe/Berlin. Only readable on your own user: null on everyone else's. |
Relations
| accountRoles | |
| participations | |
| profileImage | |
| resolvableNotifications | |
A Journey Step: a template for a sub card. Starting a deck's journey on a card creates a sub card from each of its steps.
Fields
| itemId | |
| accountId | |
| accountSeq | The step's number within the organization. It comes from the same counter as card.accountSeq. |
| assigneeId | The owner of the created card. |
| checkboxInfo | {label: string; checked: boolean}[] |
| checkboxStats | {total: int32; checked: int32} |
| content | Markdown for the created card's content, see card.content. %PARENT_TITLE% is replaced by the title of the card the journey is started on. |
| createdAt | |
| creatorId | |
| deckId | The deck whose journey the step belongs to. |
| effort | |
| label | The name of the group the step is in. null for the default group. |
| lastUpdatedAt | |
| masterTags | |
| mentionedUsers | |
| priority | |
| sortValue | Steps are ordered by ascending sortValue, compared as strings, within their label group. |
| tags | |
| targetDeckId | The deck the created card goes to. Without one, it goes to deck. |
| title | |
| version | Goes up with every change to the step. |
| visibility | "default" | "archived" | "deleted" Only default steps are used when a journey is started. Changing an archived or deleted step sets it back to default. |
Relations
| account | |
| assignee | The owner of the created card. |
| creator | |
| deck | The deck whose journey the step belongs to. |
| inDeps | Steps of the same journey that have to be done before this one. The created cards get the same dependencies. |
| outDeps | Steps of the same journey that are blocked by this one. |
| targetDeck | The deck the created card goes to. Without one, it goes to deck. |
Actions
Bookmarks cards for a user, at the end of their bookmarks. Cards that are already bookmarked move to the end.
POST /dispatch/bookmarks/addCards
Removes cards from a user's bookmarks.
POST /dispatch/bookmarks/removeCards
Moves cards to the top of a user's bookmarks, in the given order. The other bookmarks follow in their current order. Cards that aren't bookmarked yet get bookmarked.
POST /dispatch/bookmarks/setOrders
Puts cards into a manual order right after targetId, in the order of cardIds, and into the zone label.
POST /dispatch/cardOrders/addAfter
Params
| targetId | Card id | null · required null puts the cards at the end.
|
| cardIds | |
| context | "milestone" | "deck" | "sprint" · required Which manual order to change: the one of the cards' deck, milestone or run. A card has one position in each. |
| label | The zone, one of the manualOrderLabels of the deck, milestone or run. null is the zone without a name. |
Puts cards into a manual order right before targetId, in the order of cardIds, and into the zone label.
POST /dispatch/cardOrders/addBefore
Params
| targetId | Card id | null · required null puts the cards at the start.
|
| cardIds | |
| context | "milestone" | "deck" | "sprint" · required Which manual order to change: the one of the cards' deck, milestone or run. A card has one position in each. |
| label | The zone, one of the manualOrderLabels of the deck, milestone or run. null is the zone without a name. |
Moves cards into another zone of a manual order and keeps their position. Cards that have no position in that order yet are skipped.
POST /dispatch/cardOrders/updateLabel
Params
| cardIds | |
| context | "milestone" | "deck" | "sprint" · required Which manual order to change: the one of the cards' deck, milestone or run. A card has one position in each. |
| label | The zone, one of the manualOrderLabels of the deck, milestone or run. null is the zone without a name. |
Sets the same values on every card in ids. Look at cards/update for the property details.
POST /dispatch/cards/bulkUpdate
Params
| ids | |
| priority | |
| effort | |
| status | "not_started" | "started" | "done" |
| assigneeId | |
| deckId | |
| visibility | "default" | "archived" | "deleted" |
| milestoneId | |
| sprintId | |
| dueDate | YYYY-MM-DD, or null to remove it. Fails unless the organization's plan includes due dates.
|
| isDoc | |
| addMasterTag | Adds this tag to every card's masterTags. |
| removeMasterTag | Removes this tag from every card, ignoring case. |
| parentCardId | |
Copies each card into a deck, as not_started and with the same content. A copied sub card is added to its hero card right after the original.
POST /dispatch/cards/copy
Params
| ids | |
| props | ("effort" | "priority" | "assigneeId" | "masterTags" | "attachments" | "milestoneId" | "sprintId")[] · required The fields to copy besides content. |
| target | The id of the deck to copy into. |
Creates a card as not_started. The first line of content becomes its title. Everyone mentioned in content is subscribed to the card.
POST /dispatch/cards/create
Params
| content | Markdown. Its first line becomes the card's title. |
| priority | |
| effort | |
| assigneeId | |
| deckId | Deck id | null · required null creates a private card, and bookmarks it for you.
|
| masterTags | Project tags, on top of those written as #tag in content. |
| milestoneId | |
| sprintId | |
| parentCardId | Adds the card as the last sub card of this hero card. |
| dueDate | YYYY-MM-DD. Fails unless the organization's plan includes due dates.
|
| isDoc | |
| addAsBookmark | Bookmarks the card for you. |
| putInQueue | Adds the card to its assignee's Hand, or to yours when it has none. Fails when that Hand has no free slot (account.maxHandSlotCount). |
| subscribeCreator | Subscribes you to the card, so you're notified about its changes and comments. |
Response
| id | |
| accountSeq | The card's number, see card.accountSeq. |
Creates cards in one deck and returns their ids in the same order. Unlike cards/create, it doesn't subscribe you to them.
POST /dispatch/cards/createMany
Params
| cards | The first line of each content becomes the card's title. status defaults to not_started, visibility to default. | content | | | priority | | | effort | | | assigneeId | | | isDoc | | | visibility | "archived" | "default" | "deleted" | | status | "not_started" | "started" | "done" | null |
|
| deckId | |
| parentCardId | Adds the cards as the last sub cards of this hero card. |
Changes the given fields of a card. Some writes change other fields too: content sets title and tags, and giving a started card another assignee sets it back to not_started.
POST /dispatch/cards/update
Params
| id | |
| content | Markdown. Its first line becomes the card's title. |
| priority | |
| effort | |
| status | "not_started" | "started" | "done" A Hero Card can't be started. |
| assigneeId | |
| deckId | |
| masterTags | Replaces the project tags. Those written as #tag in content stay. |
| visibility | "default" | "archived" | "deleted" Archiving or deleting a started card sets it back to not_started. Deleting also removes its dependencies. |
| milestoneId | |
| sprintId | |
| parentCardId | The hero card to make this card a sub card of. |
| childCards | A hero card's sub cards, in order. |
| inDeps | The cards that have to be done before this one. Fails when it would make a cycle. |
| outDeps | The cards that are blocked by this one. |
| dueDate | YYYY-MM-DD, or null to remove it. Fails unless the organization's plan includes due dates.
|
| isDoc | |
Updates several cards, each with its own values. Cards that don't exist or that you can't see are skipped.
POST /dispatch/cards/updateMany
Params
| cards | Each needs a content or a title. With both, the content becomes the title, an empty line and content. A title alone replaces the first line of the current content. Project tags in masterTags that the project doesn't have yet are created. | id | | | content | | | title | | | priority | | | effort | | | assigneeId | | | isDoc | | | visibility | "archived" | "default" | "deleted" | | status | "not_started" | "started" | "done" | null | | masterTags | |
|
Moves decks into a project's space, right after targetId and in the order of deckIds. Decks from another project move with their cards.
POST /dispatch/decks/addToSpaceAfter
Params
| deckIds | |
| targetId | Deck id | null · required null puts the decks at the end of the space.
|
| targetProjectId | |
| targetSpaceId | One of the ids in project.spaces. |
Moves decks into a project's space, right before targetId and in the order of deckIds. Decks from another project move with their cards.
POST /dispatch/decks/addToSpaceBefore
Params
| deckIds | |
| targetId | Deck id | null · required null puts the decks at the start of the space.
|
| targetProjectId | |
| targetSpaceId | One of the ids in project.spaces. |
Creates a deck at the end of the project's first space. deckType defaults to that space's defaultDeckType.
POST /dispatch/decks/create
Params
| title | |
| projectId | |
| coverColor | A hex color like #ff8800. |
| deckType | "task" | "hero" | "doc" | "mixed" |
Sets isDeleted on the deck and archives its cards, their sub cards in other decks, and the journey steps that create cards in this deck.
POST /dispatch/decks/delete
Renames a zone of the deck's manual order. The cards in that zone move to the new name with it, including archived ones.
POST /dispatch/decks/renameZone
Params
| id | |
| label | The zone to rename, one of manualOrderLabels. null is the zone without a name. |
| newLabel | Trimmed. Fails if the deck already has a zone with that name. |
POST /dispatch/decks/update
Params
| id | |
| milestoneId | Also puts the deck's cards that aren't archived or deleted into this milestone. null only takes it from cards that were in the deck's old milestone. |
| title | |
| description | |
| handSyncEnabled | Turning it on adds the deck's assigned cards that aren't done to their assignee's Hand. |
| defaultProjectTagId | The deck's auto tag. Changing it removes the old tag from all of the deck's cards and adds the new one. |
| manualOrderLabels | The zone names are trimmed, and duplicates are dropped. Renaming a zone here leaves its cards with the old name; use decks/renameZone instead. |
| coverColor | A hex color like #ff8800. |
| deckType | "task" | "hero" | "doc" | "mixed" Switching to hero sets the deck's started cards back to not_started. Switching to hero or doc fails while journey steps create their cards in this deck. |
Sets the deck's guardians to exactly userIds and updates hasGuardians. Fails unless the organization's plan includes guardians or userIds is empty.
POST /dispatch/decks/updateGuardians
Adds cards to the end of a user's Hand. Cards that are done, deleted, archived or already in that Hand are skipped. A card without an owner gets the user as owner. Fails when the Hand doesn't have enough free slots (account.maxHandSlotCount).
POST /dispatch/handQueue/addCardsToHand
Response
| queueEntries | The new entries, one for each added card. |
Removes cards from a user's Hand, or from every Hand when userId is left out. This includes entries in the done pile.
POST /dispatch/handQueue/removeCards
Sets the order of a user's Hand and can add cards to it. A card added this way that has no owner gets the user as owner. Fails when the Hand doesn't have enough free slots for the added cards (account.maxHandSlotCount).
POST /dispatch/handQueue/setCardOrders
Params
| cardIds | The new order from the first card on. Cards of the Hand that are missing here follow in their current order. Cards that are neither in the Hand nor in draggedCardIds are ignored. |
| draggedCardIds | The cards that moved, from within the Hand or from outside. Cards from outside are added. Nothing changes if it is empty or none of them can be in a Hand, e.g. because they are deleted. |
| userId | |
Response
| queueEntries | The Hand's entries after the change. |
Creates a milestone for the projects in projectIds, or for all projects with isGlobal.
POST /dispatch/milestones/create
Params
| accountId | |
| name | |
| description | |
| color | "gray" | "brown" | "yellow" | "red" | "pink" | "blue" | "green" · required |
| date | |
| startDate | |
| isGlobal | |
| projectIds | Ignored when isGlobal is set. |
Response
| id | |
| accountSeq | The milestone's number, see milestone.accountSeq. |
Marks a milestone as deleted (isDeleted). It's removed from all its cards and decks, and nobody has it pinned anymore.
POST /dispatch/milestones/delete
Pins a milestone for a user. The web app shows it in the user's Hand. A user has one pinned milestone per organization, so pinning another one replaces it.
POST /dispatch/milestones/pin
Params
| milestoneId | null removes the user's pin.
|
| userId | The token's own user. For a personal token, that's you. |
Renames a zone of the milestone's manual order. The cards in that zone move to the new name with it, including archived ones.
POST /dispatch/milestones/renameZone
Params
| id | |
| label | The zone to rename, one of manualOrderLabels. null is the zone without a name. |
| newLabel | Trimmed. Fails if the milestone already has a zone with that name. |
POST /dispatch/milestones/update
Params
| id | |
| name | |
| description | |
| color | "gray" | "brown" | "yellow" | "red" | "pink" | "blue" | "green" |
| date | |
| startDate | YYYY-MM-DD, or null to remove it.
|
| handSyncEnabled | Turning it on also adds the milestone's cards that are not done and have an assignee to the assignee's Hand. |
| isGlobal | true links the milestone to all projects. false needs projectIds if the milestone is global.
|
| projectIds | Replaces the milestone's projects and makes it non-global. Ignored with isGlobal: true. Cards and decks of projects that are removed lose the milestone. |
| manualOrderLabels | Labels are trimmed, and duplicates are removed. Renaming a zone here leaves its cards with the old name; use milestones/renameZone instead. |
| userCapacities | {[key: string]: int32} previewReplaces all capacities. Fails with a value above 0 unless the organization's plan includes capacity tracking. |
Adds your reaction to a comment. Fails if you already reacted with the same emoji.
POST /dispatch/resolvables/addReaction
Params
| entryId | |
| value | value is the emoji character itself, like 👍.
|
Closes a comment thread. Closing a block or review thread ends the card's blocked or in review state. In a deck with guardians, only a guardian, a producer or an admin may close a review, unless the guardians in it approved and you are the card's assignee.
POST /dispatch/resolvables/close
Params
| id | |
| markCardDone | Also sets the card's status to done. |
Starts a comment thread on a card with its first comment. You, the card's assignee and everyone mentioned in content join it, and everyone watching the card is notified.
POST /dispatch/resolvables/create
Params
| cardId | |
| context | "block" | "review" | "comment" · required block or review sets the card back to not_started and marks it as blocked or in review until the thread is closed. A review thread also adds the deck's guardians.
|
| content | Markdown. @name mentions of the organization's users are stored as @[userId:<id>]. |
POST /dispatch/resolvables/removeReaction
Opens a closed comment thread again. Reopening a block or review thread sets the card back to not_started, and fails for doc cards, hero cards and cards that already have an open block or review thread.
POST /dispatch/resolvables/reopen
Opts a participant out of a comment thread (done: true) or back in (done: false). Participants who opted out aren't notified about new comments. The card's assignee can't opt out, and neither can the last active participant.
POST /dispatch/resolvables/updateParticipantDone
Params
| resolvableId | |
| userId | |
| done | |
| status | "active" | "opt_out" | "approve" Defaults to opt_out with done: true and to active otherwise. A guardian uses approve with done: true to approve a review thread. |
Renames a zone of the run's manual order. The cards in that zone move to the new name with it, including archived ones.
POST /dispatch/sprints/renameZone
Params
| id | |
| label | The zone to rename, one of manualOrderLabels. null is the zone without a name. |
| newLabel | Trimmed. Fails if the run already has a zone with that name. |
Changes the given fields of a Run Config. A new autoBeastModeDurationHours starts Beast Mode for the current run right away if that time has already passed.
POST /dispatch/sprints/updateConfig
Params
| id | |
| name | |
| color | "gray" | "brown" | "yellow" | "red" | "pink" | "blue" | "green" |
| isGlobal | true links the Run Config to all projects. false needs projectIds if the Run Config is global.
|
| autoBeastModeDurationHours | Fails with a value above 0 unless the organization's plan includes Beast Mode. |
| beastGracePeriodHours | Fails with a value above 0 unless the organization's plan includes Beast Mode. |
| projectIds | Replaces the Run Config's projects and makes it non-global. Ignored with isGlobal: true. Cards of projects that are removed are taken out of their run. |
| moveOnFinish | ("undone" | "review" | "blocked")[] preview |
| autoAssignStartedCard | |
| autoAssignNewCard | |
| runLabelTemplate | Has to contain %RUN_NR% or %CALENDAR_WEEK%. |
Changes the given fields of a run, and can start its Beast Mode or complete it.
POST /dispatch/sprints/updateSprint
Params
| id | |
| name | null makes the web app show the label from the Run Config's runLabelTemplate.
|
| description | |
| handSyncEnabled | |
| manualOrderLabels | Labels are trimmed, and duplicates are removed. Renaming a zone here leaves its cards with the old name; use sprints/renameZone instead. |
| userCapacities | {[key: string]: int32} previewReplaces all capacities. Fails with a value above 0 unless the organization's plan includes capacity tracking. |
| autoMilestoneId | Also gives this milestone to the run's cards that have none. |
| lockIn | true starts Beast Mode for the run now and locks in all its cards. Fails if it's already on, or unless the organization's plan includes Beast Mode.
|
| complete | true completes the run now, as if it ended. Cards move to the next run as set in the Run Config's moveOnFinish. Fails if the run is already completed.
|
Watches a card for you, so you're notified about its changes and new comment threads. Does nothing if you already watch it.
POST /dispatch/watchings/addCard
Makes a user watch a deck. That's the same as watching every card in it, including cards added later. Does nothing if the user already watches it.
POST /dispatch/watchings/addDeck
Params
| deckId | |
| userId | The token's own user. For a personal token, that's you. |
Stops watching a card. You still get its notifications while you watch its deck.
POST /dispatch/watchings/removeCard
Stops a user from watching a deck. Cards the user watches on their own stay watched.
POST /dispatch/watchings/removeDeck