# Personal tasks

A personal task belongs to you alone, in your hidden Personal space, such as "Book SFO to Milan for 3 Nov". Sensei files one from a thread with `kosuke tasks create personal`. Your API key reads and changes only your own personal tasks. Move one into a workspace when it becomes the team's work.

Your Personal space is a workspace only you belong to, so its tasks use the [Tasks](https://kosuke.ai/docs/endpoint-reference/tasks.md) routes. The `/api/personal-tasks` endpoints below are deprecated: they keep working for CLIs released before `personal` reached the workspace routes, and will be removed. Do not build on them.

| Method | Path                                                                                               | Description                                                                                                                                                                                                                                                                                                                                                   |
| ------ | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| GET    | `/api/personal-tasks?status=&priorities=&q=&doneSince=&threadId=&limit=&cursor=&includeOpenCount=` | Deprecated: `kosuke tasks list personal` now calls GET /api/organizations/{workspaceId}/tasks with your Personal space id. List your personal tasks, newest first. status is a csv of todo, in_progress, done; includeOpenCount counts Todo and In progress with the same filters, independent of status and cursor.                                          |
| POST   | `/api/personal-tasks`                                                                              | Deprecated: `kosuke tasks create personal` now calls POST /api/organizations/{workspaceId}/tasks with your Personal space id. File a personal task: yours alone, in no workspace. From a Sensei Turn it joins the Turn’s thread unless threadId names another. Check `kosuke tasks list personal` for one that covers it first.                               |
| GET    | `/api/personal-tasks/{taskId}`                                                                     | Deprecated: `kosuke tasks get personal` now calls GET /api/organizations/{workspaceId}/tasks/{taskId} with your Personal space id. Get one of your personal tasks.                                                                                                                                                                                            |
| PATCH  | `/api/personal-tasks/{taskId}`                                                                     | Deprecated: `kosuke tasks update personal` now calls PATCH /api/organizations/{workspaceId}/tasks/{taskId} with your Personal space id. Edit one of your personal tasks. dueOn or threadId null clears it.                                                                                                                                                    |
| DELETE | `/api/personal-tasks/{taskId}`                                                                     | Deprecated: `kosuke tasks delete personal` now calls DELETE /api/organizations/{workspaceId}/tasks/{taskId} with your Personal space id. Delete one of your personal tasks.                                                                                                                                                                                   |
| POST   | `/api/personal-tasks/{taskId}/move`                                                                | Deprecated: `kosuke tasks move personal` now calls POST /api/organizations/{workspaceId}/tasks/{taskId}/move with your Personal space id. Move a Todo or In progress personal task into a workspace you belong to, as its Todo task assigned to you; the personal task is removed. A due date becomes the description’s last line. Only when the member asks. |
| POST   | `/api/personal-tasks/{taskId}/start`                                                               | Deprecated: `kosuke tasks start personal` now calls POST /api/organizations/{workspaceId}/tasks/{taskId}/start with your Personal space id. Start a Todo or In progress Personal task in a deployed Personal Repository.                                                                                                                                      |

## Your Personal space

`kosuke tasks list|create|get|update|delete|move|start personal` reads your Personal space id with `kosuke user personal-space get` (`GET /api/user/personal-space`, which answers `{ data: { id } }` and makes the space on first use), then calls the same workspace route with that id as `workspaceId`. Every flag of the workspace command works, and the answers are workspace tasks. `GET /api/tasks` lists your Personal space beside your workspaces.

Only you reach your Personal space: another member's credential is refused with `403`, and their `GET /api/tasks` never lists your tasks. Sensei reaches it for you. A session or Cron credential acts in its own workspace and has no Personal space, so `personal` is refused there.

```sh
kosuke tasks create personal --title "Send Q3 invoices to Giulia" --due-on 2026-11-03
kosuke tasks list personal --status todo,in_progress --include-open-count true
kosuke tasks update personal <taskId> --status in_progress
kosuke tasks move personal <taskId> --org-id <workspaceId>
```

Create needs only `title`; `description` is optional and defaults to an empty string. All legacy create, update, list, move and start inputs remain available.

Two things to know about the workspace routes:

- `ifRevision` accepts the task's `descriptionRevision`, which `tasks get` prints; a sessionless task also accepts its `updatedAt` for compatibility. A changed task answers `409` `TASK_CONFLICT`.
- Errors carry the `TASK_*` codes of [Tasks](https://kosuke.ai/docs/endpoint-reference/tasks.md).

## Deprecated endpoints

What follows describes `/api/personal-tasks`, for a client that still calls it.

### The task

| Field | Value |
| --- | --- |
| `id` | The task id. |
| `title` | 1 to 255 characters. |
| `description` | Markdown. Empty by default. |
| `priority` | `none`, `low`, `medium`, `high` or `urgent`. Default `none`. |
| `status` | `todo`, `in_progress` or `done`. Default `todo`. |
| `dueOn` | A calendar day, `YYYY-MM-DD`, or null. It has no time and no time zone. |
| `threadId` | The Sensei thread that filed it or works on it, or null. |
| `createdAt`, `updatedAt` | ISO timestamps. |
| `doneAt` | When it became Done, or null. Leaving Done clears it. |

A personal task has no repository, branch, sandbox or pull request. Sensei works on it in its thread.

### File and edit

Create takes `title` and optional `description`, `priority`, `status`, `dueOn` and `threadId`. It answers `201` with `{ data: PersonalTask }`. A `threadId` must name one of your own Sensei threads. From a Sensei Turn, the task joins the Turn's thread unless `threadId` names another.

Update takes any of the same fields. Send `dueOn` or `threadId` as `null` to clear it. Add `ifRevision`, the task's `updatedAt` as you read it, to write only over the task you read. When the task changed since, nothing changes and the answer is `409` with the current task in `task`. Delete answers `204`.

### List

List answers `{ data: PersonalTask[], meta: { pagination: { pageSize, hasMore, nextCursor } } }`, newest first. Pass `nextCursor` as `cursor` for the next page. `limit` is at most 100.

| Filter | Value |
| --- | --- |
| `status` | Comma-separated `todo`, `in_progress`, `done`. |
| `priorities` | Comma-separated priorities. |
| `q` | Text the title contains. |
| `doneSince` | An ISO timestamp. Done tasks finished before it are left out. |
| `threadId` | One thread's tasks. |
| `includeOpenCount` | `true` adds `meta.openCount`: Todo plus In progress under the same filters, independent of `status` and `cursor`. |

### Move into a workspace

Move takes `orgId`, a workspace you belong to. The personal task becomes that workspace's Todo task, with its title, description and priority, and you as its Assignee. A due date becomes the description's last line, such as `Due 3 Nov 2026.` The personal task is removed in the same step. Move answers `{ data: { orgId, taskId } }`, where `taskId` is the new workspace task.

### Limits

- A Done personal task does not move.
- A workspace task never becomes personal.
- Sandbox, Cron and Slack credentials reach no personal task. Sensei can file, read, edit and move them, but not delete one.

### Errors

| Status | Code | When |
| --- | --- | --- |
| 400 | `VALIDATION_ERROR` | The body or a filter does not match the schema, such as an empty title or a `dueOn` that is not a day. |
| 400 | `PERSONAL_TASK_INVALID_THREAD` | `threadId` is not one of your Sensei threads. |
| 401 | `UNAUTHORIZED` | No valid credential. |
| 403 | `PERSONAL_TASK_FORBIDDEN` | A move names a workspace you do not belong to. |
| 404 | `PERSONAL_TASK_NOT_FOUND` | The task does not exist or is not yours. |
| 409 | `PERSONAL_TASK_DONE` | A move named a Done task. |
| 409 | `PERSONAL_TASK_CONFLICT` | An edit's `ifRevision` is not the task's `updatedAt`: the task changed since you read it. |

[Responses and errors](https://kosuke.ai/docs/api/errors.md) has the full table.

## Next steps

- [Tasks](https://kosuke.ai/docs/endpoint-reference/tasks.md)
- [Sensei](https://kosuke.ai/docs/endpoint-reference/sensei.md)
