← Docs

API

Everything the web app does goes through this HTTP API, so you can script it too: create and move tickets, read boards and sprints, run reports. It’s the API the terminal app and AI agents use.

Authentication

Send an API key as a bearer token: Authorization: Bearer tl_…. Personal and agent keys are yours: make them in Your settings → API keys. Service keys belong to the organization, and its admins make them in the organization’s settings.

The API’s description, for code generators and API clients: openapi.yaml (also as JSON). Base URL: https://api.tracklin.es/api.

The details, from the API’s description

Complete HTTP API for projects, boards, tickets, roadmaps, billing, and integrations. The API also supports the BugFixes workflow: create in a board column or project backlog, append conversation updates, and close a board ticket by moving it to the board's last (Done) column.

API-key requests are rate limited per key (default 300 a minute, set with API_KEY_RATE_LIMIT): over the limit answers 429 with Retry-After, and every response carries X-RateLimit-Limit / X-RateLimit-Remaining. MCP tool calls count like the REST calls they make. Browser sessions aren't limited.

Most private endpoints accept a Clerk session token or a TrackLin.es (tl_ai_… for AI agents, tl_s_… for services, tl_p_… for personal keys; older keys are tl_…) or BugFixes (bf_…) agent API key as a Bearer token. Projects, boards and roadmaps belong to a Clerk organization: a session sees its active organization's data, and a request without an active organization gets 403. API keys act inside the organization they were created in. Personal and agent keys belong to the person who made them: a personal key is them, so its writes are theirs; an agent key is their AI agent, so its writes are the agent's (shown with its owner's name to everyone else). Service keys belong to the organization, are made by its admins, and attribute writes to the key's name. A read-only key gets 403 for anything but GET. API-key management requires a Clerk session. Stripe webhooks use Stripe-Signature.

Timestamps are stored and returned in UTC. Day-based rules (a sprint's last day) use the caller's timezone from the optional Tracklines-Timezone header (an IANA name such as Europe/London); without it, or for an unknown zone, UTC.

On a sprint's last day (in that timezone, or once ends_at has passed) its scope is locked: moving a ticket into it answers 409, and a ticket created in one of its board's columns goes to the bottom of the project backlog instead (the 201 body has redirected_to_backlog: true). IDs are UUIDs. Error responses are plain-text messages.

Endpoints

Contact

The public contact form; messages go to the TrackLin.es team.

post/enquiriesSend a contact-form message to the TrackLin.es team(public)

Public, no account needed, and rate limited per address. Filed in the ChewedFeed HQ enquiry inbox.

Body object
Responses
  • 204 Sent.
  • 400 A required field is missing
  • 429 Too many messages from this address.
  • 502 The enquiry system couldn't be reached; try again.
  • 503 Enquiries aren't configured.

Projects

Create, list, inspect, update, and delete projects.

get/projectsList projects accessible to this agent

Use a project's ID when creating a ticket directly in its backlog.

Responses
  • 200 Projects owned by the API key's owner. Project[]
  • 401 Missing, invalid, or revoked API key. Error
post/projectsCreate a project
Responses
  • 201 Project created. Project
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 402 Free plan project limit reached.
  • 500 Unexpected server error. Error
get/projects/{projectId}Get a project with its boards and roadmaps
Parameters
  • projectId path, required string
Responses
  • 200 Project details. Project
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
patch/projects/{projectId}Update a project

key_prefix (optional) renames every ticket key in the project (TL-123 → TRK-123); only organization admins can change it. Use 2–6 capital letters or digits starting with a letter; 409 if another project in the org uses it.

Parameters
  • projectId path, required string
Responses
  • 204 Project updated.
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 403 Changing key_prefix requires an organization admin session.
  • 404 Resource not found or not owned by this API key. Error
  • 409 key_prefix is used by another project in the organization.
delete/projects/{projectId}Permanently delete a project and its boards, tickets, roadmaps, repos, and intake

This action cannot be undone and permanently deletes all work under the project. Organization admin session required.

Parameters
  • projectId path, required string
Responses
  • 204 Project deleted.
  • 401 Missing, invalid, or revoked API key. Error
  • 403 Organization admin session required.
  • 404 Resource not found or not owned by this API key. Error
get/projects/{projectId}/labelsLabels in use in a project, most used first
Parameters
  • projectId path, required string
Responses
  • 200 Labels with ticket counts. object[]
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
get/projects/{projectId}/liveStream the project's hosted refinement session

Server-sent events, like the board stream: the latest retained event on connect, then updates, with a heartbeat every 20 seconds. Events are refinement-session (the whole session) and refinement-session-ended.

Parameters
  • projectId path, required string
Responses
  • 200 Server-sent event stream. string
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
  • 503 Valkey is unavailable.
get/projects/{projectId}/live/refinementThe project's running refinement session, with who's here
Parameters
  • projectId path, required string
Responses
  • 200 The session. HostedSession
  • 404 No session running
  • 503 Valkey is unavailable.
post/projects/{projectId}/live/refinementStart a refinement session and host it
Parameters
  • projectId path, required string
Responses
  • 201 Started; the caller is the host. HostedSession
  • 404 Resource not found or not owned by this API key. Error
  • 409 A session is already running; join it instead.
  • 503 Valkey is unavailable.
delete/projects/{projectId}/live/refinementEnd the session for everyone (host only)
Parameters
  • projectId path, required string
Responses
  • 204 Ended.
  • 403 Only the host can end it.
  • 404 No session running.
put/projects/{projectId}/live/refinement/focusSay what the host has open, so followers see it (host only)
Parameters
  • projectId path, required string
Responses
  • 200 The session. HostedSession
  • 403 Only the host can set it.
  • 404 No session running.
put/projects/{projectId}/live/refinement/hostHand over hosting, or take over from a host who has gone

The host can hand over to anyone in the session. Anyone in the session can make themselves host once the host hasn't been seen for a minute.

Parameters
  • projectId path, required string
Body object
Responses
  • 200 The session with its new host. HostedSession
  • 400 That person isn't in the session.
  • 403 Only the host can hand over (or take over from a host who has gone).
  • 404 No session running.
post/projects/{projectId}/live/refinement/joinJoin the session, and stay in it

Call every 30 seconds while taking part; anyone not seen for a minute drops off the list. A host gone for two minutes ends the session.

Parameters
  • projectId path, required string
Responses
post/projects/{projectId}/live/refinement/leaveLeave the session
Parameters
  • projectId path, required string
Responses
  • 204 Left.
get/projects/{projectId}/reposRepositories linked to the project
Parameters
  • projectId path, required string
Responses
post/projects/{projectId}/reposLink a repository the org's connection can see (org admins); one project per repo in an org
Parameters
  • projectId path, required string
Body object
Responses
  • 201 Linked. ProjectRepo
  • 400 The connection can't see that repository.
  • 409 Already linked to a project in this org
delete/projects/{projectId}/reposUnlink a repository (org admins)
Parameters
  • projectId path, required string
  • provider query, required string (github | bitbucket)
  • full_name query, required string
Responses
  • 204 Unlinked.
  • 404 Resource not found or not owned by this API key. Error

Organizations

Inspect membership in the active Clerk organization.

get/google-chatWhether a Google Chat space is set up (any member); never returns its URL
Parameters
  • project_id query string · The project whose space this is; leave out for the whole organization's space.
Responses
  • 200 The space's settings. object
put/google-chatPost notifications into a Google Chat space (org admins)

url is the space's incoming webhook (https://chat.googleapis.com/v1/spaces/…); leave it out to change only the kinds. Defaults: created, review, approval, over_capacity, finished, wont_do. A project's space gets its events; the org's gets every project's.

Parameters
  • project_id query string · The project whose space this is; leave out for the whole organization's space.
Body object
Responses
  • 204 Saved.
  • 400 Not a Google Chat webhook URL
  • 403 Not a signed-in org admin.
delete/google-chatStop posting to a Google Chat space (org admins)
Parameters
  • project_id query string · The project whose space this is; leave out for the whole organization's space.
Responses
  • 204 Removed.
post/google-chat/testPost a test message to a Google Chat space (org admins)
Body object
Responses
  • 204 Sent.
  • 409 No space set up.
  • 502 Google Chat refused it (the reason is in the body).
get/integrations/google-calendarGoogle Calendar (TL-404) for the org; any member. The admin email is for org admins only.
Responses
  • 200 Whether the server offers it and the org is connected, plus what a Workspace admin authorizes for domain-wide delegation. object
put/integrations/google-calendarConnect Google Calendar (org admins). Google is asked first, so only a working connection is saved.
Body object
Responses
  • 204 Connected.
  • 400 Bad input
  • 403 Not an org admin.
  • 502 Google couldn't be reached.
  • 503 The server has no Google service account.
delete/integrations/google-calendarDisconnect Google Calendar (org admins); the time away it found is deleted with it.
Responses
  • 204 Disconnected.
post/integrations/google-calendar/syncSync time away from Google Calendar now (org admins); it also runs hourly and right after connecting.
Responses
  • 200 The connection
  • 404 Not connected.
  • 503 The server has no Google service account.
post/integrations/google-calendar/testCheck Google still lets us read the org's calendars (org admins).
Responses
  • 204 Access works.
  • 400 Google refused; the message says why.
  • 404 Not connected.
get/integrations/{provider}Whether the org is connected to a provider (any org member); never returns the secret
Parameters
  • provider path, required string (bugfixes)
Responses
  • 200 Connection status. object
  • 403 Not a signed-in org admin.
put/integrations/{provider}Connect the org to a provider (org admins). Bugfixes takes an access token from its settings.

The token is sealed (AES-GCM) with the server's TRACKLINES_SECRET_KEY before it's stored; 503 when the server has no key.

Parameters
  • provider path, required string (bugfixes)
Body object
Responses
  • 204 Connected.
  • 400 Invalid request body or field values. Error
  • 403 Not a signed-in org admin.
  • 503 Integrations aren't configured on this server.
delete/integrations/{provider}Disconnect the org from a provider (org admins)

For GitHub, ?installation=<id> disconnects just that account; without it, every GitHub account is disconnected.

Parameters
  • provider path, required string (bugfixes)
  • installation query string · GitHub only: the installation (account) to disconnect.
Responses
  • 204 Disconnected.
  • 403 Not a signed-in org admin.
  • 404 That GitHub account isn't connected to this org.
post/integrations/{provider}/completeFinish connecting after the provider sends the admin back
Parameters
  • provider path, required string (github | bitbucket)
Body object
Responses
  • 204 Connected.
  • 400 The state expired or is for another org.
  • 403 Not a signed-in org admin.
  • 502 The provider refused (e.g. not this app's installation
get/integrations/{provider}/connectWhere an org admin goes to install the GitHub App or authorize Bitbucket

The link carries a sealed state tied to the org (15 minutes). 503 when the provider isn't configured on the server.

Parameters
  • provider path, required string (github | bitbucket)
Responses
  • 200 The link. object
  • 403 Not a signed-in org admin.
  • 503 Provider not configured.
get/integrations/{provider}/reposRepositories the org's connection can see (org admins), first 100
Parameters
  • provider path, required string (github | bitbucket)
Responses
  • 200 Repositories. object[]
  • 409 Not connected.
get/invitationsList pending invitations sent to the caller

Uses the caller's verified Clerk email addresses and does not require an active organization.

Responses
  • 200 Pending invitations addressed to the caller. Invitation[]
  • 401 Missing, invalid, or revoked API key. Error
  • 403 API keys cannot inspect or accept invitations.
  • 502 Clerk could not load the caller's verified email addresses.
get/organizations/adminsList the organization's TrackLin.es admins

Organizations and their members live in Clerk; TrackLin.es only records which members are admins. The first time an org's admins are needed, one is chosen from Clerk and stored: the user who created the organization if they are still a member, otherwise the longest-standing member with the Clerk org:admin role, otherwise the longest-standing member. granted_by records which rule applied (clerk:creator, clerk:admin-role, clerk:earliest-member) or the admin who granted it. If Clerk can't be reached nothing is stored and the next request tries again (502); an organization with no members gets no admin (409).

Responses
  • 200 Admins oldest first OrgAdmin[]
  • 403 No active organization.
  • 409 The organization has no members to make admin.
  • 502 Clerk could not be reached.
put/organizations/admins/{userId}Make an organization member an admin

Org admins only, signed in with a Clerk session (API keys are refused). The user must be a Clerk member of the organization.

Parameters
  • userId path, required string
Responses
  • 204 Granted (or already an admin).
  • 403 Not a signed-in org admin.
  • 422 The user is not a member of this organization.
delete/organizations/admins/{userId}Remove an admin

Org admins only, signed in with a Clerk session. The last admin can't be removed.

Parameters
  • userId path, required string
Responses
  • 204 Removed.
  • 403 Not a signed-in org admin.
  • 409 That is the organization's last admin.
get/organizations/invitationsList invitations created for the active organization

Org admins only. Pending, accepted, and revoked TrackLin.es invitations are returned newest first; expired pending invitations are reported as expired.

Responses
  • 200 Organization invitations. Invitation[]
  • 401 Missing, invalid, or revoked API key. Error
  • 403 Requires a signed-in organization admin.
post/organizations/invitationsInvite an email address to an organization, team, or project

Org admins only. Clerk sends an organization invitation with the org:member role. For team or project scope, the recipient must accept through Clerk and then call the accept operation below with a signed-in session using the invited, verified email address. Team invites create ordinary team membership; project invites create project membership. Organization members retain read access to all organization projects.

Responses
  • 201 Invitation created. accept_url is the Clerk-hosted invitation link. Invitation
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 402 The plan's member limit is reached (Free and Pro: 20, counting invitations not yet accepted); upgrade to Enterprise.
  • 403 Requires a signed-in organization admin.
  • 404 Resource not found or not owned by this API key. Error
  • 409 The email address is already an organization member.
  • 502 Clerk could not create or validate the invitation.
get/organizations/invitations/{id}Inspect an organization invitation
Parameters
  • id path, required string
Responses
  • 200 Invitation details. Invitation
  • 401 Missing, invalid, or revoked API key. Error
  • 403 Requires a signed-in organization admin.
  • 404 Resource not found or not owned by this API key. Error
delete/organizations/invitations/{id}Revoke a pending invitation
Parameters
  • id path, required string
Responses
  • 204 Invitation revoked in Clerk and TrackLin.es.
  • 401 Missing, invalid, or revoked API key. Error
  • 403 Requires a signed-in organization admin.
  • 404 Resource not found or not owned by this API key. Error
  • 409 Only pending invitations can be revoked.
  • 502 Clerk could not revoke the invitation.
post/organizations/invitations/{id}/acceptComplete an accepted Clerk invitation in TrackLin.es

The invitee must first accept the Clerk invitation. This endpoint then verifies the Clerk invitation, active organization membership, and a verified matching email. Team and project invitations create the corresponding local membership; team invitations never assign team leader authority. API keys are refused.

Parameters
  • id path, required string
Responses
  • 204 Invitation accepted and local membership applied.
  • 401 Missing, invalid, or revoked API key. Error
  • 403 The caller is an API key or does not own the invited verified email address.
  • 404 Resource not found or not owned by this API key. Error
  • 409 Clerk invitation or organization membership is not accepted yet.
  • 410 Invitation expired, revoked, or already accepted by another user.
  • 502 Clerk could not verify the invitation or recipient.
get/organizations/meThe caller's roles in their active organization
Responses
  • 200 Whether the caller is an org admin, and the teams they lead. object
  • 403 No active organization.
  • 502 Clerk could not be reached to resolve the first admin.
get/organizations/membersList active organization members

Returns role-free member details for the caller's active organization. Results are paginated.

Parameters
  • limit query integer
  • offset query integer
Responses
  • 200 A page of active organization members. OrganizationMemberPage
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 403 No active organization in the caller's session or API key.
  • 502 The identity provider could not return organization membership.
post/webhooks/bitbucket/{link}Bitbucket repository webhook, one per linked repo(public)

TrackLin.es creates this webhook itself when an org admin links a Bitbucket repo (POST /projects/{id}/repos), with its own random secret (sealed, never shown) and this URL naming the link; unlinking removes it. Deliveries are verified with that link's secret (X-Hub-Signature) and only affect that link's org and repo: pullrequest:* events (X-Event-Key) link PRs to the tickets they mention; MERGED closes them, once.

Parameters
  • link path, required string · The linked repo the webhook was made for.
Responses
  • 204 Accepted.
  • 400 Bad signature.
  • 404 Unknown or unlinked repo.
post/webhooks/clerkReceive a Clerk webhook event (delivered by Svix)(public)

Authenticates the raw payload with the Svix headers and CLERK_WEBHOOK_SECRET (timestamps more than 5 minutes off are rejected). organizationMembership.created completes the new member's pending TrackLin.es invitations to that org (team and project access included) for their verified emails (TL-518); organizationMembership.deleted removes the user's admin and team rows in that org and revokes their API keys for it; user.deleted does the same across every org; organization.deleted removes the org's admins and teams and revokes its API keys (projects, boards and tickets are kept). Other event types are acknowledged and ignored. Safe to replay.

Parameters
  • svix-id header, required string
  • svix-timestamp header, required string · Unix seconds.
  • svix-signature header, required string · Space-separated "v1,<base64>" signatures.
Body object
Responses
  • 204 Event applied or ignored.
  • 400 Invalid body or signature.
  • 503 CLERK_WEBHOOK_SECRET is not set
post/webhooks/githubGitHub App webhook (X-Hub-Signature-256 with GITHUB_WEBHOOK_SECRET)(public)

pull_request events link PRs to the tickets whose keys they (or their commits) mention (in repos linked to a project of an org connected through that installation); merging closes them, once. An uninstalled app disconnects the org. A 5xx makes GitHub redeliver.

Responses
  • 204 Accepted.
  • 400 Bad signature.
  • 503 Not configured.

Teams

Manage role-free teams, team membership, and project links inside the active organization.

put/boards/{boardId}/teamSet the team that runs a board

Org admins only, signed in with a Clerk session. The team's leaders' authority is scoped to the boards it runs. The team must belong to the organization and already be linked to the board's project; removing the team from the project unlinks it from that project's boards. null unlinks.

Parameters
  • boardId path, required string
Body object
Responses
  • 204 Board updated.
  • 403 Not a signed-in org admin.
  • 404 Resource not found or not owned by this API key. Error
  • 422 The team isn't linked to the board's project.
get/projects/{projectId}/teamsList teams linked to a project
Parameters
  • projectId path, required string
Responses
put/projects/{projectId}/teams/{teamId}Link a same-organization team to a project
Parameters
  • projectId path, required string
  • teamId path, required string
Responses
  • 204 Team linked.
  • 403 Requires a signed-in organization admin.
  • 404 Resource not found or not owned by this API key. Error
delete/projects/{projectId}/teams/{teamId}Unlink a team from a project
Parameters
  • projectId path, required string
  • teamId path, required string
Responses
  • 204 Team unlinked.
  • 403 Requires a signed-in organization admin.
get/teamsList teams in the active organization
Responses
  • 200 Teams Team[]
  • 401 Missing, invalid, or revoked API key. Error
  • 403 No active organization.
post/teamsCreate a team
Responses
  • 201 Team created Team
  • 400 Invalid request body or field values. Error
  • 403 Requires a signed-in organization admin.
patch/teams/{teamId}Update a team
Parameters
  • teamId path, required string
Responses
  • 204 Team updated.
  • 403 Requires a signed-in organization admin.
  • 404 Resource not found or not owned by this API key. Error
delete/teams/{teamId}Delete a team
Parameters
  • teamId path, required string
Responses
  • 204 Team and its memberships deleted.
  • 403 Requires a signed-in organization admin.
  • 404 Resource not found or not owned by this API key. Error
put/teams/{teamId}/leaders/{userId}Make a team member a leader

Org admins only, signed in with a Clerk session. A team can have several leaders; leaders must be on the team, and removing them from the team ends their leadership.

Parameters
  • teamId path, required string
  • userId path, required string
Responses
  • 204 They now lead the team.
  • 403 Not a signed-in org admin.
  • 404 Resource not found or not owned by this API key. Error
  • 422 The user is not on the team.
delete/teams/{teamId}/leaders/{userId}Stop a member leading the team (they stay on it)
Parameters
  • teamId path, required string
  • userId path, required string
Responses
  • 204 No longer a leader.
  • 403 Not a signed-in org admin.
  • 404 Resource not found or not owned by this API key. Error
  • 422 The user is not on the team.
get/teams/{teamId}/membersList team members and which of them lead the team
Parameters
  • teamId path, required string
Responses
  • 200 Team members TeamMember[]
  • 404 Resource not found or not owned by this API key. Error
put/teams/{teamId}/members/{userId}Add an active organization member to a team
Parameters
  • teamId path, required string
  • userId path, required string
Responses
  • 204 Membership recorded.
  • 403 Requires a signed-in organization admin.
  • 404 Resource not found or not owned by this API key. Error
  • 422 User is not an active member of the organization.
  • 502 Could not verify membership with the identity provider.
delete/teams/{teamId}/members/{userId}Remove a member from a team
Parameters
  • teamId path, required string
  • userId path, required string
Responses
  • 204 Membership removed.
  • 403 Requires a signed-in organization admin.
  • 404 Resource not found or not owned by this API key. Error

Tickets

Create, inspect, move, and close tickets.

get/assigneesList organization members and AI keys available for assignment

Only members of the active organization and its active AI keys are listed. Service/API keys are excluded.

Responses
  • 200 Assignable identities. object[]
  • 401 Missing, invalid, or revoked API key. Error
  • 502 Could not load organization members from Clerk.
post/columns/{columnId}/ticketsCreate a ticket in a board column

The ticket joins the board's open sprint. On that sprint's last day it goes to the bottom of the project backlog instead: still 201, with column_id null, redirected_to_backlog: true, and any estimate dropped.

Parameters
  • columnId path, required string
Responses
  • 201 Ticket created. Ticket & object
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
  • 500 Unexpected server error. Error
get/mentionsTickets that @mention the caller

One row per ticket, newest mention first. Mentions are recorded when a comment names someone, and stay when the notification is cleared.

Parameters
  • limit query integer
  • hide_done query boolean · true leaves out done and closed tickets.
Responses
  • 200 Mentioned tickets. object[]
  • 400 limit is not 1–100.
  • 401 Missing, invalid, or revoked API key. Error
get/mentions/pageTickets that @mention the caller, a page at a time

The same list as /mentions, with how many there are in all.

Parameters
  • page query integer
  • per_page query integer
  • hide_done query boolean · true leaves out done and closed tickets.
Responses
  • 200 One page of mentioned tickets. object
  • 400 page or per_page is out of range.
  • 401 Missing, invalid, or revoked API key. Error
get/projects/{projectId}/backlogList a project's backlog
Parameters
  • projectId path, required string
  • type query string (bug | feature | task | epic | spike)
Responses
  • 200 Backlog tickets, ordered by position. Ticket[]
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
post/projects/{projectId}/backlogCreate a ticket directly in a project's backlog

Creates a ticket without requiring a board or column. The ticket is attributed to the API key's agent name and defaults to type task if type is omitted.

Parameters
  • projectId path, required string
  • projectId path, required string
Responses
  • 201 Backlog ticket created. Ticket
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
  • 500 Unexpected server error. Error
get/projects/{projectId}/backlog/pageOne page of the backlog, filtered and ordered by the server

By default ready tickets come first, then blocked ones, ordered by backlog position. sort=newest or sort=oldest orders the full filtered backlog by creation date before pagination. The counts field is per type and respects label and priority filters, but not the type filter, for type tabs. Label counts cover the whole backlog. The unpaged list stays at /projects/{projectId}/backlog.

Parameters
  • epic query string · Only this epic's sub-tickets, at any depth.
  • priority query string (low | medium | high | urgent)[] · Any of these priorities; counts follow it.
  • projectId path, required string
  • type query string (bug | feature | task | epic | spike)
  • sort query string (manual | newest | oldest) · Order tickets globally before pagination. Defaults to the manual backlog order.
  • label query string[] · Repeatable; a ticket matches if it has any of them (case-insensitive).
  • page query integer
  • per_page query integer
Responses
  • 200 The page and per-type counts. object
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
get/projects/{projectId}/epicsA project's epics, with progress and size

Epics are large pieces of work: they stay in the backlog (never on a board or in a sprint), take no estimate, and can't sit anywhere inside another epic. Work joins one by becoming its sub-ticket. Progress counts the epic's direct sub-tickets (duplicates left out); size sums their estimates as points. Open epics come first, by backlog position.

Parameters
  • projectId path, required string
Responses
  • 200 Epics. object[]
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
get/projects/{projectId}/open-ticketsTickets that aren't done, across boards and backlog, in pick order

Every ticket in the project that isn't in its board's Done column, plus the backlog, without descriptions. Ordered the way work is picked: tickets in their board's open sprint first, then priority (urgent first), then on a board before in the backlog, then oldest. The MCP tool list_open_tickets maps to this.

Parameters
  • projectId path, required string
  • assignee query string (unassigned | me) · unassigned, or me (the caller's agent name or user id). Omit for everyone.
  • blocked query string (exclude) · exclude leaves out tickets waiting on unfinished work.
  • priority query string (low | medium | high | urgent)[] · Any of these priorities.
Responses
  • 200 Open tickets. object[]
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
get/searchSearch the organization's tickets

Full-text over titles (weighted highest), descriptions and comments. Every word must match, as a prefix, so it works while typing; punctuation is ignored. A ticket key in q (TL-123, case-insensitive) returns just that ticket. Ranked by relevance, then most recently changed. Without q it lists by recent change, filtered. The MCP tool search_tickets maps to this.

Parameters
  • epic query string · Only this epic's sub-tickets, at any depth.
  • q query string
  • project query string
  • board query string
  • type query string (bug | feature | task | epic | spike)[] · Any of.
  • priority query string (low | medium | high | urgent)[] · Any of.
  • label query string[] · Any of (case-insensitive).
  • assignee query string · me (the caller), unassigned, or a user id / agent name.
  • status query string (open | done)
  • match query string (any) · any: a ticket matching any word (of three letters or more) will do, most matches first, for spotting duplicates despite typos. Default: every word must match.
  • limit query integer
  • page query integer · 1-based, with limit. "My work" is assignee=me&status=open across every board and project.
Responses
  • 200 Matching tickets, best first. Ticket & object[]
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
post/short-linksA short link for a TrackLin.es link

For "Copy link": shortens a link to this site (tickets, boards…) through 1tn. The same link always gives the same short link. Links to any other site are refused.

Body object
Responses
  • 200 The short link. object
  • 400 Not a link to this site.
  • 401 Missing, invalid, or revoked API key. Error
  • 502 The shortener couldn't be reached or refused it.
get/ticket-keys/{key}A ticket by its key (e.g. TL-123, case-insensitive), same as GET /tickets/{ticketId}

MCP tools also accept keys wherever they take a ticket_id, parent_id or ticket_ids.

Parameters
  • key path, required string
Responses
  • 200 The ticket with where it lives. TicketDetail
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
get/tickets/{ticketId}Get a ticket and its board context

Use board_id to look up the Done column before closing a ticket.

Parameters
  • ticketId path, required string
Responses
  • 200 Ticket details. TicketDetail
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
patch/tickets/{ticketId}Update a ticket

title is required; empty type and priority retain their current values.

Parameters
  • ticketId path, required string
Responses
  • 204 Ticket updated.
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
delete/tickets/{ticketId}Delete a ticket
Parameters
  • ticketId path, required string
Responses
  • 204 Ticket deleted.
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
put/tickets/{ticketId}/assigneeAssign or unassign a ticket

Set assignee to an active member of the caller's organization or an active AI key name; set it to null to unassign. Server/service keys cannot be assignees.

Parameters
  • ticketId path, required string
Body object
Responses
  • 200 Updated ticket. Ticket
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
  • 502 Could not verify organization membership with Clerk.
post/tickets/{ticketId}/backlogMove a ticket into its project's backlog

Agents cannot move tickets awaiting human review into the backlog.

Parameters
  • ticketId path, required string
Responses
  • 200 Moved, with its open sub-tickets on the board: {also_moved: [{id, key, title}]}. If one can't go, nothing moves and the error names it.
  • 204 Ticket moved to backlog.
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
  • 409 An agent attempted to bypass a pending human review.
put/tickets/{ticketId}/blocked-byReplace the tickets blocking this ticket

Use an empty ticket_ids array to clear dependencies. Dependencies must be in the same project and cannot form a cycle. A done ticket can keep or drop its blockers but not gain new ones (409).

Parameters
  • ticketId path, required string
Body object
Responses
  • 204 Dependencies replaced.
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
  • 409 The ticket is done and the list adds a blocker.
get/tickets/{ticketId}/bugfixesThe Bugfixes panel for a ticket Bugfixes created

The linked crash report's live details, fetched server-side with the org's Bugfixes connection and cached for a minute. regressed is true when the report is open and was seen after the ticket was done. When the org hasn't connected Bugfixes (reason not_connected) or Bugfixes can't be reached (unavailable), available is false but the link is still returned.

Parameters
  • ticketId path, required string
Responses
  • 200 The panel. object
  • 404 The ticket didn't come from Bugfixes.
post/tickets/{ticketId}/claimAssign an unassigned ticket to the caller

AI keys and signed-in people may claim tickets. Server/service keys cannot claim work.

Parameters
  • ticketId path, required string
Responses
  • 200 Claimed ticket. Ticket
  • 401 Missing, invalid, or revoked API key. Error
  • 403 Server/service API keys cannot claim tickets.
  • 404 Resource not found or not owned by this API key. Error
  • 409 Ticket is already assigned or blocked by another ticket.
post/tickets/{ticketId}/duplicateClose a ticket as a duplicate

Marks ticketId as a duplicate of another ticket in the same project, closes it, and links it from the original. Optionally copies labels and comments to the original. Duplicate tickets do not count toward sprint velocity or carry-over. MCP tool mark_duplicate accepts ticket keys or ids.

Parameters
  • ticketId path, required string
Body object
Responses
  • 204 Ticket marked as a duplicate.
  • 400 Tickets must be different
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
  • 409 The ticket is already marked as a duplicate.
put/tickets/{ticketId}/externalLink a ticket to where an integration made it (API keys only), e.g. a Bugfixes report

The same object can be sent as external when creating a backlog ticket with an API key. A null body clears it.

Parameters
  • ticketId path, required string
Responses
  • 204 Linked.
  • 400 Invalid reference (source must be bugfixes; project and id required; url http(s)).
  • 403 Only integrations (API keys) set references.
  • 404 Resource not found or not owned by this API key. Error
get/tickets/{ticketId}/groupOpen sub-tickets that would move with a ticket leaving its board

When a ticket leaves its board (to the backlog, or another board), its sub-tickets on that board that aren't done, at any depth, go with it. Finished ones stay as the board's history; ones on other boards belong to those teams. Empty for a backlog ticket.

Parameters
  • ticketId path, required string
Responses
  • 200 Sub-tickets, parents first. object[]
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
get/tickets/{ticketId}/historyA ticket's lifecycle history, oldest first

Each stage the ticket entered, or skipped on the way to a later one: the backlog, a board column (named as it was then), and resolved (done, wont_do or duplicate). Created straight on a board, its backlog and any earlier columns are skipped; moving forward skips the columns jumped over. Append-only and recorded with each change. Same access as reading the ticket; resolved tickets keep their history. History starts from when it was introduced (October 2026).

Parameters
  • ticketId path, required string
Responses
  • 200 Entries, oldest first. object[]
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
put/tickets/{ticketId}/labelsReplace a ticket's labels
Parameters
  • ticketId path, required string
Body object
Responses
  • 200 Normalised labels as stored. object
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
post/tickets/{ticketId}/moveMove a ticket to another column

To close a ticket, first get its board, then move it to the column with the greatest position (the board's Done column). position may be zero. Moving a ticket into a sprint (from the backlog, another board or outside the sprint) on the sprint's last day answers 409; moves inside the sprint, to Done, or out of it are allowed.

Parameters
  • ticketId path, required string
Responses
  • 200 Either an agent (API key) moved it into Done on a board with agent review: it waits in the column before Done for a person's review (see /tickets/{ticketId}/review). Or it moved to another board and its open sub-tickets on the old board came too (also_moved); if one can't, nothing moves and the error names it. object
  • 204 Ticket moved.
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
  • 409 The target board's sprint ends today, so its scope is locked.
  • 500 Unexpected server error. Error
get/tickets/{ticketId}/orgWhich of my organizations a ticket is in

For a ticket link opened while another organization is active, so the app can offer to switch. Answers only a signed-in person who belongs to the ticket's organization; anyone else (and API keys) gets 404, as if it didn't exist.

Parameters
  • ticketId path, required string
Responses
  • 200 The ticket's organization. object
  • 404 Resource not found or not owned by this API key. Error
put/tickets/{ticketId}/planned-sprintPlan a backlog ticket into a planned sprint, sized on that board's scale

The ticket stays in the backlog until the planned sprint starts. Without an estimate it keeps one already on the same scale. planned_sprint_id null takes it out of the plan (and clears the estimate). Going over capacity is allowed; the sprint then needs approval before it can start.

Parameters
  • ticketId path, required string
Body object
Responses
  • 204 Planned.
  • 400 Estimate isn't on the board's scale.
  • 404 Resource not found or not owned by this API key. Error
  • 409 The ticket is on a board
get/tickets/{ticketId}/prsPull requests linked to the ticket, newest first

A PR in a repo linked to the ticket's project is linked when its branch, title, description or commit messages mention the ticket's key (TL-123; only the project's own prefix counts). Kept up to date by the provider webhooks. When a linked PR is merged, the ticket moves to its board's Done column (or is resolved in the backlog) with a "Closed by" comment.

Parameters
  • ticketId path, required string
Responses
  • 200 Linked PRs. object[]
post/tickets/{ticketId}/releaseClear the caller's assignment from a ticket

AI keys and signed-in people may release ticket assignments. Server/service keys cannot.

Parameters
  • ticketId path, required string
Responses
  • 204 Assignment cleared.
  • 401 Missing, invalid, or revoked API key. Error
  • 403 Server/service API keys cannot release ticket assignments.
  • 404 Resource not found or not owned by this API key. Error
  • 409 Ticket is not assigned to the caller.
post/tickets/{ticketId}/resolveClose a ticket as done or won't do

Marks a backlog ticket resolved without putting it on a board. A resolved ticket counts as done everywhere (blockers, sub-ticket progress, the done flag), leaves backlog pages and open-ticket lists, keeps its links and stays readable by id. Resolving again is a no-op; moving it onto a board reopens it. If it was the last unfinished sub-ticket of its parent, the parent is completed too (resolved if it's in the backlog, moved to its board's Done column if it's on a board), and so on up the chain. A ticket on a board is moved to the board's Done column with the resolution (moving it out again reopens it), for people and service keys (e.g. Bugfixes when a report is resolved or ignored). AI keys finish board tickets by moving them instead (409), so a board's agent review still applies. MCP tool resolve_ticket. With resolution wont_do it's closed as decided against (the ticket's resolution says so; the reason, if given, is added as a comment). No body resolves it as done. Agents cannot resolve tickets that have entered human review.

Parameters
  • ticketId path, required string
Body object
Responses
  • 204 Resolved.
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
  • 409 The ticket is on a board or an agent is attempting to bypass human review.
post/tickets/{ticketId}/reviewApprove an agent's finished ticket (to Done) or send it back (to the first column)

People only. The comment, if given, is added to the ticket by the reviewer.

Parameters
  • ticketId path, required string
Body object
Responses
  • 204 Reviewed.
  • 400 Invalid request body or field values. Error
  • 403 Agents (API keys) can't review.
  • 404 Resource not found or not owned by this API key. Error
  • 409 The ticket isn't waiting for review.

Comments

Append updates to a ticket conversation.

get/tickets/{ticketId}/commentsList a ticket's conversation
Parameters
  • ticketId path, required string
Responses
  • 200 Comments in chronological order. Comment[]
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
post/tickets/{ticketId}/commentsAppend an update to a ticket

Adds a top-level comment to the ticket conversation. Use this for progress reports or follow-up findings; it does not replace the ticket description.

Parameters
  • ticketId path, required string
Responses
  • 201 Comment appended. Comment
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
  • 500 Unexpected server error. Error

Boards

Team boards and columns.

get/board-templatesBoard templates (built-ins, then the organization's own)
Responses
post/board-templatesSave an organization board template

Org admins only, signed in with a Clerk session. Send a full template, or {name, from_board_id} to copy an existing board's columns, WIP limits, style and estimate scale.

Body object
Responses
  • 201 Template saved. BoardTemplate
  • 400 Invalid request body or field values. Error
  • 403 Requires a signed-in organization admin.
  • 404 Resource not found or not owned by this API key. Error
delete/board-templates/{templateId}Delete an organization template (built-ins can't be deleted)
Parameters
  • templateId path, required string
Responses
  • 204 Deleted.
  • 400 Built-in templates can't be deleted.
  • 403 Requires a signed-in organization admin.
  • 404 Resource not found or not owned by this API key. Error
get/boards/{boardId}Get board columns and tickets

Use the column with the greatest position as the Done column when closing a ticket.

Parameters
  • boardId path, required string
Responses
  • 200 Board, with ordered columns and their current tickets. Board
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
patch/boards/{boardId}Rename a board or change its settings

Provide any of name, estimate_scale and style. Changing estimate_scale clears the estimates of tickets on the board, except those in closed sprints (kept for velocity history). Switching to kanban ends the open sprint, if any: it closes with no successor, keeps its done tickets, and its unfinished tickets stay on the board outside any sprint. Kanban boards can't start sprints and show only Done tickets finished in the last 14 days.

Parameters
  • boardId path, required string
Body object
Responses
  • 204 Board updated.
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 403 Requires a signed-in organization admin or the linked team's leader.
  • 404 Resource not found or not owned by this API key. Error
delete/boards/{boardId}Delete a board
Parameters
  • boardId path, required string
Responses
  • 204 Board deleted.
  • 401 Missing, invalid, or revoked API key. Error
  • 403 Requires a signed-in organization admin.
  • 404 Resource not found or not owned by this API key. Error
post/boards/{boardId}/archiveArchive a used board (board managers)

Takes it off the project's boards; its history stays. Refused (409) while it has unfinished tickets. Its open sprint closes with no next sprint (finished tickets stay with it for velocity); its planned sprints are dropped and their tickets go back to the backlog unplanned. No tickets can be added to or moved onto an archived board (409).

Parameters
  • boardId path, required string
Responses
  • 204 Archived.
  • 403 Not an org admin or this board's team leader.
  • 404 Resource not found or not owned by this API key. Error
  • 409 It still has unfinished tickets.
get/boards/{boardId}/flowCycle time and weekly throughput for finished tickets

Returns tickets completed during the requested rolling window of UTC calendar weeks, including empty throughput weeks. Cycle-time percentiles include only tickets with a recorded started_at; older tickets without an exact start time remain in throughput but have a null cycle_days.

Parameters
  • boardId path, required string
  • weeks query integer · Number of UTC calendar weeks including the current week.
Responses
  • 200 Finished tickets, cycle-time percentiles, and throughput by week. BoardFlow
  • 400 weeks must be between 1 and 52.
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
get/boards/{boardId}/liveStream standup and refinement changes for a board

Server-sent events fan out across backend instances through Valkey. Connects with the latest retained event, then streams updates; sends a heartbeat comment every 20 seconds. Events are named standup, standup-ended, or refinement.

Parameters
  • boardId path, required string
Responses
  • 200 Server-sent event stream. string
  • 401 Missing, invalid, or revoked API key. Error
  • 403 No active organization in the caller's session or API key.
  • 404 Resource not found or not owned by this API key. Error
  • 503 Valkey is unavailable.
get/boards/{boardId}/live/standupGet the current board standup session
Parameters
  • boardId path, required string
Responses
  • 200 The active standup session LiveStandup
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
  • 503 Valkey is unavailable.
post/boards/{boardId}/live/standupStart or replace the board standup session
Parameters
  • boardId path, required string
Body object
Responses
  • 201 Started session LiveStandup
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
  • 503 Valkey is unavailable.
post/boards/{boardId}/live/standup/actionAdvance, jump, pause, resume, or end the current standup
Parameters
  • boardId path, required string
Body object
Responses
  • 200 Updated session LiveStandup
  • 204 Session ended.
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
  • 503 Valkey is unavailable.
put/boards/{boardId}/live/standup/focusSay what the host has open and how the board is filtered (host only)
Parameters
  • boardId path, required string
Responses
  • 200 The session. HostedSession
  • 403 Only the host can set it.
  • 404 No standup running.
put/boards/{boardId}/live/standup/hostHand over hosting (e.g. to the next speaker), or take over from a host who has gone
Parameters
  • boardId path, required string
Body object
Responses
  • 200 The session with its new host. HostedSession
  • 400 That person isn't in the standup.
  • 403 Only the host can hand over (or take over from a host who has gone).
  • 404 No standup running.
post/boards/{boardId}/live/standup/joinJoin the standup, and stay in it (call every 30 seconds)
Parameters
  • boardId path, required string
Responses
post/boards/{boardId}/live/standup/leaveLeave the standup
Parameters
  • boardId path, required string
Responses
  • 204 Left.
get/boards/{boardId}/live/standup/sessionWho's in the standup and what the host has open

Starting a standup makes the starter its host; ending it ends the session. Events (standup-session, standup-session-ended) go out on the board's live stream.

Parameters
  • boardId path, required string
Responses
  • 200 The session. HostedSession
  • 404 No standup running
  • 503 Valkey is unavailable.
post/boards/{boardId}/restorePut an archived board back on its project (board managers)
Parameters
  • boardId path, required string
Responses
  • 204 Restored.
  • 404 Resource not found or not owned by this API key. Error
get/projects/{projectId}/archived-boardsA project's archived boards, most recently archived first
Parameters
  • projectId path, required string
Responses
post/projects/{projectId}/boardsCreate a team board, optionally from a template
Parameters
  • projectId path, required string
Responses
  • 201 Board created. Board
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 403 Requires a signed-in organization admin.
  • 404 Resource not found or not owned by this API key. Error

Columns

Board workflow columns.

post/boards/{boardId}/columnsAdd a column to a board

The new column goes just before the last column (Done), which stays last. A ticket is done when it's in the board's last column.

Parameters
  • boardId path, required string
Responses
  • 201 Column created. Column
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 403 Requires a signed-in organization admin or the linked team's leader.
  • 404 Resource not found or not owned by this API key. Error
put/boards/{boardId}/columnsSet a board's whole column layout at once

The edit board page's save. Columns in order, each an existing column (id) or a new one (no id), with its name and WIP limit. The first (To do) and last (Done) stay first and last, and take no WIP limit. Columns left out are deleted, refused (409) while they hold tickets in the current sprint. All or nothing. Board managers only.

Parameters
  • boardId path, required string
Body object
Responses
  • 204 Saved.
  • 400 Invalid request body or field values. Error
  • 403 Only organization admins and the board's team leaders can change its columns.
  • 404 Resource not found or not owned by this API key. Error
  • 409 A column left out still has tickets in the current sprint.
put/boards/{boardId}/columns/orderReplace a board's column order

Every column exactly once, with the last column (Done) still last; moving it is a 400, since a ticket is done when it's in the last column.

Parameters
  • boardId path, required string
Body object
Responses
  • 204 Column order updated.
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 403 Requires a signed-in organization admin or the linked team's leader.
  • 404 Resource not found or not owned by this API key. Error
patch/columns/{columnId}Rename a column and/or set its work-in-progress limit
Parameters
  • columnId path, required string
Body object
Responses
  • 204 Column updated.
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 403 Requires a signed-in organization admin or the linked team's leader.
  • 404 Resource not found or not owned by this API key. Error
delete/columns/{columnId}Delete an empty column
Parameters
  • columnId path, required string
Responses
  • 204 Column deleted.
  • 401 Missing, invalid, or revoked API key. Error
  • 403 Requires a signed-in organization admin or the linked team's leader.
  • 404 Resource not found or not owned by this API key. Error
  • 409 Column still contains tickets.

Attachments

UploadThing attachment metadata.

get/attachments/retentionThe org's file clean-up

Files due to be deleted (warned, soonest first) and files the clean-up has deleted (newest first, the latest 500). Org admins only; API keys can't.

Responses
  • 200 Due and deleted files. object
  • 401 Missing, invalid, or revoked API key. Error
  • 403 Not an org admin
delete/attachments/{attachmentId}Delete an attachment and its stored file
Parameters
  • attachmentId path, required string
Responses
  • 204 Attachment deleted.
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
post/attachments/{attachmentId}/keepKeep a year-old file for another year

Files are warned about a year after they're added (or last kept) and deleted at 13 months unless kept. Org admins and the file's uploader can keep it; API keys can't.

Parameters
  • attachmentId path, required string
Responses
  • 204 Kept for another year.
  • 401 Missing, invalid, or revoked API key. Error
  • 403 Not an org admin or the file's uploader
  • 404 Resource not found or not owned by this API key. Error
get/tickets/{ticketId}/attachmentsList ticket attachments
Parameters
  • ticketId path, required string
Responses
  • 200 Attachment records. Attachment[]
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
post/tickets/{ticketId}/attachmentsRecord an uploaded UploadThing file on a ticket

The file must already be uploaded; this endpoint stores its metadata and does not upload bytes.

Parameters
  • ticketId path, required string
Responses
  • 201 Attachment recorded. Attachment
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
  • 409 Ticket is in its Done column.

Sprints

Board sprints.

get/boards/{boardId}/planned-sprintsA board's planned sprints with their tickets and capacity
Parameters
  • boardId path, required string
Responses
  • 200 Planned sprints, next first (at most 2). PlannedSprint[]
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
post/boards/{boardId}/planned-sprintsPlan a sprint after the current one (org admins and the board team's leaders)
Parameters
  • boardId path, required string
Body object
Responses
  • 201 The board's planned sprints. PlannedSprint[]
  • 400 Invalid request body or field values. Error
  • 403 Not an org admin or the board team's leader.
  • 409 Already 2 planned sprints
get/boards/{boardId}/reports/sprintsHow a board's sprints went over a period (TL-397): sprints that closed in it plus the open one, totals, the period before for trends, and a one-line summary. Never per person.
Parameters
  • boardId path, required string
  • from query string · First day (in the caller's Tracklines-Timezone); default 90 days ago.
  • to query string · Last day
  • format query string (json | md | markdown) · md (or markdown): the report as a Markdown download (text/markdown, attachment) with Mermaid charts, for wikis and docs (TL-399).
Responses
  • 200 The report. Sprints from before reports were recorded have estimated (planned = what they held at close) and no added/removed. object
  • 400 Bad dates.
  • 404 Not your organization's board.
get/boards/{boardId}/sprintsList a board's sprints
Parameters
  • boardId path, required string
Responses
  • 200 Sprints, newest first. Sprint[]
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
post/boards/{boardId}/sprintsStart a sprint and pull in unassigned board tickets
Parameters
  • boardId path, required string
Body object
Responses
  • 201 Sprint started. Sprint
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 403 Requires a signed-in organization admin or the linked team's leader.
  • 404 Resource not found or not owned by this API key. Error
  • 409 Board already has an open sprint, or is a kanban board.
get/boards/{boardId}/velocityVelocity per closed sprint, plus the open sprint's burn data

A closed sprint's completed value is its tickets that were done when it closed (closing carries the rest into the next sprint). Unit is points on a board with an estimate scale (t-shirt sizes count XS=1, S=2, M=3, L=5, XL=8; unestimated tickets count 0), otherwise tickets.

Parameters
  • boardId path, required string
Responses
  • 200 Velocity history and burn data. Velocity
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
get/org/reports/sprintsEvery project in the organization together (TL-398), by project. Organization admins only (people, not API keys).
Parameters
  • from query string · First day (in the caller's Tracklines-Timezone); default 90 days ago.
  • to query string · Last day
  • format query string (json | md | markdown) · md (or markdown): the report as a Markdown download (text/markdown, attachment) with Mermaid charts, for wikis and docs (TL-399).
Responses
  • 200 The roll-up. ReportRollup
  • 403 Not an organization admin.
patch/planned-sprints/{plannedSprintId}Change a planned sprint's length and/or goal (org admins and the board team's leaders)
Parameters
  • plannedSprintId path, required string
Body object
Responses
  • 200 The board's planned sprints. PlannedSprint[]
  • 400 Invalid request body or field values. Error
  • 403 Not an org admin or the board team's leader.
  • 404 Resource not found or not owned by this API key. Error
delete/planned-sprints/{plannedSprintId}Remove a planned sprint; its tickets stay in the backlog, unplanned and unestimated
Parameters
  • plannedSprintId path, required string
Responses
  • 204 Removed; a later planned sprint moves up.
  • 403 Not an org admin or the board team's leader.
  • 404 Resource not found or not owned by this API key. Error
post/planned-sprints/{plannedSprintId}/approveAccept a planned sprint's current total over capacity (org admins and the board team's leaders, signed in)

Records the total, who and when. If the planned total later goes above it, the sprint needs approval again.

Parameters
  • plannedSprintId path, required string
Responses
  • 200 The planned sprint. PlannedSprint
  • 403 Not an org admin or the board team's leader
  • 404 Resource not found or not owned by this API key. Error
get/projects/{projectId}/reports/sprintsA project's sprint boards together (TL-398): each board's report, points and tickets totalled apart, predictability across both, and calendar months. Anyone in the organization.
Parameters
  • projectId path, required string
  • from query string · First day (in the caller's Tracklines-Timezone); default 90 days ago.
  • to query string · Last day
  • format query string (json | md | markdown) · md (or markdown): the report as a Markdown download (text/markdown, attachment) with Mermaid charts, for wikis and docs (TL-399).
Responses
  • 200 The roll-up. ReportRollup
  • 400 Bad dates.
  • 404 Not your organization's project.
get/sprints/{sprintId}One sprint, read-only, with its burn data and tickets

For a closed sprint, tickets are the ones it finished (closing moves the rest to the next sprint) and burn.total is what it held when it closed; sprints closed before scope was recorded fall back to what they finished and carried_over is null. burn.ends_at is the close time. For an open sprint, everything reflects now.

Parameters
  • sprintId path, required string
Responses
  • 200 The sprint. Sprint & object
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
patch/sprints/{sprintId}Change the length of an open or scheduled sprint
Parameters
  • sprintId path, required string
Body object
Responses
  • 200 Updated sprint. Sprint
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 403 Requires a signed-in organization admin or the linked team's leader.
  • 404 Resource not found or not owned by this API key. Error
post/sprints/{sprintId}/closeClose a sprint; optionally start or schedule the next one

With no body, the sprint just closes: unfinished tickets stay on the board, out of any sprint, until the next POST /boards/{id}/sprints, which takes them in along with a waiting planned sprint (and its goal). Give next_length_days and/or next_starts_at to open the next sprint at once instead, as auto-close does when a sprint runs out: unfinished tickets carry over, and a planned sprint (refinement) within capacity or approved becomes the next sprint (its length unless next_length_days is given, and its tickets, which join the first column). A planned sprint over capacity without approval isn't promoted and stays planned.

Parameters
  • sprintId path, required string
Body object
Responses
  • 200 The next sprint, started or scheduled (when asked for). Sprint
  • 204 Closed; no next sprint started.
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 403 Requires a signed-in organization admin or the linked team's leader.
  • 404 Resource not found or not owned by this API key. Error

Live

Hosted standups and refinements that people join and follow.

get/live/sessionsThe organization's running standups and refinements

Every hosted standup (on a board) and refinement (on a project) running in the caller's organization, in one request. Archived boards are left out. Empty when live sessions are off.

Responses
  • 200 Running sessions, by project. object[]
  • 401 Missing, invalid, or revoked API key. Error

Roadmaps

Project roadmaps and linked ticket progress.

post/projects/{projectId}/roadmapsCreate a roadmap in a project

Org admins and the project's team leaders. Visibility defaults to team; public needs a signed-in org admin (API keys get 403).

Parameters
  • projectId path, required string
Responses
  • 201 Roadmap created. Roadmap
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
get/roadmapsList the caller's roadmaps
Responses
  • 200 Roadmaps owned by the caller. Roadmap[]
  • 401 Missing, invalid, or revoked API key. Error
get/roadmaps/{roadmapId}Get a roadmap

Public roadmaps are readable without a token; login_only and team roadmaps require a signed-in member of the owning organization. Non-owner readers see progress counts but not linked-ticket IDs or titles.

Parameters
  • roadmapId path, required string
Responses
  • 200 Roadmap and items. Roadmap
  • 401 Missing, invalid, or revoked API key. Error
  • 403 Roadmap is restricted to its owner.
  • 404 Resource not found or not owned by this API key. Error
put/roadmaps/{roadmapId}Update a roadmap

Org admins and the project's team leaders. Leaving out visibility keeps it. Changing visibility to or from public needs a signed-in org admin (API keys get 403).

Parameters
  • roadmapId path, required string
Responses
  • 204 Roadmap updated.
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
delete/roadmaps/{roadmapId}Delete a roadmap

Signed-in org admins only; API keys get 403.

Parameters
  • roadmapId path, required string
Responses
  • 204 Roadmap deleted.
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
put/roadmaps/{roadmapId}/itemsReplace a roadmap's item list

Existing item IDs are updated in place; IDs omitted from the submitted list are removed. Unknown or omitted IDs create items.

Parameters
  • roadmapId path, required string
Responses
  • 204 Roadmap items replaced.
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
put/roadmaps/{roadmapId}/items/{itemId}/ticketsReplace tickets linked to a roadmap item

Linking an epic counts its sub-tickets towards the item's progress (not the epic itself), worked out on every read, so ones added to the epic later count too.

Parameters
  • roadmapId path, required string
  • itemId path, required string
Body object
Responses
  • 204 Linked tickets replaced.
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error
get/roadmaps/{roadmapId}/updatesList dated progress updates

Uses the roadmap's public, login-only, or team visibility rules. Responses contain only update status, note, and date; linked ticket and organization details are never included.

Parameters
  • roadmapId path, required string
Responses
  • 200 Updates oldest first. RoadmapUpdate[]
  • 401 Missing, invalid, or revoked API key. Error
  • 403 Roadmap is restricted to its owner.
  • 404 Resource not found or not owned by this API key. Error
post/roadmaps/{roadmapId}/updatesPublish a dated progress update

Appends an immutable update to a roadmap owned by the caller's active organization.

Parameters
  • roadmapId path, required string
Responses
  • 201 Update published. RoadmapUpdate
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error

API keys

Manage AI agent and server/service API keys with a Clerk session.

get/keysList the caller's active API keys, and the organization's service keys

Service keys belong to the organization, so every member sees them and when they expire, whoever made them.

Responses
  • 200 API key metadata. Secret values are never returned after creation. ApiKey[]
  • 401 Missing, invalid, or revoked API key. Error
post/keysCreate a TrackLin.es API key

The plaintext key is returned only once. This route requires a Clerk session. Only organization admins can create service keys.

Responses
  • 201 Key created; save the returned `key` securely now. CreatedApiKey
  • 400 Invalid request body or field values. Error
  • 401 Missing, invalid, or revoked API key. Error
  • 403 Only organization admins can create service keys.
  • 500 Unexpected server error. Error
delete/keys/{keyId}Revoke an API key

Your own keys; organization admins can also revoke any of the organization's service keys.

Parameters
  • keyId path, required string
Responses
  • 204 API key revoked.
  • 401 Missing, invalid, or revoked API key. Error
  • 404 Resource not found or not owned by this API key. Error

Billing

Stripe subscription and webhook operations.

get/plansThe plans, their project limits and prices (public)(public)
Responses
  • 200 Free, Pro and Enterprise. projects null means unlimited; price is in the currency's smallest unit, from Stripe, and missing when it can't be read. object[]
get/subscriptionGet the active organization's plan and project limit

The plan belongs to the organization; everyone in it sees it, and its admins buy and manage it.

Responses
  • 200 Subscription status. object
  • 401 Missing, invalid, or revoked API key. Error
  • 503 Billing status unavailable.
post/subscription/checkoutCreate a Stripe checkout session for the active organization's plan

For an organization that isn't paying yet. One already on a paid plan changes plan instead (POST /subscription/plan).

Body object
Responses
  • 200 Stripe Checkout URL. URLResponse
  • 401 Missing, invalid, or revoked API key. Error
  • 403 Not a signed-in admin of the active organization.
  • 409 The organization is already subscribed.
  • 502 Stripe is unavailable.
  • 503 Billing is not configured or unavailable.
post/subscription/planChange the organization's paid plan (Pro ↔ Enterprise), prorated

Moves the existing Stripe subscription to the other plan's price; Stripe prorates the difference. Org admins only.

Body object
Responses
  • 204 Changed; the new project limit applies straight away.
  • 400 Unknown plan.
  • 403 Not a signed-in admin of the active organization.
  • 409 No subscription to change (check out instead)
  • 502 Stripe is unavailable.
  • 503 Billing (or that plan) isn't configured.
post/subscription/portalCreate a Stripe billing portal session for the active organization
Responses
  • 200 Stripe Billing Portal URL. URLResponse
  • 401 Missing, invalid, or revoked API key. Error
  • 403 Not a signed-in admin of the active organization.
  • 409 The organization has no Stripe subscription (free
  • 502 Stripe is unavailable.
  • 503 Billing is not configured or unavailable.
post/webhooks/stripeReceive a Stripe webhook event(public)

Authenticates the raw payload with Stripe-Signature. The handler is mounted at this path both under /api and at the API root.

Parameters
  • Stripe-Signature header, required string
Body object
Responses
  • 200 Event acknowledged.
  • 400 Invalid body or signature.
  • 502 Stripe is unavailable while processing the event.
  • 503 Billing is unavailable.

System

Health check.

get/healthCheck API and backing services health(public)
Responses
  • 200 API, PostgreSQL, and Valkey are healthy. string
  • 503 Database or Valkey is unavailable.
get/openapi.jsonThis API description, as JSON(public)

Public; no key needed. The same document as /openapi.yaml.

Responses
  • 200 The OpenAPI document. object
get/openapi.yamlThis API description, as YAML(public)

Public; no key needed. Built into the API, so it always matches what's running.

Responses
  • 200 The OpenAPI document. string

Intake

post/intake-submissions/{submissionId}/dismissClose a pending request without making a ticket
Parameters
  • submissionId path, required string
Responses
  • 204 Dismissed.
  • 404 Resource not found or not owned by this API key. Error
  • 409 Already triaged.
post/intake-submissions/{submissionId}/promoteTurn a pending request into an unassigned backlog ticket
Parameters
  • submissionId path, required string
Responses
  • 200 Promoted IntakeSubmission
  • 404 Resource not found or not owned by this API key. Error
  • 409 Already triaged.
get/intake/{token}Whether a request form link is open (public, no account)(public)

Says nothing else about the project.

Parameters
  • token path, required string · The project's unlisted form link token.
Responses
  • 200 Open. object
  • 404 Closed or unknown link.
post/intake/{token}Send a bug report or feature request through a project's form (public, no account)(public)

Held for the team to triage; never put on a board. Limits: 5 per sender per hour, 200 per project per day. A filled-in website field (hidden from people) marks a bot: accepted and dropped.

Parameters
  • token path, required string · The project's unlisted form link token.
Body object
Responses
  • 202 Received.
  • 400 Invalid request.
  • 404 Closed or unknown link.
  • 429 Too many requests from this sender.
get/projects/{projectId}/intakeThe project's request form, open (with its link token) or closed
Parameters
  • projectId path, required string
Responses
put/projects/{projectId}/intakeOpen or close the request form; rotate replaces the link (the old one stops working)

Org admins only, in a signed-in session. API keys get 403, even an admin's.

Parameters
  • projectId path, required string
Body object
Responses
  • 200 Settings. IntakeSettings
  • 403 Not a signed-in org admin.
  • 404 Resource not found or not owned by this API key. Error
get/projects/{projectId}/intake/submissionsRequests sent through the form, newest first (pending by default)
Parameters
  • projectId path, required string
  • status query string (pending | promoted | dismissed)
Responses

MCP

post/mcpModel Context Protocol endpoint for bots

MCP over Streamable HTTP (stateless; responses are application/json). Send JSON-RPC MCP messages (initialize, tools/list, tools/call). Authenticate like the REST API (tl_ API key or Clerk session). Each tool calls the matching REST route with the caller's credentials, so results, permissions and errors are the same as REST; a failed call is a tool result with isError and the REST status in its text. GET and DELETE return 405 (no sessions or server-initiated streams).

Body object
Responses
  • 200 JSON-RPC response. object
  • 202 Notification accepted.
  • 401 Missing, invalid, or revoked API key. Error

Notifications

get/me/google-chatWhether your Google Chat is linked for personal messages

The TrackLin.es Google Chat app sends your own notifications (assigned, mentioned, review…) to your chat with it, once you've linked your account from the link it sends you.

Responses
  • 200 available is false when the server has no Chat app. object
  • 401 Missing, invalid, or revoked API key. Error
delete/me/google-chatStop personal messages in Google Chat
Responses
  • 204 Unlinked.
  • 401 Missing, invalid, or revoked API key. Error
post/me/google-chat/linkLink your Google Chat with the one-time code the Chat app sent you

Signed-in sessions only (not API keys). Linking again replaces the earlier link.

Body object
Responses
  • 200 Linked; the app confirms in Google Chat.
  • 400 The code expired (30 minutes) or was already used.
  • 403 Not a signed-in session.
  • 503 The Chat app isn't set up on this server.
get/notificationsThe signed-in user's inbox in the active organization, unread first, then newest

Events: assigned (someone assigned you a ticket), mention (@you in a comment), finished (a ticket you raised was finished or resolved), wont_do (a ticket you raised was closed as won't do, with the reason), review (an agent finished a ticket on a board you manage), sent_back (your ticket was sent back from review), approval (a planned sprint on a board you manage went over capacity). Nobody is told about their own actions; only people (not agents) get notifications. MCP tool list_notifications.

Parameters
  • page query integer
  • per_page query integer
Responses
  • 200 Notifications. Notification[]
  • 403 Not signed in to an organization.
delete/notifications/readRemove all your notifications that are already read
Responses
  • 204 Cleared.
post/notifications/read-allMark all your notifications read
Responses
  • 204 Read.
get/notifications/unread-countHow many notifications are unread
Responses
  • 200 The count. object
delete/notifications/{notificationId}Remove one of your notifications
Parameters
  • notificationId path, required string
Responses
  • 204 Removed.
  • 404 Resource not found or not owned by this API key. Error
post/notifications/{notificationId}/readMark one of your notifications read
Parameters
  • notificationId path, required string
Responses
  • 204 Read.
  • 404 Resource not found or not owned by this API key. Error
get/pushWhether this server sends Web Push, and the VAPID public key browsers subscribe with
Responses
  • 200 Push settings. object
post/push/subscriptionsTurn on notifications for this device (signed-in people only)

The browser's PushSubscription. The endpoint must be https on a known push service (Google, Mozilla, Apple, Microsoft): the server sends to it. The same browser subscribing again takes the row over. The device then gets every notification from the inbox, even with TrackLin.es closed.

Body object
Responses
  • 204 Subscribed.
  • 400 Not a browser push subscription.
  • 403 API keys can't subscribe devices.
  • 503 Push isn't set up on this server.
delete/push/subscriptionsTurn off notifications for this device
Body object
Responses
  • 204 Unsubscribed (your own devices only).
post/webhooks/google-chatRequests from the TrackLin.es Google Chat app (Google only)(public)

Signed by Google for this endpoint (Authorization Bearer ID token); anything else is refused.

Responses
  • 200 The app's reply.
  • 401 Not a request from Google Chat for this app.
  • 503 The Chat app isn't set up on this server.

Schemas

ApiKey
  • client string | null (claude-code | claude-desktop | codex | cursor | vscode | gemini | other | ) · AI keys only. The client the agent runs in.
  • created_at string
  • display string · What it is called: "Claude", an other agent's label (or "AI agent"), or a service key's name. Others see AI keys with their owner: "Claude (keloran)".
  • expires_at string · After this the key is refused (401 "api key expired").
  • id string
  • kind string (ai | service | personal) · AI keys can be assigned tickets; service keys are for servers and integrations; personal keys act exactly as their owner (their own scripts and displays).
  • label string | null · AI keys with client "other": what the agent is called.
  • last_used_at string | null
  • name string · The id its work is recorded under. Generated for AI keys (e.g. claude-482193); chosen for service keys. Only a label for personal keys, whose work is recorded as their owner.
  • prefix string
  • read_only boolean · Only GET, HEAD and OPTIONS; anything else is 403 "this api key is read-only".
Attachment
  • content_type string
  • created_at string
  • created_by string
  • delete_on string · Set once the file is a year old: the day it is deleted unless kept.
  • id string
  • key string
  • name string
  • size integer
  • ticket_id string
  • url string
AttachmentInput
  • content_type string
  • key required string
  • name required string
  • size integer
  • url required string · Must be an https UploadThing URL on utfs.io or a *.ufs.sh host.
Board
  • agent_review boolean · Agents' moves into Done wait for a person's review.
  • archived_at string | null · Archived boards are off the project page and take no new work.
  • columns required Column[]
  • created_at string
  • deletable boolean · Never used (no tickets, no sprints): DELETE works; otherwise archive it.
  • description string
  • estimate_scale EstimateScale
  • hidden_done integer · Kanban only. Done tickets finished more than 14 days ago, left off the board.
  • id required string
  • name required string
  • owner_clerk_id string
  • project_id required string
  • sprint Sprint
  • style string (sprints | kanban)
  • team_id string | null · The team whose leaders run this board.
  • updated_at string
BoardFlow
  • median_cycle_days required number | null · Median elapsed days for tickets with a known start.
  • p85_cycle_days required number | null · 85th percentile elapsed days for tickets with a known start.
  • throughput required object[] · Counts by UTC Monday week start, including weeks with no completed tickets.
  • tickets required object[] · Finished tickets in the date window, oldest completion first.
  • weeks required integer · Number of UTC calendar weeks included
BoardInput
  • description string
  • name required string
  • template_id string · A template from GET /board-templates (built-in ids start with builtin:). Default builtin:simple (To do, In progress, Done). Unknown id: 400.
BoardSummary
  • created_at string
  • description string
  • estimate_scale EstimateScale
  • id string
  • name string
  • owner_clerk_id string
  • project_id string
  • stats object · Only on a project's boards. Counts the tickets the board shows (the open sprint's, or all if it has never run one). in_progress = neither the first column nor done; urgent = open urgent tickets.
  • team_id string | null
  • updated_at string
BoardTemplate
  • builtin required boolean
  • columns required object[] · In board order; the last column is Done.
  • estimate_scale required EstimateScale
  • id required string · builtin:simple, builtin:scrum, builtin:kanban, or an org template's UUID
  • name required string
  • style required string (sprints | kanban)
BugfixTicket
  • board_id required string
  • body required string
  • column_id required string
  • created_at required string
  • created_by required string
  • id required string
  • priority required string
  • title required string
Column
  • id string
  • name string
  • position integer
  • tickets Ticket[]
  • wip_limit integer | null
Comment
  • author required string · BugFixes API key name.
  • body required string
  • created_at required string
  • id required string
  • parent_comment_id string | null
  • ticket_id required string
CreateApiKeyInput
  • client string (claude-code | claude-desktop | codex | cursor | vscode | gemini | other) · Required for AI keys. Their name is generated from it.
  • expires_in_days integer · How long the key works.
  • kind required string (ai | service | personal)
  • label string · AI keys with client "other": what the agent is called (optional).
  • name string · Required for service and personal keys; ignored for AI keys.
  • read_only boolean · The key can only read.
CreateBacklogTicket
  • description string
  • labels Labels
  • priority string (low | medium | high | urgent)
  • title required string
  • type string (bug | feature | task | epic | spike)
CreateBugfixTicket
  • board_id required string
  • body string · Initial ticket description.
  • column_id required string
  • labels Labels
  • priority string (low | medium | high | urgent) · Defaults to medium.
  • title required string
CreateComment
  • body required string
  • parent_comment_id string | null · Omit or set null for a top-level appended update; set to a comment ID to reply in a thread.
CreatedApiKey
  • ApiKey & object
EpicProgress

An epic's progress and size, from its direct sub-tickets (duplicates left out).

  • done integer
  • points number · Sum of their estimates as points (T-shirt sizes converted).
  • total integer
  • unestimated integer
Error

Plain-text error message.

  • string
EstimateScale

How a board estimates tickets. fibonacci 1,2,3,5,8,13,21; tshirt XS,S,M,L,XL; powers 1,2,4,8,16; linear 1-5; none turns estimates off.

  • string (none | fibonacci | tshirt | powers | linear)
ExternalRef
  • id required string · e.g. the Bugfixes report id.
  • project required string · The source's project id.
  • source required string (bugfixes)
  • url string
HostedFocus

What the host has open, shown to followers.

  • filters object · e.g. labels
  • ticketId string · The ticket open; null when none.
HostedSession
  • focus HostedFocus
  • host string · The host's user id.
  • people string[] · User ids in the session now (seen in the last minute)
  • startedAt integer · Unix milliseconds.
IntakeSettings
  • can_manage boolean · The caller may open, close or reset it: a signed-in org admin.
  • open boolean
  • token string | null · The form is at /request/{token}.
IntakeSubmission
  • contact string
  • created_at string
  • decided_at string | null
  • decided_by string | null
  • details string
  • id string
  • project_id string
  • status string (pending | promoted | dismissed)
  • ticket_id string | null
  • ticket_key string | null
  • title string
  • type string (bug | feature)
Invitation
  • accept_url string · Clerk-hosted invitation URL, returned by create and list/get.
  • accepted_at string
  • accepted_by string
  • created_at required string
  • email_address required string
  • expires_at required string
  • id required string · TrackLin.es invitation id used by inspect, revoke, and accept routes.
  • invited_by required string
  • org_id required string
  • scope required string (organization | team | project)
  • status required string (pending | accepted | revoked | expired)
  • target_id string
InvitationInput
  • email_address required string
  • scope required string (organization | team | project)
  • target_id string · Required for team and project scopes; omit for organization scope.
Labels

Free-form labels. Trimmed; blanks and case-insensitive duplicates dropped (first spelling wins). Omit to leave unchanged; [] clears.

  • string[]
LiveStandup
  • index required integer · Current participant; people.length is the clean-board review.
  • people required object[]
  • runningSince required integer | null · Unix milliseconds when the clock resumed; null while paused.
  • spentMs required integer · Elapsed time before the current run.
  • startedBy required string
MoveTicket
  • column_id required string
  • estimate string · Size the ticket on the way in, on the target board's estimate_scale. Required when the ticket enters a board with an estimate scale (from the backlog or another board) and has no estimate on that same scale; 400 otherwise.
  • position integer
NameInput
  • name required string
Notification
  • actor string · User id or agent name.
  • board_id string | null
  • created_at string
  • id string
  • kind string (assigned | mention | finished | wont_do | review | sent_back | approval)
  • read_at string | null
  • text string · Reads after the actor, e.g. "assigned you TL-12: Fix login".
  • ticket_id string | null
  • ticket_key string | null
OrgAdmin
  • created_at string
  • granted_by string · clerk:creator, clerk:admin-role, clerk:earliest-member, or the user id of the admin who granted it
  • user_id string
OrganizationMember
  • first_name string
  • identifier required string · Public identifier provided by Clerk, usually an email address.
  • image_url string
  • last_name string
  • user_id required string
OrganizationMemberPage
  • limit required integer
  • members required OrganizationMember[]
  • offset required integer
  • total_count required integer
PlannedSprint
  • board_id string
  • capacity object
  • goal string · Carried into the sprint when it starts.
  • id string
  • length_days integer
  • number integer · The sprint number it will get
  • position integer · 1 = the next sprint
  • tickets Ticket[]
Progress
  • done integer
  • total integer
Project
  • boards BoardSummary[]
  • created_at required string
  • description required string
  • id required string
  • key_prefix required string · Ticket keys are <key_prefix>-<number>. Worked out from the name on create (its capitals, e.g. TrackLin.es → TL), unique in the org.
  • name required string
  • roadmaps Roadmap[]
  • stats object · Only on the project list. Open and done count board tickets (done = in the board's last column); urgent counts open urgent tickets on boards or in the backlog.
  • updated_at required string
ProjectInput
  • description string
  • key_prefix string · Update only; lower case is upper-cased. Omitted = unchanged.
  • name required string
ProjectRepo
  • created_at string
  • default_branch string
  • full_name string
  • provider string (github | bitbucket)
ReportMix
  • count integer
  • type string (bug | feature | task | epic | spike)
  • value number
ReportOverall
  • goals_met integer
  • goals_set integer
  • predictability number | null
  • sprints integer
ReportRollup
  • boards object[] · A project's sprint boards (not kanban or archived): each a board report.
  • from string
  • id string · The project; absent for the organization.
  • months object[]
  • name string
  • overall ReportOverall
  • points ReportTotals | null · Boards that estimate.
  • previous ReportOverall
  • projects ReportRollup[] · The organization's projects, each a roll-up without its boards.
  • summary string
  • tickets ReportTotals | null · Boards that count tickets.
  • to string
ReportTotals
  • added number | null
  • carried number | null
  • done number
  • mix ReportMix[]
  • planned number
  • predictability number | null
  • sprints integer · Closed sprints counted.
  • velocity number | null
Roadmap
  • can_manage boolean · The caller can change this roadmap (an org admin, or a leader of a team with a board in its project). Always false for readers outside its organization.
  • created_at string
  • description string
  • id string
  • items RoadmapItem[]
  • progress Progress
  • project_id string
  • title string
  • updated_at string
  • visibility string (public | login_only | team)
RoadmapInput
  • description string
  • title required string
  • visibility string (public | login_only | team)
RoadmapItem
  • RoadmapItemInput & object
RoadmapItemInput
  • description string
  • id string · Omit to create a new item.
  • manual_status string (not_started | in_progress | done)
  • start_date string | null · Gantt bar start date.
  • target_date string | null
  • title required string
RoadmapUpdate
  • author string · Who posted it, by name (an email-only name without its domain; an agent by its own name). Missing on updates from before TL-413.
  • health required string (on_track | at_risk | off_track)
  • id required string
  • note required string
  • published_at required string
RoadmapUpdateInput
  • health required string (on_track | at_risk | off_track)
  • note required string · Plain text or Markdown; rendered as safe text by clients.
Sprint
  • board_id string
  • closed_at string | null
  • ends_at string
  • goal string · One line the sprint is for; empty = none.
  • id string
  • length_days integer
  • number integer
  • starts_at string
Team
  • created_at required string
  • description required string
  • id required string
  • name required string
  • org_id required string
  • updated_at required string
TeamInput
  • description string
  • name required string
TeamMember
  • leader boolean
  • user_id string
Ticket

Agent origin is recorded in created_by and rendered in the ticket UI; assignment is shown in assigned_to.

  • assigned_to string | null
  • blocked required boolean
  • column_id required string | null · Null while in the backlog.
  • created_at string
  • created_by required string
  • description required string
  • done_at string | null · When it reached its board's Done column or was resolved; null while open.
  • duplicate_of_id string | null · The original ticket when this ticket is marked as a duplicate.
  • duplicate_of_key string | null · Key of the original ticket.
  • duplicate_of_title string | null · Title of the original ticket.
  • estimate string | null · On the board's estimate_scale. Cleared when the ticket moves to the backlog or to a board with another scale.
  • external_source string | null · Where an integration made it (bugfixes); null for our own tickets.
  • external_url string | null · Link to it there (e.g. the Bugfixes report).
  • id required string
  • key string · The project's key prefix and the ticket's number in the project, assigned on create. For branch names, PR titles and search.
  • labels string[] · Free-form labels, sorted case-insensitively.
  • planned_sprint_id string | null · A backlog ticket planned into a board's upcoming sprint (refinement).
  • position required integer
  • priority required string (low | medium | high | urgent)
  • project_id required string
  • resolution string | null (done | wont_do | duplicate | ) · How a resolved backlog ticket was closed.
  • resolved_at string | null · Set when the ticket was resolved in the backlog (POST /tickets/{id}/resolve); it then counts as done.
  • review_requested_at string | null · Set while an agent's finished ticket waits for a person's review (in the column before Done).
  • sprint_id string | null
  • started_at string | null · First move out of the board's first column; null for historical tickets without a known start.
  • title required string
  • type required string (bug | feature | task | epic | spike)
  • updated_at string
TicketChild
  • assigned_to string | null
  • board_id string | null · Null when the sub-ticket is in the backlog.
  • board_name string | null
  • done boolean
  • estimate string | null
  • id string
  • key string | null
  • title string
  • type string (bug | feature | task | epic | spike)
TicketDependency
  • done boolean
  • id string
  • title string
TicketDetail

Ticket properties plus board, column, sprint, and completion context.

  • assigned_to string | null
  • attachment_count integer · Files on the ticket (list them with GET /tickets/{ticketId}/attachments): designs, screenshots, logs.
  • blocked boolean
  • blocked_by TicketDependency[]
  • blocks TicketDependency[]
  • board_id string | null
  • board_name string | null
  • children TicketChild[]
  • column_id string | null
  • column_name string | null
  • created_by string
  • description string
  • done boolean
  • duplicate_of_id string | null
  • duplicate_of_key string | null
  • duplicate_of_title string | null
  • duplicates object[]
  • epic EpicProgress
  • epic_id string | null · The epic this ticket is part of, at any depth (epics don't nest).
  • estimate string | null
  • estimate_scale EstimateScale
  • id string
  • parent_id string | null
  • position integer
  • priority string (low | medium | high | urgent)
  • project_id string
  • resolution string | null (done | wont_do | duplicate | )
  • sprint_id string | null
  • sprint_number integer | null
  • timebox_days integer | null · A spike's timebox, in days (with timebox_hours). Null when not a spike or not yet timed.
  • timebox_hours integer | null · A spike's timebox hours (0–23).
  • title string
  • type string (bug | feature | task | epic | spike)
TicketInput
  • description string
  • estimate string · A value on the board's estimate_scale (400 otherwise). Required when creating on a board with an estimate scale; omitted = unchanged on update, and it can't be cleared there. Not allowed on backlog tickets.
  • labels Labels
  • priority string (low | medium | high | urgent)
  • timebox_days integer · A spike's timebox days (TL-502). Send with timebox_hours; both 0 clears the timebox, both omitted = unchanged. Only meaningful on spikes (set via update).
  • timebox_hours integer · A spike's timebox hours (0–23). Send with timebox_days.
  • title required string
  • type string (bug | feature | task | epic | spike)
URLResponse
  • url required string
Velocity
  • cap number · A sprint's capacity: velocity (last 3 closed sprints) + 10%. Null without closed sprints.
  • current required object | null · The open sprint, or null. total is the sprint's current scope (scope changes aren't tracked over time).
  • sprints required object[] · Closed sprints, oldest first.
  • unit required string (points | tickets)