Build a board by pasting JSON
Create a Kanban board, its columns, and every card in them in one step by pasting a JSON document.
Typing a plan into a board one card at a time is slow, and most plans already exist somewhere else — in a document, in a brief, or in a conversation with an assistant. Importing takes the whole thing at once: paste a JSON document describing the columns and the cards in them, and the board is built.
There are two ways in:
- On Create board, under Paste JSON, the document builds a new board.
- On a board you already have, Import JSON in the top bar adds the document's columns and cards to it. A column whose name matches one already on the board takes the new cards; a column that isn't there is created.
Use Copy the prompt in either import box to get this format plus the instructions an assistant needs, then describe what you want and paste back what it gives you.
Neither way replaces anything. There is no "replace this board": a board is live from the moment it exists, and other people's comments, votes and card history have nowhere to go if the contents are swapped underneath them. Adding can only ever leave cards to delete. To try a different version of a whole board, import it as a second board.
When adding to a board, name, description and externalAccess are ignored
— the board already has all three, and they are changed in its settings.
The whole document is checked before anything is saved. If any part of it does not fit the format below, no board is created and the problem is reported with the exact field that caused it.
The document
{
"name": "Q3 launch",
"description": "Everything that has to happen before the launch.",
"externalAccess": "team",
"columns": []
}
| Field | Type | Notes |
|---|---|---|
name |
string, required | The board's name, 2 to 100 characters, unique within its team. |
description |
string, optional | Up to 500 characters. |
externalAccess |
string, optional | team (default), view, or suggest. See below. |
columns |
array, required | At least one column, up to 19. |
externalAccess controls who outside the team can reach the board:
team— only the team.view— any signed-in Magpie account can look at it.suggest— any signed-in Magpie account can look at it and propose cards, which arrive in the board's Inbox column for someone on the team to triage.
You can change all three from the board's settings afterwards.
Columns
{ "name": "In progress", "cards": [] }
name(string, required): 1 to 100 characters.cards(array, optional): the cards in this column, top to bottom. Leave it out, or use[], for an empty column.
Columns appear left to right in the order they are listed. Every board also
gets a fixed Inbox column, which is where suggestions from outside the team
land; do not include it in columns.
A board holds up to 500 cards in total, across all its columns.
Cards
{
"title": "Write the launch note",
"description": "Two paragraphs, plus the pricing table.",
"dueDate": "2026-10-14",
"color": "#d04838"
}
| Field | Type | Notes |
|---|---|---|
title |
string, required | 1 to 300 characters. |
description |
string, optional | Markdown, up to 20,000 characters. Newlines are kept. |
dueDate |
string, optional | A date written as YYYY-MM-DD. |
color |
string, optional | A hex colour such as #d04838, used as the card's stripe. |
Cards are created unassigned. Assign them on the board afterwards — a person has to be a member of the team before a card can be theirs, which an imported document has no way to check.
A complete example
{
"name": "Website relaunch",
"description": "Cut-off for copy is the end of September.",
"externalAccess": "team",
"columns": [
{
"name": "Backlog",
"cards": [
{ "title": "Audit the old pages", "description": "List every page and mark keep, merge or drop." },
{ "title": "Pick the launch date", "dueDate": "2026-09-30" }
]
},
{
"name": "In progress",
"cards": [
{ "title": "Rewrite the home page", "description": "Lead with what the product does.", "color": "#d04838" }
]
},
{ "name": "Review", "cards": [] },
{ "name": "Done", "cards": [] }
]
}
If an import is rejected for a reason you can't work out, Contact support.