Menu

Calendar

Appointments, including repeating ones.

List appointments in a time range#

GET/workspaces/{workspaceId}/eventsscope calendar:readMCP list_events

Every appointment that overlaps [from, to], with repeating series expanded into single occurrences, sorted by start. Default range: today and the next 30 days; at most 366 days and 1000 occurrences.

Path#

FieldTypeDescription
workspaceIdstringWorkspace id (from list_workspaces).

Query#

FieldTypeDescription
fromstringISO 8601 or YYYY-MM-DD (default: start of today, Berlin).
tostringISO 8601 or YYYY-MM-DD; a plain date includes that whole day (default: from + 30 days).

Request#

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

Response 200#

FieldTypeDescription
dataarray of Occurrence
data[].eventIdstring
data[].titlestring
data[].allDayboolean
data[].startstring
data[].endstring
data[].locationstring
data[].notesstring
data[].attendeeIdsarray of string
data[].recurringboolean
data[].readOnlyboolean
truncatedboolean
JSON
{
  "data": [
    {
      "eventId": "Ev7Kp2Lq9X",
      "title": "Elternabend 3b",
      "allDay": false,
      "start": "2026-11-20T19:30:00+01:00",
      "end": "2026-11-20T21:00:00+01:00",
      "location": "Grundschule Am Park",
      "notes": "",
      "attendeeIds": [
        "string"
      ],
      "recurring": false,
      "readOnly": false
    }
  ],
  "truncated": false
}

Create an appointment#

POST/workspaces/{workspaceId}/eventsscope calendar:writeMCP create_event

Creates an appointment, optionally repeating. Attendees get the usual push notification; linked Google calendars sync it like one made in the app.

Path#

FieldTypeDescription
workspaceIdstringWorkspace id (from list_workspaces).

Body#

FieldTypeDescription
title (required)string
allDaybooleanDefault false.
start (required)stringTimed: ISO 8601 ("2026-11-20T19:30:00+01:00"; without offset = Berlin time). All-day: "YYYY-MM-DD".
endstringTimed: ISO 8601, after start (default start + 1 h). All-day: last day YYYY-MM-DD, inclusive (default: the start day).
locationstring
notesstring
attendeeIdsarray of stringMember ids (list_members).
recurrenceRecurrence or null
recurrence.frequency (required)daily \weekly \monthly \yearly
recurrence.intervalintegerEvery n days/weeks/months/years. Default: 1.
recurrence.untilstring or nullLast day (YYYY-MM-DD) an occurrence may start on; null or missing: forever.

Request#

Shell
curl -X POST "https://api.lifebutler.io/v1/workspaces/f8Hn3wQz0a/events" \
  -H "Authorization: Bearer $LIFEBUTLER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title": "Elternabend 3b", "start": "2026-11-20T19:30:00+01:00", "end": "2026-11-20T21:00:00+01:00"}'

Response 201#

FieldTypeDescription
idstring
titlestring
allDayboolean
startstringISO 8601, Europe/Berlin offset. First occurrence for series.
endstring
startDatestringYYYY-MM-DD (Berlin) of start.
endDatestringYYYY-MM-DD (Berlin) of end, inclusive.
locationstring
notesstring
attendeeIdsarray of stringMember ids.
recurrenceRecurrence or null
recurrence.frequencydaily \weekly \monthly \yearly
recurrence.intervalintegerEvery n days/weeks/months/years. Default: 1.
recurrence.untilstring or nullLast day (YYYY-MM-DD) an occurrence may start on; null or missing: forever.
sourcelifebutler \google \sharedgoogle: comes from a member's linked Google calendar; shared: a read-only copy shared from another workspace.
readOnlyboolean
createdBystring or null
createdAtstring or null
JSON
{
  "id": "Ab3Cd5Ef7G",
  "title": "Elternabend 3b",
  "allDay": false,
  "start": "2026-11-20T19:30:00+01:00",
  "end": "2026-11-20T21:00:00+01:00",
  "startDate": "2026-11-20",
  "endDate": "2026-11-20",
  "location": "Grundschule Am Park",
  "notes": "",
  "attendeeIds": [
    "string"
  ],
  "recurrence": {
    "frequency": "daily",
    "interval": 1,
    "until": "2026-11-20"
  },
  "source": "lifebutler",
  "readOnly": false,
  "createdBy": "string",
  "createdAt": "2026-11-20T19:30:00+01:00"
}

Get an appointment#

GET/workspaces/{workspaceId}/events/{eventId}scope calendar:readMCP get_event

One appointment; for a series the series itself with its recurrence.

Path#

FieldTypeDescription
workspaceIdstringWorkspace id (from list_workspaces).
eventIdstring

Request#

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

Response 200#

