---
title: "Move a card to a column and a position"
method: PATCH
path: "/projects/{projectId}/cards/{cardId}/move"
tags: ["Projects"]
---

# Move a card to a column and a position

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

## Request

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

The one gesture that changes a card's state, since the state IS the column. Kept apart from editing so that renaming a card never becomes a transactional write across the whole board. `position` is the rank the card takes among the live cards of the target column, counted without itself; a rank past the end simply lands it at the bottom.

## Path parameters

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

## Request body

- object
  - `columnId` string, uuid, required: Target column — must belong to this project.
  - `position` integer, required

## Response `200`

The moved card, plus the new contents of the source and target columns (one entry when it stayed in the same column).

- 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.
  - `columns` ProjectColumnOrder[], required
    - `id` string, uuid, required
    - `cardIds` string[], required: Live cards, top to bottom. Archived cards are never listed.

## Other responses

- `400`: Validation error, malformed id, or `column_not_in_project`.
- `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)
