---
title: "Export a project as JSON or CSV"
method: GET
path: "/projects/{id}/export"
---

# Export a project as JSON or CSV

`GET /projects/{id}/export`

## Request

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

Returns a versioned JSON envelope containing the project, its columns,
cards (with metadata and checklists), comments, and attachment metadata. Attachment
bytes are not included. Available on every plan.

With `format=csv` the response is `text/csv` with one row per card,
prefixed with a UTF-8 BOM so Excel decodes it as UTF-8 rather than
the system ANSI codepage. Parse it as `utf-8-sig` or strip the three
leading bytes. CSV can't carry the envelope's nesting, so comments
and attachments collapse to `comment_count` / `attachment_count` -
JSON stays the lossless format. Timestamps are RFC3339 UTC, `tags` is comma-joined,
and unset optional fields are empty cells. Cells starting with `=`,
`+`, `-` or `@` are prefixed with a single quote so spreadsheets
treat user-entered card text as text rather than a formula.

## Query parameters

- `format` 'json' | 'csv'

## Response `200`

Export payload

- ProjectExport
  - `version` integer, required: Export format version. 2 adds columns[].isDone, columns[].cardLimit and cards[].checklist
  - `exportedAt` string, date-time, required
  - `project` object, required
    - `id` string, required
    - `name` string, required
    - `description` string
    - `isFavorite` boolean, required
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
  - `columns` object[], required
    - `key` string, required
    - `name` string, required
    - `color` string
    - `position` number, double, required
    - `isDone` boolean: Version 2
    - `cardLimit` integer: Version 2. Omitted when unset
  - `cards` object[], required
    - `id` string, required
    - `title` string, required
    - `description` string
    - `columnKey` string, required
    - `position` number, double, required
    - `dueDate` string, date-time, nullable
    - `priority` string
    - `size` integer, nullable
    - `assignee` ProjectExportUser
      - `username` string, required
      - `name` string, required
    - `checklist` object[]: Version 2. Omitted when the card has no checklist items
      - `text` string, required
      - `done` boolean, required
    - `createdBy` ProjectExportUser
      - `username` string, required
      - `name` string, required
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
    - `comments` object[]
      - `author` ProjectExportUser, required
        - `username` string, required
        - `name` string, required
      - `body` string, required
      - `createdAt` string, date-time, required
    - `attachments` object[]
      - `filename` string, required
      - `size` integer, required
      - `uploader` ProjectExportUser
        - `username` string, required
        - `name` string, required
      - `uploadedAt` string, date-time, required

## Other responses

- `400`: Unsupported `format` - expected `json` or `csv`
- `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)