FieldTypeDescription
idstring
titlestring
allDayboolean
startstringISO 8601, Europe/Berlin offset. First occurrence for series.
endstring
startDatestringYYYY-MM-DD (Berlin) of start.
endDatestringYYYY-MM-DD (Berlin) of end, inclusive.
locationstring
notesstring
attendeeIdsarray of stringMember ids.
recurrenceRecurrence or null
recurrence.frequencydaily \weekly \monthly \yearly
recurrence.intervalintegerEvery n days/weeks/months/years. Default: 1.
recurrence.untilstring or nullLast day (YYYY-MM-DD) an occurrence may start on; null or missing: forever.
sourcelifebutler \google \sharedgoogle: comes from a member's linked Google calendar; shared: a read-only copy shared from another workspace.
readOnlyboolean
createdBystring or null
createdAtstring or null
JSON
{
  "id": "Ab3Cd5Ef7G",
  "title": "Elternabend 3b",
  "allDay": false,
  "start": "2026-11-20T19:30:00+01:00",
  "end": "2026-11-20T21:00:00+01:00",
  "startDate": "2026-11-20",
  "endDate": "2026-11-20",
  "location": "Grundschule Am Park",
  "notes": "",
  "attendeeIds": [
    "string"
  ],
  "recurrence": {
    "frequency": "daily",
    "interval": 1,
    "until": "2026-11-20"
  },
  "source": "lifebutler",
  "readOnly": false,
  "createdBy": "string",
  "createdAt": "2026-11-20T19:30:00+01:00"
}

Change an appointment#

PATCH/workspaces/{workspaceId}/events/{eventId}scope calendar:writeMCP update_event

Changes only the fields you send. For a series this changes the whole series. Send recurrence: null to stop repeating. Read-only copies (source shared) answer 409.

Path#

FieldTypeDescription
workspaceIdstringWorkspace id (from list_workspaces).
eventIdstring

Body#

FieldTypeDescription
titlestring
allDaybooleanDefault false.
startstringTimed: ISO 8601 ("2026-11-20T19:30:00+01:00"; without offset = Berlin time). All-day: "YYYY-MM-DD".
endstringTimed: ISO 8601, after start (default start + 1 h). All-day: last day YYYY-MM-DD, inclusive (default: the start day).
locationstring
notesstring
attendeeIdsarray of stringMember ids (list_members).
recurrenceRecurrence or null
recurrence.frequency (required)daily \weekly \monthly \yearly
recurrence.intervalintegerEvery n days/weeks/months/years. Default: 1.
recurrence.untilstring or nullLast day (YYYY-MM-DD) an occurrence may start on; null or missing: forever.

Request#

Shell
curl -X PATCH "https://api.lifebutler.io/v1/workspaces/f8Hn3wQz0a/events/Ev7Kp2Lq9X" \
  -H "Authorization: Bearer $LIFEBUTLER_KEY" \
  -H "Content-Type: application/json" \
  -d '{"end": "2026-11-20T21:00:00+01:00"}'

Response 200#

FieldTypeDescription
idstring
titlestring
allDayboolean
startstringISO 8601, Europe/Berlin offset. First occurrence for series.
endstring
startDatestringYYYY-MM-DD (Berlin) of start.
endDatestringYYYY-MM-DD (Berlin) of end, inclusive.
locationstring
notesstring
attendeeIdsarray of stringMember ids.
recurrenceRecurrence or null
recurrence.frequencydaily \weekly \monthly \yearly
recurrence.intervalintegerEvery n days/weeks/months/years. Default: 1.
recurrence.untilstring or nullLast day (YYYY-MM-DD) an occurrence may start on; null or missing: forever.
sourcelifebutler \google \sharedgoogle: comes from a member's linked Google calendar; shared: a read-only copy shared from another workspace.
readOnlyboolean
createdBystring or null
createdAtstring or null
JSON
{
  "id": "Ab3Cd5Ef7G",
  "title": "Elternabend 3b",
  "allDay": false,
  "start": "2026-11-20T19:30:00+01:00",
  "end": "2026-11-20T21:00:00+01:00",
  "startDate": "2026-11-20",
  "endDate": "2026-11-20",
  "location": "Grundschule Am Park",
  "notes": "",
  "attendeeIds": [
    "string"
  ],
  "recurrence": {
    "frequency": "daily",
    "interval": 1,
    "until": "2026-11-20"
  },
  "source": "lifebutler",
  "readOnly": false,
  "createdBy": "string",
  "createdAt": "2026-11-20T19:30:00+01:00"
}

Delete an appointment#

DELETE/workspaces/{workspaceId}/events/{eventId}scope calendar:writeMCP delete_event

Deletes the appointment (for a series: all of it). Read-only copies answer 409.

Path#

FieldTypeDescription
workspaceIdstringWorkspace id (from list_workspaces).
eventIdstring

Request#

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

Response 200#

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