---
title: "Import a board"
method: POST
path: "/imports"
---

# Import a board

`POST /imports`

## Request

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

Creates a new board from an uploaded Trello, Jira, Asana, CSV or
craaft export. It never writes into an existing board. Takes the same
fields as `POST /imports/preview` and runs the same parse. All or
nothing: a failed import leaves no board behind. The board is
private; each matched assignee listed in the preview's `access` is
added to it as a contributor. A craaft export's board description
comes across. No notifications
are sent (no emails, mention, assignment or follower notifications,
no Slack or Discord messages). The new board counts against the
workspace's board cap.

If the board is created but reloading it fails, the `201` still
carries at least `id` and `name`.

## Response `201`

Created. Shaped like the `POST /projects` response.

- Project
  - `id` string, uuid, required
  - `workspaceId` string, uuid, required
  - `name` string, required
  - `description` string
  - `isFavorite` boolean
  - `publicToken` string: Non-empty when public sharing is on
  - `backgroundImage` string
  - `backgroundColor` string: Board background hex color (#rrggbb), empty when unset; mutually exclusive with backgroundImage
  - `colorScheme` string
  - `textColor` 'dark' | 'light'
  - `showMilestones` boolean: Whether the board's top bar shows the milestones button. Default true.
  - `showArchived` boolean: Whether the board's top bar shows the archived cards button. Default true.
  - `showFiles` boolean: Whether the board's top bar shows the files button. Default true.
  - `showStandup` boolean: Whether the board's top bar shows the standup button. Default true.
  - `showActivity` boolean: Whether the board's top bar shows the activity button. Default false. The /projects/{id}/activity feed answers either way.
  - `myRole` 'owner' | 'admin' | 'member': Caller's role in the project's *workspace* (distinct from myBoardRole).
  - `visibility` 'private' | 'workspace': `private` (default): only users with an explicit grant (plus workspace owners/admins) see the board. `workspace`: every workspace member is an implicit contributor.
  - `myBoardRole` 'admin' | 'contributor': Caller's effective role on the board. Workspace owners and admins are always `admin`; explicit grants resolve to `admin` or `contributor`; on a `workspace`-visibility board, plain workspace members default to `contributor`.
  - `canUploadAttachments` boolean: Whether cards on this board accept file attachments. Reflects the board's *workspace* plan (Pro), NOT the caller's own plan - so a Free user collaborating on a Pro workspace's board sees `true`. Matches the server's upload gate; the SPA uses it to show/hide the attachment dropzone.
  - `totalCards` integer
  - `columnCounts` object
  - `workspaceName` string: Workspace display name; populated on list responses.
  - `members` ProjectMemberPreview[]: Capped avatar-stack preview on list responses only.
    - `id` string, uuid, required
    - `name` string, required
    - `avatarUrl` string, required: Empty when no upload; otherwise /api/v1/users/{id}/avatar
  - `columns` Column[]
    - `id` string, uuid, required
    - `key` string, required: Stable identifier for cards.column
    - `title` string, required
    - `color` string: Optional palette token; empty for default
    - `position` number, required
    - `isDone` boolean
    - `cardLimit` integer, nullable
  - `createdAt` string, date-time, required
  - `updatedAt` string, date-time, required

## Other responses

- `400`: Same cases as `POST /imports/preview`, and a CSV with no `title` mapping, sent or guessed ("Map a column to the card title")
- `401`: Missing or invalid token
- `402`: Plan limit reached (board cap). Same body as `POST /projects`.
- `413`: The file is over 5 MB
- `422`: Over a limit (same cases as `POST /imports/preview`), or no cards and no columns to import
- `503`: Too many imports are running and none finished within 15 seconds ("Too many imports are running. Try again in a moment"). Retry after the `Retry-After` delay.

---

[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)
