---
title: "Create a card"
method: POST
path: "/api/v2/projects/{projectId}/cards"
tags: ["Cards"]
---

# Create a card

`POST /api/v2/projects/{projectId}/cards`

## Request

- Base URL: `https://davinci-app.com`
- URL: `https://davinci-app.com/api/v2/projects/{projectId}/cards`
- Auth: HTTP bearer

Creates a project card and records the creation in card history.

## Headers

- `Idempotency-Key` string

## Request body

- CreateCardRequest
  - `name` string, required: Sanitized by the server to a resource name of at most 255 characters.
  - `description` string, nullable
  - `resolution` string, nullable
  - `isOpen` boolean
  - `deadline` string, date-time, nullable
  - `effort` integer, nullable
  - `assigneeId` string, uuid: Optional initial assignee. The server validates current Project membership and creates the Card, assignment, and both history entries in one transaction. Use `assigneeIds` for new integrations.
  - `assigneeIds` string[]
  - `tagIds` string[]
  - `cardLinks` CreateTeamCardLinkInput[]
    - `cardId` string, uuid, required
    - `linkType` 'relates_to' | 'depends_on' | 'dependency_of'

## Response `201`

Card created.

- CardResponse
  - `card` AgileCard, required
    - `id` string, uuid, required
    - `name` string, required
    - `description` string, nullable, required
    - `resolution` string, nullable, required: Optional Markdown resolution; closing or reopening the card does not clear it.
    - `created_by_user` string, uuid, nullable, required
    - `author_display_name` string, nullable: Display name of the user who created the card, when available.
    - `created_at` string, date-time, nullable, required
    - `closed_at` string, date-time, nullable: Timestamp of the latest transition to the closed state; null while open.
    - `updated_at` string, date-time, nullable, required
    - `deadline` string, date-time, nullable, required
    - `is_open` boolean, required
    - `project_id` string, uuid, required
    - `effort` integer, nullable, required: Unit-agnostic estimate, commonly interpreted as story points or hours.
  - `historyHeadId` string, uuid, nullable, required: Latest committed card-history row ID; null only before a card has history.
  - `historyHeadSequence` string, nullable, required: Globally monotonic card-history sequence.
  - `indexCard` CardIndexRow
    - `id` string, uuid, required
    - `project_id` string, uuid, required
    - `name` string, required
    - `resolution` string, nullable, required
    - `is_open` boolean, required
    - `deadline` string, date-time, nullable, required
    - `effort` integer, nullable, required
    - `created_by_user` string, uuid, nullable
    - `author_display_name` string, nullable
    - `created_at` string, date-time, nullable, required
    - `closed_at` string, date-time, nullable
    - `updated_at` string, date-time, nullable, required
    - `tag_ids` string[], required
    - `user_ids` string[], required
    - `team_ids` string[], required
    - `team_status_ids` string[], required
    - `sprint_ids` string[], required
    - `team_statuses` CardPlacementStatus[], required
      - `team_id` string, uuid, required
      - `status_id` string, uuid, required
      - `status_name` string, nullable, required
      - `status_color` string, nullable, required
      - `sprint_id` string, uuid, nullable, required
    - `team_placements` CardPlacement[], required
      - `team_id` string, uuid, required
      - `status_id` string, uuid, nullable, required
      - `sprint_id` string, uuid, nullable, required
    - `history_head_id` string, uuid, nullable, required: Latest committed card-history row ID; null only before a card has history.
    - `history_head_sequence` string, nullable, required: Globally monotonic card-history sequence.
    - `search_text` string, required

## Other responses

- `400`: Malformed request parameters or body. Agile requests may return `INVALID_PAGINATION` or `INVALID_IDEMPOTENCY_KEY`.
- `401`: No credential was supplied, or the supplied credential is malformed, expired, or revoked. A credential that is present but unusable is never downgraded to an anonymous request.
- `403`: Authenticated but not authorized. Either the acting user lacks the required resource permission, the key's scope ceiling excludes it, or the endpoint rejects this credential type (`CREDENTIAL_NOT_PERMITTED`).
- `404`: The resource does not exist in the parent named by the path, or is hidden from the caller. Absence and privacy denial are deliberately indistinguishable so project, organization, and private-team existence cannot be probed.
- `409`: The resource's current state no longer permits this operation, or a unique name, hierarchy, dependency, or lifecycle invariant would be violated. Examples include an active sprint that must be completed first, a duplicate card-tag name (`TAG_NAME_CONFLICT`), or a dependency cycle. Idempotent creates may return `IDEMPOTENCY_KEY_REUSED` or `IDEMPOTENCY_REQUEST_IN_PROGRESS`; the latter includes `Retry-After`.
- `429`: Request rate exceeded, either globally or for this key.
- `500`: Unexpected server error.
- `503`: Idempotency protection is temporarily unavailable. Error code is `IDEMPOTENCY_UNAVAILABLE`; the response includes `Retry-After`.

## Changes

- **2026-09-24** (v2) `4b520e771e08`: 4 info
  - added the new optional request property `assigneeIds`
  - added the new optional request property `cardLinks`
  - added the new optional request property `tagIds`
  - request property `assigneeId` deprecated
- **2026-09-15** (v2) `aa52eb4e8fd3`: 1 info
  - added the new optional request property `assigneeId`
- **2026-09-15** (v2) `67c8b8616dbb`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/celedon-solutions/apis/davinci-public-api/changes/api/v2/projects/:projectId/cards/post.md)

---

[API](https://skmtc.dev/celedon-solutions/apis/davinci-public-api.md) - [All operations](https://skmtc.dev/celedon-solutions/apis/davinci-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/celedon-solutions/apis/davinci-public-api/revisions/279218ca2e8d?raw)
