Menu

Tasks

To-dos with exact or fuzzy due dates, assignees and repetition.

List tasks#

GET/workspaces/{workspaceId}/tasksscope tasks:readMCP list_tasks

Open tasks by default, sorted by due date (tasks without a date last).

Path#

FieldTypeDescription
workspaceIdstringWorkspace id (from list_workspaces).

Query#

FieldTypeDescription
statusopen \done \allDefault: "open".
assigneeIdstringOnly tasks assigned to this member.
limitintegerDefault: 200.

Request#

Shell
curl "https://api.lifebutler.io/v1/workspaces/f8Hn3wQz0a/tasks" \
  -H "Authorization: Bearer $LIFEBUTLER_KEY"

Response 200#

FieldTypeDescription
dataarray of Task
data[].idstring
data[].titlestring
data[].notesstring
data[].assigneeIdsarray of string
data[].dueKindnone \date \month \quarter \year \somedaynone, date (exact day), month, quarter, year or someday.
data[].dueDatestring or nullYYYY-MM-DD: the day, or the first day of the month/quarter/year.
data[].timestring or nullHH:MM (Berlin) with a push reminder; only for dueKind date.
data[].recurrenceTaskRecurrence or null
data[].recurrence.frequencydaily \weekly \monthly \yearly
data[].recurrence.intervalintegerDefault: 1.
data[].recurrence.afterCompletionbooleanCount the next due date from the day it was done (e.g. change the water filter 60 days after the last change). Default: false.
data[].doneboolean
data[].doneAtstring or null
data[].doneBystring or null
data[].createdBystring or null
data[].createdAtstring or null
truncatedboolean
JSON
{
  "data": [
    {
      "id": "Ab3Cd5Ef7G",
      "title": "Elternabend 3b",
      "notes": "",
      "assigneeIds": [
        "string"
      ],
      "dueKind": "none",
      "dueDate": "2026-11-20",
      "time": "18:00",
      "recurrence": {
        "frequency": "daily",
        "interval": 1,
        "afterCompletion": false
      },
      "done": false,
      "doneAt": "2026-11-20T19:30:00+01:00",
      "doneBy": "string",
      "createdBy": "string",
      "createdAt": "2026-11-20T19:30:00+01:00"
    }
  ],
  "truncated": false
}

Create a task#

POST/workspaces/{workspaceId}/tasksscope tasks:writeMCP create_task

A to-do with an optional exact or fuzzy due date (this month, this quarter, someday …), assignees and repetition.

Path#

FieldTypeDescription
workspaceIdstringWorkspace id (from list_workspaces).

Body#

FieldTypeDescription
title (required)string
notesstring
assigneeIdsarray of stringMember ids (list_members).
dueKindnone \date \month \quarter \year \somedayDefault: date when dueDate is given, else none.
dueDatestring or nullYYYY-MM-DD; for month/quarter/year any day inside the period.
timestring or nullHH:MM (Berlin), only with dueKind date: push reminder at that time.
recurrenceTaskRecurrence or nullNeeds a due date.
recurrence.frequency (required)daily \weekly \monthly \yearly
recurrence.interval (required)integerDefault: 1.
recurrence.afterCompletion (required)booleanCount the next due date from the day it was done (e.g. change the water filter 60 days after the last change). Default: false.

Request#

Shell
curl -X POST "https://api.lifebutler.io/v1/workspaces/f8Hn3wQz0a/tasks" \
  -H "Authorization: Bearer $LIFEBUTLER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title": "Elternabend 3b"}'

Response 201#

FieldTypeDescription
idstring
titlestring
notesstring
assigneeIdsarray of string
dueKindnone \date \month \quarter \year \somedaynone, date (exact day), month, quarter, year or someday.
dueDatestring or nullYYYY-MM-DD: the day, or the first day of the month/quarter/year.
timestring or nullHH:MM (Berlin) with a push reminder; only for dueKind date.
recurrenceTaskRecurrence or null
recurrence.frequencydaily \weekly \monthly \yearly
recurrence.intervalintegerDefault: 1.
recurrence.afterCompletionbooleanCount the next due date from the day it was done (e.g. change the water filter 60 days after the last change). Default: false.
doneboolean
doneAtstring or null
doneBystring or null
createdBystring or null
createdAtstring or null
JSON
{
  "id": "Ab3Cd5Ef7G",
  "title": "Elternabend 3b",
  "notes": "",
  "assigneeIds": [
    "string"
  ],
  "dueKind": "none",
  "dueDate": "2026-11-20",
  "time": "18:00",
  "recurrence": {
    "frequency": "daily",
    "interval": 1,
    "afterCompletion": false
  },
  "done": false,
  "doneAt": "2026-11-20T19:30:00+01:00",
  "doneBy": "string",
  "createdBy": "string",
  "createdAt": "2026-11-20T19:30:00+01:00"
}

