Zum Inhalt springen
Zur App

Kalender

Öffnen in ChatGPT

Ein Kalender ist ein Abo-Kalender mit eigenem Feed, eigener Abo-Seite und eigenem Button. Viele Websites brauchen genau einen; du kannst aber auch einen pro Kategorie oder Ort anlegen.

FeldTypRegelnStandard
nameStringPflicht beim Anlegen, 1 bis 100 Zeichen
timezoneStringPflicht beim Anlegen, IANA-Name wie Europe/Berlin
descriptionString oder nullbis 1.000 Zeichennull
site_urlString oder nullhttps://-URL, bis 2.000 Zeichennull
languagede oder enSprache der Abo-Seiteen
default_durationStringISO-8601-Dauer bis PT24H, z. B. PT1H, PT90M, PT1H30M. Gilt für Termine ohne end.PT1H
brand_colorString oder nullHex-Farbe #rrggbb, wird kleingeschrieben gespeichertnull
organizerObjekt oder nullname (Pflicht, bis 100 Zeichen), url (https://, optional), email (optional). Öffentlich auf der Abo-Seite.null
show_eventsBooleanKommende Termine auf der Abo-Seite zeigentrue

Unbekannte Felder werden mit 400 invalid_request abgelehnt.

Terminal-Fenster
curl https://api.kalender-sync.de/v1/publisher/calendars \
-H "Authorization: Bearer $KS_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 3b0f6a52-6a1e-4c55-9d1b-0a7f2c9e1d44" \
-d '{
"name": "Riverside Yoga",
"timezone": "Europe/Berlin",
"language": "de",
"site_url": "https://example.org",
"default_duration": "PT1H",
"brand_color": "#0f766e",
"organizer": { "name": "Riverside Yoga e.V.", "url": "https://example.org", "email": "info@example.org" },
"show_events": true
}'

Antwort 201 Created mit dem vollständigen Kalender (siehe unten). Der Modus (live oder test) ergibt sich aus dem Key.

Mit Idempotency-Key legt eine Wiederholung nach einem Netzwerkfehler keinen zweiten Kalender an. → Idempotenz

Mögliche Fehler: calendar_limit_reached (Limit deines Tarifs bzw. 3 Testkalender), plan_required (Live-Kalender im Free-Tarif), insufficient_scope (Key ist auf bestimmte Kalender beschränkt).

Alle Kalender-Endpunkte liefern dieselbe Form:

{
"id": "cal_XXXXXXXXXXXX",
"mode": "live",
"name": "Riverside Yoga",
"description": null,
"timezone": "Europe/Berlin",
"site_url": "https://example.org/",
"language": "de",
"default_duration": "PT1H",
"brand_color": "#0f766e",
"organizer": { "name": "Riverside Yoga e.V.", "url": "https://example.org/", "email": "info@example.org" },
"show_events": true,
"blocked": false,
"logo_url": null,
"banner_url": null,
"subscribe_page_url": "https://app.kalender-sync.de/subscribe/cal_XXXXXXXXXXXX",
"feed_url": "https://feeds.kalender-sync.de/f_….ics",
"subscribe_links": {
"google": "https://calendar.google.com/calendar/r?cid=webcal%3A%2F%2Ffeeds.kalender-sync.de%2Ff_….ics",
"outlook": "https://outlook.live.com/calendar/0/addfromweb?url=…&name=Riverside%20Yoga",
"office365": "https://outlook.office.com/calendar/0/addfromweb?url=…&name=Riverside%20Yoga",
"apple": "webcal://feeds.kalender-sync.de/f_….ics"
},
"event_count": 0,
"created_at": "2026-11-03T14:02:11.000Z",
"updated_at": "2026-11-03T14:02:11.000Z"
}
FeldBedeutung
subscribe_page_urlDie gehostete Abo-Seite. Am besten verlinkst du diese oder baust den Button ein.
feed_urlDer allgemeine ICS-Feed. Er ändert sich nie, solange der Kalender besteht.
subscribe_linksDirekte Abo-Links je App. Funktionieren, werden aber in der Statistik nicht gezählt. Abo-Seite und Button zählen.
logo_url, banner_urlÖffentliche Bild-URLs oder null. → Bilder
event_countAnzahl gespeicherter Termine; eine Serie zählt als einer.
blockedtrue, wenn wir den Kalender wegen eines Verstoßes gegen unsere Bedingungen gesperrt haben. → calendar_blocked

URLs speichern wir in normalisierter Form, daher kann zum Beispiel ein abschließender Schrägstrich dazukommen.

Terminal-Fenster
curl https://api.kalender-sync.de/v1/publisher/calendars -H "Authorization: Bearer $KS_KEY"
curl https://api.kalender-sync.de/v1/publisher/calendars/$KS_CAL -H "Authorization: Bearer $KS_KEY"

Die Liste steht unter data, sortiert nach Anlagedatum, und enthält nur Kalender im Modus des Keys.

PATCH ändert nur die Felder, die du mitschickst. null leert ein Feld, das null erlaubt (zum Beispiel "organizer": null).

Terminal-Fenster
curl -X PATCH https://api.kalender-sync.de/v1/publisher/calendars/$KS_CAL \
-H "Authorization: Bearer $KS_KEY" \
-H "Content-Type: application/json" \
-d '{ "description": "Kurse, Workshops und Retreats.", "show_events": false }'

organizer wird immer als Ganzes ersetzt: Schickst du nur name, sind url und email danach leer.

Ändert sich die timezone eines Kalenders, gilt die neue Zone für alle Termine, die ohne eigene timezone gespeichert wurden, ab dem nächsten Schreiben dieser Termine.

Terminal-Fenster
curl -X DELETE https://api.kalender-sync.de/v1/publisher/calendars/$KS_CAL -H "Authorization: Bearer $KS_KEY"

Antwort 204 No Content. Die Termine werden dabei gelöscht. Damit sie auch bei bestehenden Abonnenten verschwinden, liefert der Feed noch 30 Tage einen leeren Kalender mit einem Hinweis und danach 410 Gone. Die Abo-Seite ist ab dann nicht mehr erreichbar.