NewFor developers

The TeamTrackin API and webhooks

Connect your own tools to TeamTrackin: read and change tickets, move them across your boards, and get a signed message the moment something happens.

  • REST and JSON
  • Keys that act as a person
  • Signed webhooks
  • OpenAPI description
api.teamtrackin.com/api/v1/tickets/
curl https://api.teamtrackin.com/api/v1/tickets/?q=assignee%20%3D%20me() \
  -H "Authorization: Bearer ttk_xxxxxxxxxxxx_..."

{
  "results": [{ "id": "…", "key": "WEB-12", "title": "Fix login",
                "column": { "title": "In progress", "category": "in_progress" } }],
  "next": "https://api.teamtrackin.com/api/v1/tickets/?cursor=eyJj…",
  "limit": 25
}
Basics

How the API works

Everything below applies to every call under /api/v1/.

Sign in with an API key

Make a key in Company settings, Developers, and send it as Authorization: Bearer ttk_… on every call.

  • Keys work only on /api/v1/; web sign-in tokens don't work there
  • Shown once; only a hash is kept
  • Optional expiry and allowed IP addresses

A key acts as a person

Each key acts as one named person. A call needs the key's scope, that person's own permission, boards and Space role, and the rights of whoever set the key up.

  • Private boards stay private
  • Nobody gives a key more than they can do themselves
  • A key acts as whoever makes it; only owners and admins choose someone else
  • History says "via API key: <name>"
  • The account owner is told when a key is made, changed or revoked
  • Company presets, a who-did-what view and Activity for every key, and revoked keys kept read only

Rate limits

Requests per minute per key: 120 on Standard, 600 on Premium, 1,200 on Enterprise. You can set a lower limit on a key; it never goes above your plan's.

  • X-RateLimit-Limit, -Remaining and -Reset on every answer
  • 429 with Retry-After when over the limit
  • A plan without the API answers 403 with the reason, never 429

Safe retries

Send an Idempotency-Key header on a POST. Repeating it within 24 hours returns the first answer instead of doing the work twice.

  • 409 while the first call is still running
  • 422 if the same key comes with a different body

Cursor paging

GET /api/v1/tickets/ returns newest first. Follow next until it is null; limit takes up to 100. Other lists use limit and offset.

  • Filter with q=: a ticket key (q=TB-184), plain words (each in the title, key or description) or the same search language as the app
  • board, status_category, assignee, updated_after, created_after/before

Errors

Every error has the same shape: { error, detail, code }. A refused move answers 422 workflow_blocked with the rules that stopped it.

  • 401 bad or missing key
  • 403 missing scope (scope_missing) or permission
  • 404 not found or not yours to see
  • 503 service_unavailable with Retry-After when billing can't be reached
Scopes

Give each key only what it needs

Choose scopes when you make a key. A call needs the scope and the person's own permission.

Tickets and files

Read and work on tickets. Deleting is always its own scope.

  • tickets:read, tickets:write, tickets:delete
  • comments:read, comments:write, comments:delete
  • attachments:read, attachments:write, attachments:delete
  • time:read

Boards and planning

Make and shape boards, Spaces and sprints.

  • boards:read, boards:write, boards:delete (columns, statuses, board settings)
  • spaces:read, spaces:write, spaces:delete
  • sprints:read, sprints:write (plan, start, complete)
  • epics:read, epics:write, epics:delete
  • labels:read, labels:write, labels:delete
  • custom_fields:read, custom_fields:write, custom_fields:delete

Search, Docs and projects

Find work, keep knowledge and run projects.

  • search:read (run the search language, read saved searches), search:write
  • docs:read, docs:write, docs:delete (pages, their files and history; plans with Docs)
  • sops:read, sops:write (SOPs are Docs pages, so they need Docs too)
  • projects:read, projects:write; projects:budget for owners and admins
  • dashboards:read (burndown, velocity, sprint report, time vs estimate, cumulative flow), dashboards:write

Docs databases

