---
title: "Edit a card"
method: PATCH
path: "/projects/{projectId}/cards/{cardId}"
tags: ["Projects"]
---

# Edit a card

`PATCH /projects/{projectId}/cards/{cardId}`

## Request

- Base URL: `https://api.atako.ai`
- URL: `https://api.atako.ai/projects/{projectId}/cards/{cardId}`
- Auth: HTTP bearer

At least one known field. An omitted field is left alone; an explicit `null` on `assigneeId`, `dueAt` or `blocked` clears it — that is how a card is unassigned, unscheduled or unblocked. Moving a card is a separate operation.

## Path parameters

- `projectId` string, uuid, required
- `cardId` string, uuid, required

## Request body

- object
  - `title` string
  - `description` string
  - `assigneeId` string, uuid, nullable
  - `priority` 'low' | 'normal' | 'high'
  - `blocked` string, nullable
  - `labels` string[]
  - `checklist` ProjectCardChecklistItem[]
    - `text` string, required
    - `done` boolean, required
  - `dueAt` string, date-time, nullable

## Response `200`

- object
  - `card` ProjectCard, required: A unit of work on the board. It carries no status field: where the card stands IS its state, so read `column`. `blocked` and `due` are absent rather than null when unset — asking whether a card is blocked is asking for the reason.
    - `id` string, uuid, required
    - `title` string, required
    - `description` string, required
    - `assignee` string, uuid, nullable, required: A ProjectParticipant id (project_members row) — human or agent, both assignable — or null when nobody has taken the card.
    - `column` string, uuid, required: The column the card stands in: its state.
    - `priority` 'low' | 'normal' | 'high', required
    - `blocked` string: Why the card cannot move. Absent when it is not blocked — there is no blocked flag, only the reason.
    - `labels` string[], required
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
    - `due` string, date-time: Absent when the card has no deadline.
    - `checklist` ProjectCardChecklistItem[], required
      - `text` string, required
      - `done` boolean, required
    - `comments` ProjectCardComment[], required: Oldest first — a discussion is read in the order it was written, not like an inbox.
      - `id` string, uuid
      - `author` string, required
      - `authorUserId` string, uuid: The human author — absent for an agent.
      - `authorAgentId` string, uuid: Present only when an agent wrote it.
      - `at` string, date-time, required
      - `editedAt` string, date-time: Present when the text was edited afterwards.
      - `text` string, required
      - `parentId` string, uuid, nullable: The thread ROOT this replies to; null on a root (one level).
      - `anchor` string, nullable: Root only: the id of the `[comment id="…"]…[/comment]` mark wrapping the commented passage in the Markdown, or `block:<key>` for a block without text (image, file, code). Null = general discussion.
      - `quote` string, nullable: The commented passage, frozen — the thread stays readable if the text goes.
      - `resolvedAt` string, date-time, nullable: Root only: the thread was resolved. A reply reopens it.

## Other responses

- `400`: Validation error, a body with no editable field, `column_not_in_project`, or `assignee_not_member`.
- `401`: Missing, malformed, or invalid bearer token / API key, or revoked session (SESSION_REVOKED).
- `404`: Not found, or the caller is not authorized to access this resource.

---

[API](https://skmtc.dev/atako/apis/atako-api.md) · [All operations](https://skmtc.dev/atako/apis/atako-api/llms.txt) · [OpenAPI document](https://skmtc.dev/atako/apis/atako-api/revisions/aa555c56fbd7?raw)
