---
title: "Apply up to 100 partial card updates in one transaction"
method: PATCH
path: "/cards/bulk"
---

# Apply up to 100 partial card updates in one transaction

`PATCH /cards/bulk`

## Request

- Base URL: `https://craaft.io/api/v1`
- URL: `https://craaft.io/api/v1/cards/bulk`
- Auth: HTTP bearer

All-or-nothing batch update. Each item is `{ "id": … }` plus any
fields the single-card PATCH accepts, with identical semantics
(present = apply, `null` = clear, absent = leave alone). Column /
priority / assignee changes are recorded to each card's activity
log. One invalid item or missing card fails the whole batch and
the error names the offending index. Bulk requests never send
notification emails. Body limit 1 MiB.

## Request body

- object
  - `cards` object[], required
    - `id` string, uuid, required
    - `title` string
    - `description` string
    - `column` string
    - `position` number
    - `dueDate` string, date-time, nullable
    - `assignedUserId` string, uuid, nullable
    - `size` integer, nullable
    - `priority` 'low' | 'medium' | 'high' | 'urgent' | 'null', nullable
    - `tags` string[]

## Response `200`

Updated cards, in request order

- BulkCardsResponse
  - `cards` Card[], required: Affected cards, in request order
    - `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

## Other responses

- `400`: Invalid item - message names the index
- `404`: A referenced card doesn't exist or isn't accessible; nothing was applied

---

[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/43e34309dfe2?raw)
