# Get issues

URL: https://docs.hanzo.ai/docs/openapi/task/get-task-projects-by-key-issues-by-num

> Returns ONE work item in full — its description included.

`GET /v1/task/projects/{key}/issues/{num}`

> [Task →](https://docs.hanzo.ai/docs/openapi/task) · [All API references →](https://docs.hanzo.ai/docs/openapi) · [Get started →](https://docs.hanzo.ai/docs/guides)

|               |                                                            |
| ------------- | ---------------------------------------------------------- |
| **Address**   | `https://api.hanzo.ai/v1/task/projects/{key}/issues/{num}` |
| **Method**    | `GET`                                                      |
| **Operation** | `get_task_projects_by_key_issues_by_num`                   |
| **Auth**      | `Authorization: Bearer $HANZO_API_KEY`                     |

Returns ONE work item in full — its description included.

The list reads answer a board, and a board is a summary: the description is
where the actual content of a work item lives — what an issue asks for, what
an epic's acceptance criteria are — and no read on this surface returned it.
The address is the one PATCH already accepts, so an item you can move is now
an item you can read.

It reads the forge directly rather than filtering the org fan-out, then falls
back to the index for a board the forge has never heard of — the same order,
and the same reason, as GetProject: a row is one kind of thing however it came
to exist, so a caller does not have to know which store it is in to fetch it.

## Request

2 fields.

| Field | In   | Type    | Required | Description                                                      |
| ----- | ---- | ------- | -------- | ---------------------------------------------------------------- |
| `key` | path | string  | yes      | Key is the board — the repository name, or an index board's key. |
| `num` | path | integer | yes      | Num is the issue's number on that board.                         |

## Response

| Status    | Body            | Meaning |
| --------- | --------------- | ------- |
| `200`     | task.issueView  | ok      |
| `default` | problem-details | refused |

`200` body — 19 fields.

| Field         | In   | Type            | Always | Description                                                                                                                                                                                      |
| ------------- | ---- | --------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `assignee`    | body | string          | —      | Assignee is who holds the work — an IAM username, or the login of the FIRST assignee when a forge issue has several.                                                                             |
| `createdAt`   | body | integer (int64) | —      | CreatedAt is when the item was opened, in unix seconds.                                                                                                                                          |
| `description` | body | string          | —      | Description is the body, markdown as its author wrote it.                                                                                                                                        |
| `dueAt`       | body | integer (int64) | —      | DueAt is when the work is due, in unix seconds; absent means no due date.                                                                                                                        |
| `extRef`      | body | string          | —      | 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.                                            |
| `id`          | body | string          | —      | ID is the work item's opaque handle, and it is NOT how you address it — ProjectKey plus Number is.                                                                                               |
| `identifier`  | body | string          | —      | Identifier is the human handle, "\<key>#\<number>" — the board and the number on it, joined.                                                                                                     |
| `kind`        | body | string          | —      | Kind is what the item IS: issue, pr or epic.                                                                                                                                                     |
| `labels`      | body | string\[]       | —      | 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.   |
| `number`      | body | integer (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. |
| `priority`    | body | string          | —      | Priority is urgent, high, medium, low or none.                                                                                                                                                   |
| `projectKey`  | body | string          | —      | ProjectKey is the board this item is on: the repository name for a forge issue, the index board's key otherwise.                                                                                 |
| `repo`        | body | string          | —      | Repo is the git repository the item is bound to, so a repository's Issues and PRs tabs are filters over this one table.                                                                          |
| `source`      | body | string          | —      | Source is which surface OPENED it: team, git, crm, helpdesk, cms or agent.                                                                                                                       |
| `startAt`     | body | integer (int64) | —      | StartAt is when the work starts, in unix seconds; absent means unscheduled.                                                                                                                      |
| `status`      | body | string          | —      | Status is the board column: backlog, todo, in\_progress, done or canceled, and nothing else.                                                                                                     |
| `title`       | body | string          | —      | Title is the item's one-line summary.                                                                                                                                                            |
| `updatedAt`   | body | integer (int64) | —      | UpdatedAt is when it last changed, in unix seconds.                                                                                                                                              |
| `url`         | body | string          | —      | URL is where a person reads the item: its page on the forge or on GitHub.                                                                                                                        |

Failure carries the platform error shape — see [Errors](https://docs.hanzo.ai/docs/errors).

## Examples

**CLI**

```bash
hanzo task projects issues get <key> 1
```

**SDK**

**.ts**

```ts
import { Configuration, TaskApi } from 'hanzoai';

const api = new TaskApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.getTaskProjectsByKeyIssuesByNum({ key: 'key', num: 'num' });
```

**.py**

```python
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).get_task_projects_by_key_issues_by_num(key='key', num='num')
```

**.go**

```go
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

resp, _, err := client.TaskAPI.GetTaskProjectsByKeyIssuesByNum(context.Background()).Execute()
if err != nil {
	return err
}
```

**.rs**

```rust
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::get_task_projects_by_key_issues_by_num(&cfg, Default::default()).await?;
```

**.java**

```java
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).getTaskProjectsByKeyIssuesByNum();
```

**HTTP**

```bash
curl https://api.hanzo.ai/v1/task/projects/<key>/issues/1 \
  -H "Authorization: Bearer $HANZO_API_KEY"
```

**MCP**

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:

```bash
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](https://docs.hanzo.ai/docs/openapi/task) · [All Hanzo APIs](https://docs.hanzo.ai/docs/openapi) · [Interactive reference](https://docs.hanzo.ai/docs/openapi/reference)