Get a task#

GET/workspaces/{workspaceId}/tasks/{taskId}scope tasks:readMCP get_task

One task.

Path#

FieldTypeDescription
workspaceIdstringWorkspace id (from list_workspaces).
taskIdstring

Request#

Shell
curl "https://api.lifebutler.io/v1/workspaces/f8Hn3wQz0a/tasks/Tk4Rm8Zs1C" \
  -H "Authorization: Bearer $LIFEBUTLER_KEY"

Response 200#

FieldTypeDescription
idstring
titlestring
notesstring
assigneeIdsarray of string
dueKindnone \date \month \quarter \year \somedaynone, date (exact day), month, quarter, year or someday.
dueDatestring or nullYYYY-MM-DD: the day, or the first day of the month/quarter/year.
timestring or nullHH:MM (Berlin) with a push reminder; only for dueKind date.
recurrenceTaskRecurrence or null
recurrence.frequencydaily \weekly \monthly \yearly
recurrence.intervalintegerDefault: 1.
recurrence.afterCompletionbooleanCount the next due date from the day it was done (e.g. change the water filter 60 days after the last change). Default: false.
doneboolean
doneAtstring or null
doneBystring or null
createdBystring or null
createdAtstring or null
JSON
{
  "id": "Ab3Cd5Ef7G",
  "title": "Elternabend 3b",
  "notes": "",
  "assigneeIds": [
    "string"
  ],
  "dueKind": "none",
  "dueDate": "2026-11-20",
  "time": "18:00",
  "recurrence": {
    "frequency": "daily",
    "interval": 1,
    "afterCompletion": false
  },
  "done": false,
  "doneAt": "2026-11-20T19:30:00+01:00",
  "doneBy": "string",
  "createdBy": "string",
  "createdAt": "2026-11-20T19:30:00+01:00"
}

Change a task#

PATCH/workspaces/{workspaceId}/tasks/{taskId}scope tasks:writeMCP update_task

Changes only the fields you send. Send dueKind none to remove the due date, recurrence null to stop repeating.

Path#

FieldTypeDescription
workspaceIdstringWorkspace id (from list_workspaces).
taskIdstring

Body#

FieldTypeDescription
titlestring
notesstring
assigneeIdsarray of stringMember ids (list_members).
dueKindnone \date \month \quarter \year \somedayDefault: date when dueDate is given, else none.
dueDatestring or nullYYYY-MM-DD; for month/quarter/year any day inside the period.
timestring or nullHH:MM (Berlin), only with dueKind date: push reminder at that time.
recurrenceTaskRecurrence or nullNeeds a due date.
recurrence.frequency (required)daily \weekly \monthly \yearly
recurrence.interval (required)integerDefault: 1.
recurrence.afterCompletion (required)booleanCount the next due date from the day it was done (e.g. change the water filter 60 days after the last change). Default: false.

Request#

Shell
curl -X PATCH "https://api.lifebutler.io/v1/workspaces/f8Hn3wQz0a/tasks/Tk4Rm8Zs1C" \
  -H "Authorization: Bearer $LIFEBUTLER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title": "Elternabend 3b"}'

Response 200#

FieldTypeDescription
idstring
titlestring
notesstring
assigneeIdsarray of string
dueKindnone \date \month \quarter \year \somedaynone, date (exact day), month, quarter, year or someday.
dueDatestring or nullYYYY-MM-DD: the day, or the first day of the month/quarter/year.
timestring or nullHH:MM (Berlin) with a push reminder; only for dueKind date.
recurrenceTaskRecurrence or null
recurrence.frequencydaily \weekly \monthly \yearly
recurrence.intervalintegerDefault: 1.
recurrence.afterCompletionbooleanCount the next due date from the day it was done (e.g. change the water filter 60 days after the last change). Default: false.
doneboolean
doneAtstring or null
doneBystring or null
createdBystring or null
createdAtstring or null
JSON
{
  "id": "Ab3Cd5Ef7G",
  "title": "Elternabend 3b",
  "notes": "",
  "assigneeIds": [
    "string"
  ],
  "dueKind": "none",
  "dueDate": "2026-11-20",
  "time": "18:00",
  "recurrence": {
    "frequency": "daily",
    "interval": 1,
    "afterCompletion": false
  },
  "done": false,
  "doneAt": "2026-11-20T19:30:00+01:00",
  "doneBy": "string",
  "createdBy": "string",
  "createdAt": "2026-11-20T19:30:00+01:00"
}

