Board columns and cards
A board is cards in columns. Cards carry a description, an assignee, a due date and an estimate; columns carry a WIP limit and which one finishes.
Every call here carries Authorization: Bearer <key> and
answers JSON. What is true of every call,
and what every refusal means.
GET
/api/v1/w/:workspace_id/notes/:note_id/columns
A board's columns, with their cards nested inside them.
- needs
- read on the thing it touches
- answers
columns, each withcards.- refusals
- unauthorized, not_found
| Parameter | In | Type | Description |
|---|---|---|---|
text
|
query | boolean |
An example
curl -X GET https://goscribi.com/api/v1/w/1077/notes/963/columns \
-H "Authorization: Bearer $GO_SCRIBI_KEY"
Answers 200:
{
"columns": [
{
"id": 322,
"name": "Todo",
"position": 1,
"wip_limit": null,
"finishes": false,
"cards": [
{
"id": 138,
"content": "Survey the dock",
"note": null,
"assignee": null,
"due_on": null,
"estimate": null,
"colour": null,
"archived_at": null,
"completed_at": null,
"repeats": null,
"position": 1
}
]
}
]
}
POST
/api/v1/w/:workspace_id/notes/:note_id/columns
Add a column.
- needs
- write on the thing it touches
- answers
- **201**, and the whole note.
- refusals
- unauthorized, not_found, forbidden, read_only_key, workspace_locked, invalid
| Parameter | In | Type | Description |
|---|---|---|---|
name
required
|
body | string | |
after_id
|
body | integer | |
colour
|
body | string | |
wip_limit
|
body | integer | More than nought. |
finishes
|
body | boolean | The column that means done. Setting it clears it on every other. |
An example
curl -X POST https://goscribi.com/api/v1/w/1046/notes/892/columns \
-H "Authorization: Bearer $GO_SCRIBI_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Blocked"
}'
Answers 201:
{
"note": {
"id": 892,
"title": "Work",
"type": "board",
"folder": null,
"diary_date": null,
"subject": null,
"created_at": "2026-09-23T00:30:16Z",
"updated_at": "2026-09-23T00:30:16Z",
"lock_version": 1,
"url": "https://goscribi.com/w/1046/notes/892"
},
"columns": [
{
"id": 332,
"name": "Blocked",
"position": 1,
"wip_limit": null,
"finishes": false,
"cards": []
}
]
}
PATCH
PUT
/api/v1/w/:workspace_id/notes/:note_id/columns/:id
Rename a column, move it, or change what it means.
- needs
- write on the thing it touches
- answers
- The whole note.
- refusals
- unauthorized, not_found, forbidden, read_only_key, workspace_locked, invalid
| Parameter | In | Type | Description |
|---|---|---|---|
name
|
body | string | |
colour
|
body | string | |
wip_limit
|
body | integer | |
finishes
|
body | boolean | |
position
|
body | integer |
An example
curl -X PATCH https://goscribi.com/api/v1/w/1075/notes/1062/columns/345 \
-H "Authorization: Bearer $GO_SCRIBI_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Doing",
"wip_limit": 3,
"finishes": true
}'
Answers 200:
{
"note": {
"id": 1062,
"title": "Work",
"type": "board",
"folder": null,
"diary_date": null,
"subject": null,
"created_at": "2026-09-23T00:30:16Z",
"updated_at": "2026-09-23T00:30:16Z",
"lock_version": 1,
"url": "https://goscribi.com/w/1075/notes/1062"
},
"columns": [
{
"id": 345,
"name": "Doing",
"position": 1,
"wip_limit": 3,
"finishes": true,
"cards": []
}
]
}
DELETE
/api/v1/w/:workspace_id/notes/:note_id/columns/:id
Remove an empty column.
- needs
- write on the thing it touches
- answers
- The whole note.
- refusals
- unauthorized, not_found, forbidden, read_only_key, workspace_locked, column_not_empty
Nothing is cascaded: a column holding cards is refused, with how many.
An example
curl -X DELETE https://goscribi.com/api/v1/w/11120/notes/10437/columns/3984 \
-H "Authorization: Bearer $GO_SCRIBI_KEY"
Answers 200:
{
"note": {
"id": 10437,
"title": "Work",
"type": "board",
"folder": null,
"diary_date": null,
"subject": null,
"created_at": "2026-09-16T01:10:31Z",
"updated_at": "2026-09-16T01:10:31Z",
"lock_version": 2,
"url": "https://goscribi.com/w/11120/notes/10437"
},
"columns": []
}
GET
/api/v1/w/:workspace_id/notes/:note_id/cards
Every card on a board, flat, each saying which column it is in.
- needs
- read on the thing it touches
- answers
cards, each with itscolumn_id.- refusals
- unauthorized, not_found
| Parameter | In | Type | Description |
|---|---|---|---|
archived
|
query | string | Only the exact string no leaves archived cards out. |
text
|
query | boolean |
Archived cards come back by default — a board's archive is where finished work goes, not where deleted work goes.
An example
curl -X GET https://goscribi.com/api/v1/w/1079/notes/944/cards \
-H "Authorization: Bearer $GO_SCRIBI_KEY"
Answers 200:
{
"cards": [
{
"id": 162,
"content": "Live one",
"note": null,
"assignee": null,
"due_on": null,
"estimate": null,
"colour": null,
"archived_at": null,
"completed_at": null,
"repeats": null,
"position": 1,
"column_id": 401
},
{
"id": 163,
"content": "Old one",
"note": null,
"assignee": null,
"due_on": null,
"estimate": null,
"colour": null,
"archived_at": "2026-09-23T00:30:16Z",
"completed_at": null,
"repeats": null,
"position": 1,
"column_id": 401
}
]
}
POST
/api/v1/w/:workspace_id/notes/:note_id/cards
Add a card to a column.
- needs
- write on the thing it touches
- answers
- **201**, and the whole note.
- refusals
- unauthorized, not_found, forbidden, read_only_key, workspace_locked, invalid
| Parameter | In | Type | Description |
|---|---|---|---|
column_id
required
|
body | integer | A column of this board. One from another board is a 404. |
content
|
body | string | The card's own line. |
annotation
|
body | string | Its description, in Markdown. |
colour
|
body | string | One of the six the interface offers. |
assignee_id
|
body | integer | A member of this workspace. Anybody else is a 404, not a quiet miss. |
due_on
|
body | date | YYYY-MM-DD. |
estimate
|
body | integer | Nought to 9,999, or null. |
after_id
|
body | integer | |
position
|
body | integer |
An example
curl -X POST https://goscribi.com/api/v1/w/1076/notes/1064/cards \
-H "Authorization: Bearer $GO_SCRIBI_KEY" \
-H "Content-Type: application/json" \
-d '{
"column_id": 346,
"content": "Survey the dock"
}'
Answers 201:
{
"note": {
"id": 1064,
"title": "Work",
"type": "board",
"folder": null,
"diary_date": null,
"subject": null,
"created_at": "2026-09-23T00:30:16Z",
"updated_at": "2026-09-23T00:30:16Z",
"lock_version": 2,
"url": "https://goscribi.com/w/1076/notes/1064"
},
"columns": [
{
"id": 346,
"name": "To do",
"position": 1,
"wip_limit": null,
"finishes": false,
"cards": [
{
"id": 145,
"content": "Survey the dock",
"note": null,
"assignee": null,
"due_on": null,
"estimate": null,
"colour": null,
"archived_at": null,
"completed_at": null,
"repeats": null,
"position": 1
}
]
},
{
"id": 347,
"name": "Doing",
"position": 2,
"wip_limit": null,
"finishes": false,
"cards": []
},
{
"id": 348,
"name": "Done",
"position": 3,
"wip_limit": null,
"finishes": true,
"cards": []
}
]
}
PATCH
PUT
/api/v1/w/:workspace_id/notes/:note_id/cards/:id
Change a card, move it to another column, or archive it.
- needs
- write on the thing it touches
- answers
- The whole note.
- refusals
- unauthorized, not_found, forbidden, read_only_key, workspace_locked, invalid
| Parameter | In | Type | Description |
|---|---|---|---|
content
|
body | string | The card's own line. |
annotation
|
body | string | Its description, in Markdown. |
colour
|
body | string | One of the six the interface offers. |
assignee_id
|
body | integer | A member of this workspace. Anybody else is a 404, not a quiet miss. |
due_on
|
body | date | YYYY-MM-DD. |
estimate
|
body | integer | Nought to 9,999, or null. |
column_id
|
body | integer | Moves it, and records who moved it. |
position
|
body | integer | |
archived
|
body | boolean | Archiving keeps its column, so it can come back. |
Moving a card into the column that finishes stamps it completed.
An example
curl -X PATCH https://goscribi.com/api/v1/w/1076/notes/1064/cards/145 \
-H "Authorization: Bearer $GO_SCRIBI_KEY" \
-H "Content-Type: application/json" \
-d '{
"column_id": 347,
"position": 0,
"assignee_id": 1072,
"estimate": 3
}'
Answers 200:
{
"note": {
"id": 1064,
"title": "Work",
"type": "board",
"folder": null,
"diary_date": null,
"subject": null,
"created_at": "2026-09-23T00:30:16Z",
"updated_at": "2026-09-23T00:30:16Z",
"lock_version": 3,
"url": "https://goscribi.com/w/1076/notes/1064"
},
"columns": [
{
"id": 346,
"name": "To do",
"position": 1,
"wip_limit": null,
"finishes": false,
"cards": []
},
{
"id": 347,
"name": "Doing",
"position": 2,
"wip_limit": null,
"finishes": false,
"cards": [
{
"id": 145,
"content": "Survey the dock",
"note": null,
"assignee": {
"id": 1072,
"name": "somebody@example.org",
"kind": "person"
},
"due_on": null,
"estimate": 3,
"colour": null,
"archived_at": null,
"completed_at": null,
"repeats": null,
"position": 1
}
]
},
{
"id": 348,
"name": "Done",
"position": 3,
"wip_limit": null,
"finishes": true,
"cards": []
}
]
}
DELETE
/api/v1/w/:workspace_id/notes/:note_id/cards/:id
Remove a card.
- needs
- write on the thing it touches
- answers
- The whole note.
- refusals
- unauthorized, not_found, forbidden, read_only_key, workspace_locked
An example
curl -X DELETE https://goscribi.com/api/v1/w/1076/notes/1064/cards/145 \
-H "Authorization: Bearer $GO_SCRIBI_KEY"
Answers 200:
{
"note": {
"id": 1064,
"title": "Work",
"type": "board",
"folder": null,
"diary_date": null,
"subject": null,
"created_at": "2026-09-23T00:30:16Z",
"updated_at": "2026-09-23T00:30:16Z",
"lock_version": 5,
"url": "https://goscribi.com/w/1076/notes/1064"
},
"columns": [
{
"id": 346,
"name": "To do",
"position": 1,
"wip_limit": null,
"finishes": false,
"cards": []
},
{
"id": 347,
"name": "Doing",
"position": 2,
"wip_limit": null,
"finishes": false,
"cards": []
},
{
"id": 348,
"name": "Done",
"position": 3,
"wip_limit": null,
"finishes": true,
"cards": []
}
]
}