Navigation

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:

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.

Next