Tracker
Package tracker is your org's issue tracker: projects, issues, and the filters to find them.
Package tracker is your org's issue tracker: projects, issues, and the filters to find them.
| Base URL | https://api.hanzo.ai |
| Operations | 9 |
| Auth | Authorization: Bearer $HANZO_API_KEY |
tracker
GET /v1/tracker/milestones
Returns every milestone across your org's repositories, each stamped with the repository it belongs to.
The forge scopes milestones to a repository and publishes no org-level list, so this is a server-side fan-out over the repositories you can see. It runs here rather than in the browser because a client-side fan-out would need the forge reachable from the page and a credential held there.
PATCH /v1/tracker/projects/{key}/issues/{num}
Edits a work item — rename it, rewrite it, move it to another column, or re-prioritise it. Absent fields are left alone.
MOVING A CARD IS A RELABEL. The column lives in the forge's label set, so the
move replaces that set rather than writing a status column here that a
forge-side change could contradict. Moving to done also CLOSES the issue on
the forge, because a done card and an open issue are a contradiction.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
key | path | string | yes | Key is the board — the repository name, from the path. |
num | path | integer | yes | Num is the issue number on that repository, from the path. |
Request body — application/json (required)
| Field | Type | Required | Description |
|---|---|---|---|
description | string | — | Description rewrites the body. |
key | string | — | Key is the board — the repository name, from the path. |
num | integer | — | Num is the issue number on that repository, from the path. |
priority | string | — | Priority re-prioritises it. |
status | string | — | Status moves the card to another column. |
title | string | — | Title renames the work item. |
GET /v1/tracker/projects/{key}/issues
Returns one board's issues — the work items of that repository on the forge, with their column, priority, assignee and labels.
The column is a LABEL on the forge, so the board and the forge web UI are the same object seen twice: relabelling in either moves the card in both. A closed issue reads as done whatever its labels say.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
key | path | string | yes | Key is the project whose issues to list, from the path. |
status | query | string | — | Status keeps only issues in that board column: backlog, todo, in_progress, done or canceled. |
kind | query | string | — | Kind keeps only work items of that shape: issue, pr or epic. |
repo | query | string | — | Repo keeps only issues bound to that git repository. |
source | query | string | — | Source keeps only issues opened from that surface: team, git, crm, helpdesk, cms or agent. |
scheduled | query | boolean | — | Scheduled keeps only issues that carry a date — a start, a due date or both. |
POST /v1/tracker/projects/{key}/issues
Opens a work item on the board — an issue on that repository on the deployment's forge, filed as YOU.
The column and priority are written as LABELS, which is what makes the card and the forge issue the same object: someone relabelling in the forge web UI has moved your card.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
key | path | string | yes | Key is the board — the repository name, from the path. |
Request body — application/json (required)
| Field | Type | Required | Description |
|---|---|---|---|
description | string | — | Description becomes the issue body. |
key | string | — | Key is the board — the repository name, from the path. |
priority | string | — | Priority is one of none, urgent, high, medium or low. |
status | string | — | Status is the board column to open into: backlog, todo, in_progress, done or canceled. |
title | string | — | Title is required. |
GET /v1/tracker/projects/{key}
Returns one board of your org by its key — the repository name. 404 when your org has no repository under that key, or when your own forge account cannot see it.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
key | path | string | yes | Key is the project's org-unique handle: 2-8 uppercase alphanumerics starting with a letter ("ENG", "OPS2"). |
PATCH /v1/tracker/projects/{key}
Refused — a board is a repository on the forge
Answers 405. A tracker board IS a repository on this deployment's forge, so creating, renaming and deleting one is a FORGE operation carried out with FORGE permissions.
Offering it here would put a second door on the same object, guarded by this surface instead of by the forge — a weaker guard on the same thing. So the route exists and refuses, rather than 404ing: "not this service's job" and "no such thing" are different facts, and the body names the forge so a caller knows where the job IS done.
What this surface DOES own is the work on a board: list the boards you can see, read and file their issues, move a card between columns, and roll milestones up across the org. Those are the routes beside this one.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
key | path | string | yes |
DELETE /v1/tracker/projects/{key}
Refused — a board is a repository on the forge
Answers 405. A tracker board IS a repository on this deployment's forge, so creating, renaming and deleting one is a FORGE operation carried out with FORGE permissions.
Offering it here would put a second door on the same object, guarded by this surface instead of by the forge — a weaker guard on the same thing. So the route exists and refuses, rather than 404ing: "not this service's job" and "no such thing" are different facts, and the body names the forge so a caller knows where the job IS done.
What this surface DOES own is the work on a board: list the boards you can see, read and file their issues, move a card between columns, and roll milestones up across the org. Those are the routes beside this one.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
key | path | string | yes |
GET /v1/tracker/projects
Returns the boards of your org — one per repository on the deployment's forge that you can see. The key is the repository name, and it is what addresses the board's issues.
Archived repositories are omitted: they are not live work. The set is the FORGE's answer for your own account, so two people in one org can legitimately see different boards.
POST /v1/tracker/projects
Refused — a board is a repository on the forge
Answers 405. A tracker board IS a repository on this deployment's forge, so creating, renaming and deleting one is a FORGE operation carried out with FORGE permissions.
Offering it here would put a second door on the same object, guarded by this surface instead of by the forge — a weaker guard on the same thing. So the route exists and refuses, rather than 404ing: "not this service's job" and "no such thing" are different facts, and the body names the forge so a caller knows where the job IS done.
What this surface DOES own is the work on a board: list the boards you can see, read and file their issues, move a card between columns, and roll milestones up across the org. Those are the routes beside this one.
How is this guide?