---
title: "Card plus nested collections in one envelope"
method: GET
path: "/cards/{id}/detail"
---

# Card plus nested collections in one envelope

`GET /cards/{id}/detail`

## Request

- Base URL: `https://craaft.io/api/v1`
- URL: `https://craaft.io/api/v1/cards/{id}/detail`
- Auth: HTTP bearer

Returns the card (with description) plus comments, events (newest
100, oldest-first), checklist, and attachments. Prefer this over
five sequential GETs when opening a card modal.

## Response `200`

OK

- CardDetail: Envelope for GET /cards/{id}/detail (one authorised round-trip for the card modal).
  - `card` Card, required
    - `id` string, uuid, required
    - `projectId` string, uuid, required
    - `column` string, required
    - `title` string, required
    - `description` string: Full body on GET /cards/{id}, PATCH, create, and /detail. Omitted from GET /projects/{id}/cards and lean SSE card.updated events (position-only moves).
    - `position` number, required
    - `dueDate` string, date-time, nullable
    - `assignedUserId` string, uuid, nullable
    - `assignedUserName` string, nullable
    - `size` integer, nullable: Optional integer size estimate; null when unset
    - `priority` 'low' | 'medium' | 'high' | 'urgent' | 'null', nullable
    - `createdBy` string, uuid, nullable
    - `createdByName` string, nullable
    - `updatedBy` string, uuid, nullable
    - `updatedByName` string, nullable
    - `attachmentCount` integer
    - `checklistDone` integer: Completed checklist items (denormalized count)
    - `checklistTotal` integer: Total checklist items (denormalized count)
    - `tags` string[]
    - `following` boolean: Whether the authenticated caller follows this card
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
  - `comments` Comment[], required
    - `id` string, uuid, required
    - `cardId` string, uuid, required
    - `authorId` string, uuid, required
    - `body` string, required
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time
  - `events` CardEvent[], required: Newest 100 events, oldest-first
    - `id` string, uuid, required
    - `type` 'moved' | 'moved_board' | 'priority' | 'assignee', required
    - `fromValue` string, nullable
    - `toValue` string, nullable
    - `fromName` string, nullable
    - `toName` string, nullable
    - `fromDetail` string, nullable: moved_board only: source column title
    - `toDetail` string, nullable: moved_board only: target column title
    - `actorId` string, uuid, nullable
    - `actorName` string, nullable
    - `createdAt` string, date-time, required
  - `checklist` ChecklistItem[], required
    - `id` string, uuid, required
    - `cardId` string, uuid, required
    - `text` string, required
    - `done` boolean, required
    - `position` number, double, required
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
  - `attachments` Attachment[], required
    - `id` string, uuid, required
    - `cardId` string, uuid, required
    - `name` string, required: Original filename
    - `size` integer, required: Byte size
    - `contentType` string, required
    - `uploadedBy` string, uuid, required
    - `uploadedByName` string, required
    - `createdAt` string, date-time, required

## Other responses

- `401`: Missing or invalid token
- `404`: Resource doesn't exist or caller isn't a member of its workspace

---

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