Databases in Docs: their fields, views and entries. Plans with Docs.

  • databases:read, databases:write, databases:delete
  • GET, POST /api/v1/databases/; GET, PATCH, DELETE /api/v1/databases/{id}/
  • GET, POST …/{id}/fields/; PATCH, DELETE …/{id}/fields/{field_id}/
  • GET, POST …/{id}/views/; PATCH, DELETE …/{id}/views/{view_id}/
  • GET, POST …/{id}/entries/; GET, PATCH, DELETE …/{id}/entries/{entry_id}/
  • GET, POST …/{id}/versions/; POST …/{id}/versions/{version_id}/restore/; DELETE …/{id}/versions/{version_id}/ (a restore keeps the state before as a version)
  • List entries with view, filter (a filter tree as JSON), sort (JSON), search and ids; limit and offset
  • Values keyed by field id; raw=true reads plain text, like a spreadsheet paste; required fields are enforced
  • Every change shows "via API key" or "via AI tool" in the database's history
  • The Project manager preset includes databases read and write

Docs whiteboards

Whiteboards in Docs: their elements, versions and comments. Plans with Docs.

  • whiteboards:read, whiteboards:write, whiteboards:delete
  • GET, POST /api/v1/whiteboards/; GET, PATCH, DELETE /api/v1/whiteboards/{id}/
  • GET, POST …/{id}/elements/; PATCH, DELETE …/{id}/elements/{element_id}/
  • GET …/{id}/outline/ (the board's words, grouped by frame)
  • GET, POST …/{id}/versions/; GET …/{id}/versions/{version_id}/; POST …/{id}/versions/{version_id}/restore/
  • GET, POST …/{id}/comments/
  • POST …/{id}/tickets/ (sticky notes into tickets; also needs tickets:write)
  • Your key's person's own Docs access applies
  • The Project manager preset includes whiteboards read and write

People

Look up who to assign work to.

  • users:read (e-mail addresses only for keys whose person can see everyone)

Webhooks

Manage webhooks through the API too.

  • webhooks:read
  • webhooks:write
Reference

Endpoints

Every endpoint, its scope and what it does. The full description, with every field, is at /api/v1/openapi.json for your API tools.

Me

Who the key acts as and what it may do.

  • GET /api/v1/me/ · Who this key acts as

Tickets

Tickets, comments, checklists, files and time.

  • PATCH /api/v1/checklist-items/{id}/ · Tick, untick or rename a checklist item (tickets:write)
  • GET /api/v1/tickets/ · List tickets (tickets:read)
  • POST /api/v1/tickets/ · Create a ticket (tickets:write)
  • GET /api/v1/tickets/{id}/ · Get a ticket (tickets:read)
  • PATCH /api/v1/tickets/{id}/ · Change a ticket (tickets:write)
  • DELETE /api/v1/tickets/{id}/ · Delete a ticket (tickets:delete)
  • POST /api/v1/tickets/{id}/assignees/ · Add someone to a ticket (tickets:write)
  • DELETE /api/v1/tickets/{id}/assignees/{user_id}/ · Take a helper off a ticket (tickets:write)
  • POST /api/v1/tickets/{id}/attachments/ · Attach a file to a ticket (attachments:write)
  • GET /api/v1/tickets/{id}/checklists/ · A ticket's checklists (tickets:read)
  • POST /api/v1/tickets/{id}/checklists/ · Add a checklist (tickets:write)
  • GET /api/v1/tickets/{id}/comments/ · List a ticket's comments (comments:read)
  • POST /api/v1/tickets/{id}/comments/ · Comment on a ticket (comments:write)
  • POST /api/v1/tickets/{id}/move/ · Move a ticket to another column (tickets:write)
  • GET /api/v1/tickets/{id}/time/ · Time logged on a ticket (time:read)

Comments

Edit and delete comments.

  • PATCH /api/v1/comments/{id}/ · Edit a comment (comments:write)
  • DELETE /api/v1/comments/{id}/ · Delete a comment (comments:delete)

Files

Files on tickets: list, download, remove.

  • GET /api/v1/attachments/{id}/ · Get a file (attachments:read)
  • DELETE /api/v1/attachments/{id}/ · Remove a file (attachments:delete)
  • GET /api/v1/tickets/{id}/attachments/ · A ticket's files (attachments:read)

Boards

Boards, their columns, statuses and settings.

  • GET /api/v1/boards/ · List boards (boards:read)
  • POST /api/v1/boards/ · Create a board (boards:write)
  • GET /api/v1/boards/{id}/ · Get a board (boards:read)
  • PATCH /api/v1/boards/{id}/ · Change a board's settings (boards:write)
  • DELETE /api/v1/boards/{id}/ · Delete a board (boards:delete)
  • GET /api/v1/boards/{id}/columns/ · A board's columns (boards:read)
  • POST /api/v1/boards/{id}/columns/ · Add a column (boards:write)
  • POST /api/v1/boards/{id}/columns/reorder/ · Reorder a board's columns (boards:write)
  • GET /api/v1/boards/{id}/sprints/ · A board's sprints (sprints:read)
  • GET /api/v1/boards/{id}/statuses/ · A board's statuses (boards:read)
  • GET /api/v1/columns/{id}/ · Get a column (boards:read)
  • PATCH /api/v1/columns/{id}/ · Change a column (boards:write)
  • DELETE /api/v1/columns/{id}/ · Delete a column (boards:delete)

Spaces

Spaces: make, change and remove them.

  • GET /api/v1/spaces/ · List Spaces (spaces:read)
  • POST /api/v1/spaces/ · Create a Space (spaces:write)
  • GET /api/v1/spaces/{id}/ · Get a Space (spaces:read)
  • PATCH /api/v1/spaces/{id}/ · Change a Space (spaces:write)
  • DELETE /api/v1/spaces/{id}/ · Delete a Space (spaces:delete)

Sprints

Plan, start and complete sprints.

  • POST /api/v1/boards/{id}/sprints/ · Plan a sprint (sprints:write)
  • GET /api/v1/sprints/{id}/ · Get a sprint (sprints:read)
  • PATCH /api/v1/sprints/{id}/ · Change a sprint (sprints:write)
  • POST /api/v1/sprints/{id}/complete/ · Complete a sprint (sprints:write)
  • POST /api/v1/sprints/{id}/issues/ · Put tickets in a sprint or take them out (sprints:write)
  • POST /api/v1/sprints/{id}/start/ · Start a sprint (sprints:write)

Epics

Epics, by board.

  • GET /api/v1/epics/ · List epics (epics:read)
  • POST /api/v1/epics/ · Create an epic (epics:write)
  • GET /api/v1/epics/{id}/ · Get an epic (epics:read)
  • PATCH /api/v1/epics/{id}/ · Change an epic (epics:write)
  • DELETE /api/v1/epics/{id}/ · Delete an epic (epics:delete)

Labels

A board's labels.

  • GET /api/v1/labels/ · A board's labels (labels:read)
  • POST /api/v1/labels/ · Put a label on tickets (labels:write)
  • DELETE /api/v1/labels/ · Remove a label from a board (labels:delete)
  • POST /api/v1/labels/rename/ · Rename a label on a board (labels:write)

Custom fields

Custom fields and their values on tickets.

  • GET /api/v1/custom-fields/ · List custom fields (custom_fields:read)
  • POST /api/v1/custom-fields/ · Create a custom field (custom_fields:write)
  • GET /api/v1/custom-fields/{id}/ · Get a custom field (custom_fields:read)
  • PATCH /api/v1/custom-fields/{id}/ · Change a custom field (custom_fields:write)
  • DELETE /api/v1/custom-fields/{id}/ · Delete a custom field (custom_fields:delete)
  • GET /api/v1/tickets/{id}/custom-fields/ · A ticket's custom field values (custom_fields:read)
  • PUT /api/v1/tickets/{id}/custom-fields/ · Set a ticket's custom field values (custom_fields:write)

Search

The search language and saved searches.

  • GET /api/v1/saved-searches/ · List saved searches (search:read)
  • POST /api/v1/saved-searches/ · Save a search (search:write)
  • GET /api/v1/saved-searches/{id}/ · Get a saved search (search:read)
  • PATCH /api/v1/saved-searches/{id}/ · Change a saved search (search:write)
  • DELETE /api/v1/saved-searches/{id}/ · Delete a saved search (search:write)
  • GET /api/v1/search/ · Run a search (search:read)
  • POST /api/v1/search/parse/ · Check a query (search:read)

Docs

Docs pages, their files and images, and their history.

  • GET /api/v1/docs/pages/ · List Docs pages (docs:read)
  • POST /api/v1/docs/pages/ · Create a Docs page (docs:write)
  • GET /api/v1/docs/pages/{id}/ · Get a Docs page (docs:read)
  • PATCH /api/v1/docs/pages/{id}/ · Change a Docs page (docs:write)
  • DELETE /api/v1/docs/pages/{id}/ · Delete a Docs page (docs:delete)
  • POST /api/v1/docs/pages/{id}/files/ · Attach a file or image to a Docs page (docs:write)
  • GET /api/v1/docs/pages/{id}/tidy/ · Tidy up with AI: estimate and runs (docs:read)
  • POST /api/v1/docs/pages/{id}/tidy/ · Tidy up a Docs page with AI (docs:write)
  • GET /api/v1/docs/pages/{id}/tidy/{run_id}/ · One tidy-up run (docs:read)
  • POST /api/v1/docs/pages/{id}/tidy/{run_id}/accept/ · Accept tidy-up wording changes (docs:write)
  • POST /api/v1/docs/pages/{id}/tidy/{run_id}/discard/ · Discard tidy-up suggestions (docs:write)
  • POST /api/v1/docs/pages/{id}/tidy/{run_id}/undo/ · Undo a tidy-up (docs:write)
  • GET /api/v1/docs/pages/{id}/versions/ · A Docs page's history (docs:read)
  • GET /api/v1/docs/pages/{id}/versions/{version_id}/ · One version of a Docs page (docs:read)
  • POST /api/v1/docs/pages/{id}/versions/{version_id}/restore/ · Restore an old version (docs:write)
  • GET /api/v1/docs/spaces/ · List Docs spaces (docs:read)

Databases

Docs databases, their fields, views and entries.

  • GET /api/v1/databases/ · List databases (databases:read)
  • POST /api/v1/databases/ · Create a database (databases:write)
  • GET /api/v1/databases/{id}/ · Get a database (databases:read)
  • PATCH /api/v1/databases/{id}/ · Change a database (databases:write)
  • DELETE /api/v1/databases/{id}/ · Delete a database (databases:delete)
  • GET /api/v1/databases/{id}/entries/ · List entries (databases:read)
  • POST /api/v1/databases/{id}/entries/ · Add an entry (databases:write)
  • GET /api/v1/databases/{id}/entries/{entry_id}/ · Get an entry (databases:read)
  • PATCH /api/v1/databases/{id}/entries/{entry_id}/ · Change an entry (databases:write)
  • DELETE /api/v1/databases/{id}/entries/{entry_id}/ · Delete an entry (databases:delete)
  • GET /api/v1/databases/{id}/fields/ · List a database's fields (databases:read)
  • POST /api/v1/databases/{id}/fields/ · Add a field (databases:write)
  • PATCH /api/v1/databases/{id}/fields/{field_id}/ · Change a field (databases:write)
  • DELETE /api/v1/databases/{id}/fields/{field_id}/ · Delete a field (databases:delete)
  • GET /api/v1/databases/{id}/versions/ · List a database's versions (databases:read)
  • POST /api/v1/databases/{id}/versions/ · Save a version (databases:write)
  • DELETE /api/v1/databases/{id}/versions/{version_id}/ · Delete a version (databases:delete)
  • POST /api/v1/databases/{id}/versions/{version_id}/restore/ · Restore a version (databases:write)
  • GET /api/v1/databases/{id}/views/ · List a database's views (databases:read)
  • POST /api/v1/databases/{id}/views/ · Add a view (databases:write)
  • PATCH /api/v1/databases/{id}/views/{view_id}/ · Change a view (databases:write)
  • DELETE /api/v1/databases/{id}/views/{view_id}/ · Delete a view (databases:delete)
  • POST /api/v1/databases/{id}/views/{view_id}/colors/ · Colour entries, cells or columns (databases:write)

Whiteboards

Docs whiteboards, their elements, versions and comments.

  • GET /api/v1/whiteboards/ · List whiteboards (whiteboards:read)
  • POST /api/v1/whiteboards/ · Create a whiteboard (whiteboards:write)
  • GET /api/v1/whiteboards/{id}/ · Get a whiteboard (whiteboards:read)
  • PATCH /api/v1/whiteboards/{id}/ · Change a whiteboard's settings (whiteboards:write)
  • DELETE /api/v1/whiteboards/{id}/ · Delete a whiteboard (whiteboards:delete)
  • GET /api/v1/whiteboards/{id}/comments/ · A whiteboard's comments (whiteboards:read)
  • POST /api/v1/whiteboards/{id}/comments/ · Comment on a whiteboard (whiteboards:write)
  • GET /api/v1/whiteboards/{id}/elements/ · List a whiteboard's elements (whiteboards:read)
  • POST /api/v1/whiteboards/{id}/elements/ · Add elements to a whiteboard (whiteboards:write)
  • PATCH /api/v1/whiteboards/{id}/elements/{element_id}/ · Change a whiteboard element (whiteboards:write)
  • DELETE /api/v1/whiteboards/{id}/elements/{element_id}/ · Remove a whiteboard element (whiteboards:write)
  • GET /api/v1/whiteboards/{id}/outline/ · Read a whiteboard's words (whiteboards:read)
  • POST /api/v1/whiteboards/{id}/tickets/ · Turn sticky notes into tickets (tickets:write)
  • GET /api/v1/whiteboards/{id}/versions/ · A whiteboard's history (whiteboards:read)
  • POST /api/v1/whiteboards/{id}/versions/ · Save a whiteboard version (whiteboards:write)
  • GET /api/v1/whiteboards/{id}/versions/{version_id}/ · One version of a whiteboard (whiteboards:read)
  • POST /api/v1/whiteboards/{id}/versions/{version_id}/restore/ · Restore a whiteboard version (whiteboards:write)

SOPs

Standard operating procedures.

  • GET /api/v1/sops/ · List SOPs (sops:read)
  • POST /api/v1/sops/ · Create an SOP (sops:write)
  • GET /api/v1/sops/{id}/ · Get an SOP (sops:read)
  • PATCH /api/v1/sops/{id}/ · Change an SOP (sops:write)

Projects

Projects and milestones.

  • GET /api/v1/milestones/{id}/ · Get a milestone (projects:budget)
  • PATCH /api/v1/milestones/{id}/ · Change a milestone (projects:budget)
  • GET /api/v1/projects/ · List projects (projects:budget)
  • POST /api/v1/projects/ · Create a project (projects:budget)
  • GET /api/v1/projects/{id}/ · Get a project (projects:budget)
  • PATCH /api/v1/projects/{id}/ · Change a project (projects:budget)
  • GET /api/v1/projects/{id}/milestones/ · A project's milestones (projects:budget)
  • POST /api/v1/projects/{id}/milestones/ · Add a milestone (projects:budget)

Reports

Board reports, with the same numbers as the app.

  • GET /api/v1/boards/{id}/reports/burndown/ · Sprint burndown and burnup (dashboards:read)
  • GET /api/v1/boards/{id}/reports/cumulative-flow/ · Cumulative flow (dashboards:read)
  • GET /api/v1/boards/{id}/reports/sprint/ · Sprint report (dashboards:read)
  • GET /api/v1/boards/{id}/reports/time-vs-estimate/ · Time against estimate (dashboards:read)
  • GET /api/v1/boards/{id}/reports/velocity/ · Velocity (dashboards:read)

Dashboards

Dashboards and their widgets.

  • GET /api/v1/dashboards/ · List dashboards (dashboards:read)
  • POST /api/v1/dashboards/ · Create a dashboard (dashboards:write)
  • GET /api/v1/dashboards/{id}/ · Get a dashboard (dashboards:read)
  • PATCH /api/v1/dashboards/{id}/ · Change a dashboard (dashboards:write)
  • DELETE /api/v1/dashboards/{id}/ · Delete a dashboard (dashboards:write)
  • GET /api/v1/dashboards/{id}/tiles/{tile_id}/ · One tile's numbers (dashboards:read)

Time

  • GET /api/v1/time-entries/ · List manual time entries (time:read)
  • POST /api/v1/time-entries/ · Log time by hand (time:write)
  • GET /api/v1/time/days/ · Time per person per day (time:read)
  • GET /api/v1/timer/ · Is the desktop app open? (time:read)
  • POST /api/v1/timer/ · Start or stop the timer (time:write)

Timesheets

  • GET /api/v1/timesheets/ · List timesheets (timesheets:read)
  • POST /api/v1/timesheets/ · Submit a month (timesheets:write)
  • GET /api/v1/timesheets/{id}/ · Get a timesheet (timesheets:read)
  • PATCH /api/v1/timesheets/{id}/ · Change a timesheet's description (timesheets:write)
  • POST /api/v1/timesheets/{id}/approve/ · Approve a timesheet (timesheets:approve)
  • POST /api/v1/timesheets/{id}/reject/ · Reject a timesheet (timesheets:approve)
  • GET /api/v1/timesheets/months/ · Months ready to submit (timesheets:read)

Time off

  • GET /api/v1/holidays/ · List company holidays (time_off:read)
  • GET /api/v1/time-off/ · List time off requests (time_off:read)
  • POST /api/v1/time-off/ · Request time off (time_off:write)
  • GET /api/v1/time-off/{id}/ · Get a time off request (time_off:read)
  • PATCH /api/v1/time-off/{id}/ · Change a time off request (time_off:write)
  • POST /api/v1/time-off/{id}/approve/ · Approve a time off request (time_off:approve)
  • POST /api/v1/time-off/{id}/reject/ · Reject a time off request (time_off:approve)
  • GET /api/v1/time-off/balance/ · Leave balance (time_off:read)

Shifts

  • GET /api/v1/attendance/ · List clock-ins (shifts:read)
  • POST /api/v1/attendance/clock-in/ · Clock in (shifts:write)
  • POST /api/v1/attendance/clock-out/ · Clock out (shifts:write)
  • GET /api/v1/shift-swaps/ · List shift swaps (shifts:read)
  • POST /api/v1/shift-swaps/ · Ask for a swap (shifts:write)
  • POST /api/v1/shift-swaps/{id}/accept/ · Accept a swap (shifts:write)
  • POST /api/v1/shift-swaps/{id}/approve/ · Approve a swap (shifts:write)
  • POST /api/v1/shift-swaps/{id}/reject/ · Turn down a swap (shifts:write)
  • GET /api/v1/shifts/ · List shifts (shifts:read)
  • POST /api/v1/shifts/ · Add a shift (shifts:write)
  • GET /api/v1/shifts/{id}/ · Get a shift (shifts:read)
  • PATCH /api/v1/shifts/{id}/ · Change a shift (shifts:write)
  • POST /api/v1/shifts/{id}/assignments/ · Put people on a shift (shifts:write)
  • POST /api/v1/shifts/{id}/cancel/ · Cancel a shift (shifts:write)
  • POST /api/v1/shifts/{id}/publish/ · Publish a shift (shifts:write)

People

People to assign tickets to.

  • GET /api/v1/users/ · List people (users:read)
  • POST /api/v1/users/{id}/deactivate/ · Deactivate a person (users:write)
  • GET /api/v1/users/{id}/groups/ · A person's groups and permissions (groups:read)
  • PUT /api/v1/users/{id}/groups/ · Change a person's group (users:write)
  • POST /api/v1/users/{id}/reactivate/ · Bring a person back (users:write)
  • POST /api/v1/users/invite/ · Invite a person (users:write)

Groups

  • GET /api/v1/groups/ · List groups (groups:read)
  • POST /api/v1/groups/ · Create a group (groups:write)
  • GET /api/v1/groups/{id}/ · Get a group (groups:read)
  • PATCH /api/v1/groups/{id}/ · Change a group (groups:write)
  • DELETE /api/v1/groups/{id}/ · Delete a group (groups:write)
  • GET /api/v1/groups/{id}/members/ · People in a group (groups:read)
  • POST /api/v1/groups/{id}/members/ · Add people to a group (groups:write)
  • DELETE /api/v1/groups/{id}/members/{user_id}/ · Take a person out of a group (groups:write)
  • POST /api/v1/groups/{id}/reset/ · Reset a built-in group (groups:write)
  • GET /api/v1/groups/catalogue/ · Permissions a group can give (groups:read)

Clients

  • GET /api/v1/client-portal/settings/ · Client portal settings (clients:read)
  • PATCH /api/v1/client-portal/settings/ · Change the client portal settings (clients:write)
  • GET /api/v1/clients/ · List clients (clients:read)
  • POST /api/v1/clients/ · Add a client (clients:write)
  • GET /api/v1/clients/{id}/ · Get a client (clients:read)
  • PATCH /api/v1/clients/{id}/ · Change a client (clients:write)

Invoices

  • GET /api/v1/invoices/ · List invoices (invoices:read)
  • POST /api/v1/invoices/ · Create an invoice (invoices:write)
  • GET /api/v1/invoices/{id}/ · Get an invoice (invoices:read)
  • PATCH /api/v1/invoices/{id}/ · Change an invoice (invoices:write)
  • POST /api/v1/invoices/{id}/send/ · Send an invoice (invoices:write)

Forms

  • GET /api/v1/boards/{id}/email-to-ticket/ · A board's e-mail to ticket settings (forms:read)
  • PATCH /api/v1/boards/{id}/email-to-ticket/ · Change a board's e-mail to ticket settings (forms:write)
  • GET /api/v1/boards/{id}/email-to-ticket/log/ · E-mails a board received (forms:read)
  • POST /api/v1/boards/{id}/email-to-ticket/new-address/ · Give a board a new e-mail address (forms:write)
  • GET /api/v1/boards/{id}/forms/ · A board's forms (forms:read)
  • POST /api/v1/boards/{id}/forms/ · Make a form (forms:write)
  • GET /api/v1/forms/{id}/ · Get a form (forms:read)
  • PATCH /api/v1/forms/{id}/ · Change a form (forms:write)
  • GET /api/v1/forms/{id}/submissions/ · A form's answers (forms:read)

Automations

  • GET /api/v1/automations/{id}/ · Get an automation (automations:read)
  • PATCH /api/v1/automations/{id}/ · Change an automation (automations:write)
  • GET /api/v1/boards/{id}/automation-runs/ · A board's automation run log (automations:read)
  • GET /api/v1/boards/{id}/automations/ · A board's automations (automations:read)
  • POST /api/v1/boards/{id}/automations/ · Add an automation (automations:write)
  • GET /api/v1/boards/{id}/workflow-rules/ · A board's workflow rules (automations:read)
  • POST /api/v1/boards/{id}/workflow-rules/ · Add a workflow rule (automations:write)
  • GET /api/v1/workflow-rules/{id}/ · Get a workflow rule (automations:read)
  • PATCH /api/v1/workflow-rules/{id}/ · Change a workflow rule (automations:write)

Integrations

  • GET /api/v1/integrations/ · Which integrations are connected (integrations:read)

Imports

  • GET /api/v1/imports/ · List imports (imports:read)
  • POST /api/v1/imports/ · Start an import (imports:write)
  • GET /api/v1/imports/{id}/ · Get an import (imports:read)
  • POST /api/v1/imports/{id}/cancel/ · Cancel an import (imports:write)
  • POST /api/v1/imports/{id}/connect/ · Connect with your existing connection (imports:write)
  • POST /api/v1/imports/{id}/discover/ · Read the other tool's structure (imports:write)
  • POST /api/v1/imports/{id}/dry-run/ · Dry run (imports:write)
  • GET /api/v1/imports/{id}/mapping/ · Get the mapping and what to map to (imports:read)
  • PUT /api/v1/imports/{id}/mapping/ · Save the mapping (imports:write)
  • GET /api/v1/imports/{id}/report/ · An import's report (imports:read)
  • POST /api/v1/imports/{id}/start/ · Import (imports:write)
  • POST /api/v1/imports/{id}/upload/ · Upload the export file (imports:write)
  • GET /api/v1/imports/sources/ · Tools you can import from (imports:read)

Audit log

  • GET /api/v1/audit-log/ · Read the audit log (audit_log:read)

Webhooks

Webhooks and their delivery log.

  • GET /api/v1/webhooks/ · List webhooks (webhooks:read)
  • POST /api/v1/webhooks/ · Add a webhook (webhooks:write)
  • GET /api/v1/webhooks/{id}/ · Get a webhook (webhooks:read)
  • PATCH /api/v1/webhooks/{id}/ · Change a webhook (webhooks:write)
  • DELETE /api/v1/webhooks/{id}/ · Remove a webhook (webhooks:write)
  • GET /api/v1/webhooks/{id}/deliveries/ · A webhook's delivery log (webhooks:read)
  • POST /api/v1/webhooks/{id}/test/ · Send a test event (webhooks:write)
Webhooks

Hear about changes as they happen

Add a webhook in Company settings, Developers: an https URL, the events you want and, if you like, the boards. TeamTrackin posts each event as JSON, signed with the webhook's secret.

  • Tried at once, then again after 1 minute, 5 minutes, 30 minutes, 2, 6, 12, 24 and 48 hours
  • Any 2xx answer counts as delivered; redirects aren't followed
  • Turned off after 50 failed deliveries in a row or 7 days of failures, and you're told
  • A delivery log shows every attempt, the answer code and when the next try is
A delivery
ticket.moved
POST https://your-system.example.com/teamtrackin
X-TeamTrackin-Event: ticket.moved
X-TeamTrackin-Delivery: 6f1c…
X-TeamTrackin-Signature: t=1762419600,v1=5d41…

{
  "id": "0b9e…",
  "type": "ticket.moved",
  "occurred_at": "2026-11-06T09:00:00+00:00",
  "origin": { "kind": "user", "ref": null },
  "data": {
    "ticket": { "id": "…", "key": "WEB-12", "title": "Fix login", … },
    "change": { "field": "column", "from": { "title": "To do" }, "to": { "title": "In progress" } }
  }
}
Signatures

Check every delivery came from TeamTrackin

X-TeamTrackin-Signature is t=<unix time>,v1=<hex HMAC-SHA256 of "<t>.<body>"> with your signing secret. Use the exact bytes received. After you make a new secret, deliveries carry a v1 for both secrets for 24 hours.

  • Compare in constant time
  • Refuse old timestamps (five minutes is a good limit)
  • Use the event id to skip repeats
Node.js
verify.js
import crypto from "node:crypto";

// rawBody: the exact bytes received. secret: the webhook's signing secret.
export function verify(rawBody, header, secret, toleranceSeconds = 300) {
  const parts = header.split(",").map((p) => p.split("="));
  const t = parts.find(([k]) => k === "t")?.[1];
  const expected = crypto.createHmac("sha256", secret)
    .update(`${t}.`).update(rawBody).digest("hex");
  const fresh = Math.abs(Date.now() / 1000 - Number(t)) <= toleranceSeconds;
  return fresh && parts.some(([k, v]) => k === "v1" && v.length === expected.length &&
    crypto.timingSafeEqual(Buffer.from(v), Buffer.from(expected)));
}
Signatures

The same check in Python

Any language with HMAC-SHA256 works the same way.

  • hmac.compare_digest for the comparison
  • Read the raw body before parsing the JSON
Python
verify.py
import hashlib, hmac, time

def verify(raw_body: bytes, header: str, secret: str, tolerance: int = 300) -> bool:
    """raw_body: the exact bytes received. secret: the webhook's signing secret."""
    parts = [p.split("=", 1) for p in header.split(",")]
    t = next((v for k, v in parts if k == "t"), "")
    expected = hmac.new(secret.encode(), f"{t}.".encode() + raw_body, hashlib.sha256).hexdigest()
    fresh = t.isdigit() and abs(time.time() - int(t)) <= tolerance
    return fresh and any(k == "v1" and hmac.compare_digest(v, expected) for k, v in parts)
Events

What a webhook can send

Pick any of these when you add a webhook.

Tickets

Every change that matters to another system.

  • ticket.created, ticket.updated
  • ticket.moved, ticket.assigned
  • ticket.resolved, ticket.reopened
  • ticket.deleted, ticket.restored
  • ticket.helper_added, ticket.helper_removed

Comments

Someone commented on a ticket.

  • comment.created

Sprints, releases and imports

Bigger moments on a board. An import sends one event when it finishes, not one per ticket.

  • sprint.started, sprint.completed
  • release.released
  • import.completed
Plans

What each plan gets

Every key is locked to your own company and never does more than the person it acts as. Basic has no API. Passwords, the vault, sign-in settings, billing and payroll payouts are never reachable. Connecting AI tools? See the AI tools docs at /developers/ai-tools.

Standard

3 API keys, 120 requests a minute per key, and webhooks.

  • Read and write: tickets, comments, files, boards, Spaces, sprints, epics, labels, custom fields, search, projects and people (read)
  • Read: time and timesheets
  • AI tools with an API key

Premium

10 API keys, 600 requests a minute per key, and webhooks.

  • Delete on the work areas too
  • Docs and SOPs (they come with Docs)
  • Docs databases, their fields, views and entries
  • Docs whiteboards, their elements, versions and comments
  • Read and write: time, timesheets, time off and shifts
  • Clients, invoices, forms, automations, dashboards and imports
  • Sign in with TeamTrackin for AI chat apps

Enterprise

Unlimited API keys, 1,200 requests a minute per key, and webhooks.

  • Every area and level, including approvals
  • People management, groups and permissions, and the audit log
  • The company AI policy for AI tools

Connect TeamTrackin to the Rest of Your Stack

API keys and webhooks are included on Standard and higher plans. Try TeamTrackin free for 14 days.