Spaces & Lists
Workspaces are organized as spaces → folders → lists → tasks. The API exposes full read access and create/update on spaces and lists. Folders and privacy toggles are UI-only.
GET /spaces
List non-private spaces with their lists. Use this to discover where to put new tasks/lists.
{
"spaces": [
{
"id": "...", "name": "Engineering",
"color": "#0d6efd", "icon": "fa-solid fa-cube",
"lists": [
{ "id": "...", "name": "Bugs", "folder_id": null, "color": null, "icon": null },
{ "id": "...", "name": "Features", "folder_id": null, "color": null, "icon": null }
]
}
]
}
Private spaces are not exposed via the API in v1.
POST /spaces
Create a new space. Auto-creates the default 5 statuses (Open, In Progress, Complete, Completed, Cancelled) and a default list called "Tasks" so the space is immediately usable.
curl -H "Authorization: Bearer kdt_..." -H "Content-Type: application/json" \
-d '{"name":"New Client","color":"#7c3aed","icon":"fa-solid fa-briefcase"}' \
https://api.konduit.work/v1/spaces
Response:
{
"id": "...", "name": "New Client",
"color": "#7c3aed", "icon": "fa-solid fa-briefcase",
"default_list_id": "..."
}
Plan-limited (spaces resource). Returns 403 limitReached when the workspace has hit its space cap.
PATCH /spaces/{spaceId}
Update a space's name, color, or icon. Privacy toggling are NOT exposed in v1 — making a space private requires per-user access grants which can't be expressed through API key auth. Use the in-app UI.
POST /spaces/{spaceId}/lists
Create a list under a space. Plan-limited (lists resource).
curl -H "Authorization: Bearer kdt_..." -H "Content-Type: application/json" \
-d '{"name":"Q2 Campaigns","color":"#10b981"}' \
https://api.konduit.work/v1/spaces/<spaceId>/lists
Returns { id, name, color, icon, space_id } with status 201.
GET /lists
Lists all non-private lists in the workspace, regardless of space.
{
"lists": [
{ "id": "...", "name": "Bug Reports",
"space_id": "...", "space_name": "Engineering" }
]
}
Useful when you know the list name but not which space it lives under.
GET /lists/{listId}/schema
Returns the statuses + custom fields for a list.
{
"statuses": [
{ "id": "...", "name": "Open", "color": "#3b82f6", "type": "active" },
{ "id": "...", "name": "Closed", "color": "#10b981", "type": "done" }
],
"fields": [
{ "id": "...", "name": "Severity", "type": "dropdown",
"options": [{ "id": "opt_high", "label": "High", "color": "#ef4444" }] },
{ "id": "...", "name": "Customer", "type": "datatable",
"mode": "select", "single": true, "table_id": "tbl_customers",
"display_columns": ["col_name"], "readonly": false },
{ "id": "...", "name": "Time Entries", "type": "datatable",
"mode": "items", "table_id": "tbl_time_logs",
"task_link_column": "col_task",
"visible_columns": ["col_date","col_hours"],
"readonly": true }
]
}
Datatable-link field modes
type: datatable fields come in two modes:
mode: "select"— task.custom_data stores[row_id_1, row_id_2, ...]fromtable_id. Writable viaPATCH /tasks/{id}(readonly: false). Resolve labels viaGET /datatables/{table_id}/rows/{rowId}.mode: "items"— entries are rows in the linked datatable back-referenced viatask_link_column. Read-only on the task (readonly: true); manage entries viaGET/POST/PATCH/DELETE /datatables/{table_id}/rowsfiltered by the task ID intask_link_column.
PATCH /lists/{listId}
Update a list's name, color, or icon. Same privacy caveat as spaces — privacy is UI-only.
DELETE on spaces and lists
DELETE on spaces and lists is intentionally NOT exposed. They cascade-delete tasks, which is too risky to expose programmatically without a UI confirmation flow. Delete via the in-app UI.