Update issues

Edits a work item — rename it, rewrite it, move it to another column, re-prioritise it, hand it to somebody, or comment on it.

PATCH /v1/task/projects/{key}/issues/{num}

Addresshttps://api.hanzo.ai/v1/task/projects/{key}/issues/{num}
MethodPATCH
Operationpatch_task_projects_by_key_issues_by_num
AuthAuthorization: Bearer $HANZO_API_KEY

Edits a work item — rename it, rewrite it, move it to another column, re-prioritise it, hand it to somebody, or comment on it. Absent fields are left alone. An issue on GitHub is edited there.

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, because a done card and an open issue are a contradiction.

Assigning it to agent hands it to the coding agent: see assignee.

Request

16 fields, body application/json (required).

FieldInTypeRequiredDescription
keypathstringyesKey is the board — the repository name, from the path.
numpathintegeryesNum is the issue number on that repository, from the path.
assigneebodystring—Assignee hands the work to somebody — a person or an agent, by the name they are known by on the forge.
commentbodystring—Comment is posted on the issue, after every other change — what a person in the issue's thread wants said on it.
descriptionbodystring—Description rewrites the body.
keybodystring—Key is the board — the repository name, from the path.
numbodyinteger (int64)—Num is the issue number on that repository, from the path.
prioritybodystring—Priority re-prioritises it.
replybodytask.Reply—
reply.channelbodystring—Channel is the room inside that workspace, and it is what decides whether there is an address at all.
reply.providerbodystring—Provider is the transport the conversation is on — slack, discord, telegram, teams — and it is what decides who can carry the text at all.
reply.threadbodystring—Thread narrows the address to one thread inside the channel — on Slack the parent message's ts, the same value a reply carries as thread_ts.
reply.turnbodystring—Turn is the turn that renders a run started here: the session whose one message the run's progress and its outcome are shown in.
reply.userbodystring—User is the platform's id for the person the conversation is with — whose run it is.
statusbodystring—Status moves the card to another column.
titlebodystring—Title renames the work item.

Response

StatusBodyMeaning
200task.issueViewok
defaultproblem-detailsrefused

200 body — 19 fields.

FieldInTypeAlwaysDescription
assigneebodystring—Assignee is who holds the work — an IAM username, or the login of the FIRST assignee when a forge issue has several.
createdAtbodyinteger (int64)—CreatedAt is when the item was opened, in unix seconds.
descriptionbodystring—Description is the body, markdown as its author wrote it.
dueAtbodyinteger (int64)—DueAt is when the work is due, in unix seconds; absent means no due date.
extRefbodystring—ExtRef anchors the item to something outside the task — a mirrored issue ("github:owner/repo#123"), a pushed PR branch, or a record on another plane.
idbodystring—ID is the work item's opaque handle, and it is NOT how you address it — ProjectKey plus Number is.
identifierbodystring—Identifier is the human handle, "<key>#<number>" — the board and the number on it, joined.
kindbodystring—Kind is what the item IS: issue, pr or epic.
labelsbodystring[]—Labels are the item's remaining tags, with the status and priority labels lifted OUT — a column that stayed here would render twice, once as the card's column and once as a chip on the card.
numberbodyinteger (int64)—Number is the item's number ON ITS BOARD, from 1 and monotonic there — the forge's own issue number for a forge row, allocated inside the create transaction for an index row so it cannot race.
prioritybodystring—Priority is urgent, high, medium, low or none.
projectKeybodystring—ProjectKey is the board this item is on: the repository name for a forge issue, the index board's key otherwise.
repobodystring—Repo is the git repository the item is bound to, so a repository's Issues and PRs tabs are filters over this one table.
sourcebodystring—Source is which surface OPENED it: team, git, crm, helpdesk, cms or agent.
startAtbodyinteger (int64)—StartAt is when the work starts, in unix seconds; absent means unscheduled.
statusbodystring—Status is the board column: backlog, todo, in_progress, done or canceled, and nothing else.
titlebodystring—Title is the item's one-line summary.
updatedAtbodyinteger (int64)—UpdatedAt is when it last changed, in unix seconds.
urlbodystring—URL is where a person reads the item: its page on the forge or on GitHub.

Failure carries the platform error shape — see Errors.

Examples

hanzo task projects issues update <key> 1
import { Configuration, TaskApi } from 'hanzoai';

const api = new TaskApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.patchTaskProjectsByKeyIssuesByNum({ key: 'key', num: 'num', assignee: "<assignee>", comment: "<comment>" });
from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import TaskApi

client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = TaskApi(client).patch_task_projects_by_key_issues_by_num(key='key', num='num', assignee="<assignee>", comment="<comment>")
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

resp, _, err := client.TaskAPI.PatchTaskProjectsByKeyIssuesByNum(context.Background()).Execute()
if err != nil {
	return err
}
use hanzo_client::apis::{configuration::Configuration, task_api};

let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();

let result = task_api::patch_task_projects_by_key_issues_by_num(&cfg, Default::default()).await?;
import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.TaskApi;

ApiClient client = new ApiClient();
client.setBearerToken(System.getenv("HANZO_API_KEY"));

var result = new TaskApi(client).patchTaskProjectsByKeyIssuesByNum();
curl -X PATCH https://api.hanzo.ai/v1/task/projects/<key>/issues/1 \
  -H "Authorization: Bearer $HANZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
       "assignee": "<assignee>",
       "comment": "<comment>"
     }'

MCP reaches task through the task tool, which names its 10 operations with its own verbs — this one among them, under a name only MCP declares. describe explains any of them:

curl -X POST https://api.hanzo.ai/v1/mcp \
  -H "Content-Type: application/json" \
  -d '{
       "jsonrpc": "2.0",
       "id": 1,
       "method": "tools/call",
       "params": {
         "name": "describe",
         "arguments": {
           "op": "get_task_board"
         }
       }
     }'

Task API · All Hanzo APIs · Interactive reference

Was this page useful?