Delete a task#

DELETE/workspaces/{workspaceId}/tasks/{taskId}scope tasks:writeMCP delete_task

Deletes the task for everyone.

Path#

FieldTypeDescription
workspaceIdstringWorkspace id (from list_workspaces).
taskIdstring

Request#

Shell
curl -X DELETE "https://api.lifebutler.io/v1/workspaces/f8Hn3wQz0a/tasks/Tk4Rm8Zs1C" \
  -H "Authorization: Bearer $LIFEBUTLER_KEY"

Response 200#

FieldTypeDescription
idstring
deletedtrue
JSON
{
  "id": "Ab3Cd5Ef7G",
  "deleted": false
}

Complete a task#

POST/workspaces/{workspaceId}/tasks/{taskId}/completescope tasks:writeMCP complete_task

Ticks a task off, like in the app. A repeating task moves to its next due date and stays open (missed dates are skipped); when its series has ended it is done.

Path#

FieldTypeDescription
workspaceIdstringWorkspace id (from list_workspaces).
taskIdstring

Request#

Shell
curl -X POST "https://api.lifebutler.io/v1/workspaces/f8Hn3wQz0a/tasks/Tk4Rm8Zs1C/complete" \
  -H "Authorization: Bearer $LIFEBUTLER_KEY"

Response 200#

FieldTypeDescription
idstring
titlestring
notesstring
assigneeIdsarray of string
dueKindnone \date \month \quarter \year \somedaynone, date (exact day), month, quarter, year or someday.
dueDatestring or nullYYYY-MM-DD: the day, or the first day of the month/quarter/year.
timestring or nullHH:MM (Berlin) with a push reminder; only for dueKind date.
recurrenceTaskRecurrence or null
recurrence.frequencydaily \weekly \monthly \yearly
recurrence.intervalintegerDefault: 1.
recurrence.afterCompletionbooleanCount the next due date from the day it was done (e.g. change the water filter 60 days after the last change). Default: false.
doneboolean
doneAtstring or null
doneBystring or null
createdBystring or null
createdAtstring or null
JSON
{
  "id": "Ab3Cd5Ef7G",
  "title": "Elternabend 3b",
  "notes": "",
  "assigneeIds": [
    "string"
  ],
  "dueKind": "none",
  "dueDate": "2026-11-20",
  "time": "18:00",
  "recurrence": {
    "frequency": "daily",
    "interval": 1,
    "afterCompletion": false
  },
  "done": false,
  "doneAt": "2026-11-20T19:30:00+01:00",
  "doneBy": "string",
  "createdBy": "string",
  "createdAt": "2026-11-20T19:30:00+01:00"
}

Reopen a task#

POST/workspaces/{workspaceId}/tasks/{taskId}/reopenscope tasks:writeMCP reopen_task

Marks a done task as open again.

Path#

FieldTypeDescription
workspaceIdstringWorkspace id (from list_workspaces).
taskIdstring

Request#

Shell
curl -X POST "https://api.lifebutler.io/v1/workspaces/f8Hn3wQz0a/tasks/Tk4Rm8Zs1C/reopen" \
  -H "Authorization: Bearer $LIFEBUTLER_KEY"

Response 200#

FieldTypeDescription
idstring
titlestring
notesstring
assigneeIdsarray of string
dueKindnone \date \month \quarter \year \somedaynone, date (exact day), month, quarter, year or someday.
dueDatestring or nullYYYY-MM-DD: the day, or the first day of the month/quarter/year.
timestring or nullHH:MM (Berlin) with a push reminder; only for dueKind date.
recurrenceTaskRecurrence or null
recurrence.frequencydaily \weekly \monthly \yearly
recurrence.intervalintegerDefault: 1.
recurrence.afterCompletionbooleanCount the next due date from the day it was done (e.g. change the water filter 60 days after the last change). Default: false.
doneboolean
doneAtstring or null
doneBystring or null
createdBystring or null
createdAtstring or null
JSON
{
  "id": "Ab3Cd5Ef7G",
  "title": "Elternabend 3b",
  "notes": "",
  "assigneeIds": [
    "string"
  ],
  "dueKind": "none",
  "dueDate": "2026-11-20",
  "time": "18:00",
  "recurrence": {
    "frequency": "daily",
    "interval": 1,
    "afterCompletion": false
  },
  "done": false,
  "doneAt": "2026-11-20T19:30:00+01:00",
  "doneBy": "string",
  "createdBy": "string",
  "createdAt": "2026-11-20T19:30:00+01:00"
}